From 9188f52957963a7e2d418cc0e5f4ca3a1fc40188 Mon Sep 17 00:00:00 2001 From: Jon Sequeira Date: Thu, 14 Nov 2019 09:31:21 -0800 Subject: [PATCH] fix #639 --- .../FSharpKernelHelpers.fs | 3 +++ .../DefaultHtmlFormatterSet.cs | 4 +-- .../HtmlFormatter{T}.cs | 2 +- .../PlainTextFormatter{T}.cs | 2 +- .../AssertionExtensions.cs | 9 +++++++ .../Kernel/LanguageKernelRenderingTests.cs | 26 +++++++++++++++++++ .../Packaging/PackageRestoreContext.cs | 2 +- 7 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Microsoft.DotNet.Interactive.FSharp/FSharpKernelHelpers.fs b/Microsoft.DotNet.Interactive.FSharp/FSharpKernelHelpers.fs index 8da70830f..bebf5edb6 100644 --- a/Microsoft.DotNet.Interactive.FSharp/FSharpKernelHelpers.fs +++ b/Microsoft.DotNet.Interactive.FSharp/FSharpKernelHelpers.fs @@ -4,9 +4,12 @@ namespace Microsoft.DotNet.Interactive.FSharp open Microsoft.DotNet.Interactive +open Microsoft.AspNetCore.Html module FSharpKernelHelpers = let display (value: obj) = Kernel.display value + let HTML (value: string) = + HtmlString value let Javascript (content: string) = Kernel.Javascript content diff --git a/Microsoft.DotNet.Interactive.Rendering/DefaultHtmlFormatterSet.cs b/Microsoft.DotNet.Interactive.Rendering/DefaultHtmlFormatterSet.cs index a96ebfc33..307259748 100644 --- a/Microsoft.DotNet.Interactive.Rendering/DefaultHtmlFormatterSet.cs +++ b/Microsoft.DotNet.Interactive.Rendering/DefaultHtmlFormatterSet.cs @@ -72,9 +72,9 @@ private static ConcurrentDictionary DefaultFormatters() => t.WriteTo(writer, HtmlEncoder.Default); }), - [typeof(HtmlString)] = new HtmlFormatter((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)), + [typeof(HtmlString)] = new HtmlFormatter((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)), - [typeof(JsonString)] = new HtmlFormatter((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)), + [typeof(JsonString)] = new HtmlFormatter((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)), [typeof(PocketView)] = new HtmlFormatter((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)), diff --git a/Microsoft.DotNet.Interactive.Rendering/HtmlFormatter{T}.cs b/Microsoft.DotNet.Interactive.Rendering/HtmlFormatter{T}.cs index 9de4ee79f..b0fa4ae2b 100644 --- a/Microsoft.DotNet.Interactive.Rendering/HtmlFormatter{T}.cs +++ b/Microsoft.DotNet.Interactive.Rendering/HtmlFormatter{T}.cs @@ -26,7 +26,7 @@ public override void Format(T instance, TextWriter writer) _format(instance, writer); } - public override string MimeType => "text/html"; + public override string MimeType => HtmlFormatter.MimeType; public static ITypeFormatter Create(bool includeInternals = false) { diff --git a/Microsoft.DotNet.Interactive.Rendering/PlainTextFormatter{T}.cs b/Microsoft.DotNet.Interactive.Rendering/PlainTextFormatter{T}.cs index 5ad0f8514..66bc2581a 100644 --- a/Microsoft.DotNet.Interactive.Rendering/PlainTextFormatter{T}.cs +++ b/Microsoft.DotNet.Interactive.Rendering/PlainTextFormatter{T}.cs @@ -42,7 +42,7 @@ public static ITypeFormatter Create(bool includeInternals = false) return Default; } - public override string MimeType => "text/plain"; + public override string MimeType => PlainTextFormatter.MimeType; public override void Format(T instance, TextWriter writer) { diff --git a/Microsoft.DotNet.Interactive.Tests/AssertionExtensions.cs b/Microsoft.DotNet.Interactive.Tests/AssertionExtensions.cs index 2ffc89cec..a1e7109b9 100644 --- a/Microsoft.DotNet.Interactive.Tests/AssertionExtensions.cs +++ b/Microsoft.DotNet.Interactive.Tests/AssertionExtensions.cs @@ -38,5 +38,14 @@ public static AndWhichConstraint ContainSingle( return new AndWhichConstraint(subject.Should(), subject); } + + public static AndConstraint> NotContainErrors( + this GenericCollectionAssertions should) => + should + .NotContain(e => e is ErrorProduced) + .And + .NotContain(e => e is CommandParseFailure) + .And + .NotContain(e => e is CommandFailed); } } \ No newline at end of file diff --git a/WorkspaceServer.Tests/Kernel/LanguageKernelRenderingTests.cs b/WorkspaceServer.Tests/Kernel/LanguageKernelRenderingTests.cs index 5ff87aa6d..3710461b4 100644 --- a/WorkspaceServer.Tests/Kernel/LanguageKernelRenderingTests.cs +++ b/WorkspaceServer.Tests/Kernel/LanguageKernelRenderingTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System; using System.Linq; using System.Reactive.Linq; using System.Threading.Tasks; @@ -10,6 +11,7 @@ using Microsoft.DotNet.Interactive.Commands; using Microsoft.DotNet.Interactive.Events; using Microsoft.DotNet.Interactive.Rendering; +using Microsoft.DotNet.Interactive.Tests; using Pocket; using Xunit; using Xunit.Abstractions; @@ -175,6 +177,30 @@ public async Task Value_display_and_update_are_in_right_order(Language language) valueEvents.Last().Should().BeOfType(); } + [Theory] + [InlineData(Language.CSharp, "display(HTML(\"hi!\"));")] + [InlineData(Language.FSharp, "display(HTML(\"hi!\"))")] + public async Task HTML_helper_emits_HTML_which_is_not_encoded_and_has_the_text_html_mime_type( + Language language, + string code) + { + var kernel = CreateKernel(language); + + var events = kernel.KernelEvents.ToSubscribedList(); + + await kernel.SubmitCodeAsync(code); + + events.Should().NotContainErrors(); + + events.Should() + .ContainSingle() + .Which + .FormattedValues + .Should() + .ContainSingle(f => f.Value.Equals("hi!") && + f.MimeType == "text/html"); + } + [Theory] [InlineData(Language.CSharp)] [InlineData(Language.FSharp)] diff --git a/WorkspaceServer/Packaging/PackageRestoreContext.cs b/WorkspaceServer/Packaging/PackageRestoreContext.cs index e63622a61..a0b46f4de 100644 --- a/WorkspaceServer/Packaging/PackageRestoreContext.cs +++ b/WorkspaceServer/Packaging/PackageRestoreContext.cs @@ -49,7 +49,7 @@ public async Task AddPackage( { var requestedPackage = new NugetPackageReference(packageName, packageVersion, restoreSources); - if (!String.IsNullOrEmpty(packageName) && _nugetPackageReferences.TryGetValue(requestedPackage, out var _)) + if (!string.IsNullOrEmpty(packageName) && _nugetPackageReferences.TryGetValue(requestedPackage, out var _)) { return new AddNugetPackageResult(false, requestedPackage); }