diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelpersTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelpersTest.cs index d3e752ec66..6a30b44eab 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelpersTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelpersTest.cs @@ -53,38 +53,62 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests Assert.Equal(expectedContent, responseContent); } - public static IEnumerable TagHelpersAreInheritedFromViewStartPagesData + public static TheoryData TagHelpersAreInheritedFromGlobalImportPagesData { get { - var expected1 = -@"root-content - - -nested-content"; - yield return new[] { "NestedViewStartTagHelper", expected1 }; - - var expected2 = -@"layout:root-content - - -nested-content"; - - yield return new[] { "ViewWithLayoutAndNestedTagHelper", expected2 }; - - var expected3 = -@"layout:root-content - - -page: -nested-content"; - yield return new[] { "ViewWithInheritedRemoveTagHelper", expected3 }; + // action, expected + return new TheoryData + { + { + "NestedGlobalImportTagHelper", + string.Format( + "root-content{0}{0}{0}nested-content", + Environment.NewLine) + }, + { + "ViewWithLayoutAndNestedTagHelper", + string.Format( + "layout:root-content{0}{0}{0}nested-content", + Environment.NewLine) + }, + { + "ViewWithInheritedRemoveTagHelper", + string.Format( + "layout:root-content{0}{0}{0}page:{0}nested-content", + Environment.NewLine) + }, + { + "ViewWithInheritedTagHelperPrefix", + string.Format( + "layout:root-content{0}{0}{0}page:root-content", + Environment.NewLine) + }, + { + "ViewWithOverriddenTagHelperPrefix", + string.Format( + "layout:root-content{0}{0}{0}{0}page:root-content", + Environment.NewLine) + }, + { + "ViewWithNestedInheritedTagHelperPrefix", + string.Format( + "layout:root-content{0}{0}{0}page:root-content", + Environment.NewLine) + }, + { + "ViewWithNestedOverriddenTagHelperPrefix", + string.Format( + "layout:root-content{0}{0}{0}{0}page:root-content", + Environment.NewLine) + }, + }; } } [Theory] - [MemberData(nameof(TagHelpersAreInheritedFromViewStartPagesData))] - public async Task TagHelpersAreInheritedFromViewStartPages(string action, string expected) + [MemberData(nameof(TagHelpersAreInheritedFromGlobalImportPagesData))] + public async Task TagHelpersAreInheritedFromGlobalImportPages(string action, string expected) { // Arrange var server = TestHelper.CreateServer(_app, SiteName); @@ -158,7 +182,7 @@ page: { "Age", "1000" }, { "EmployeeId", "0" }, { "Email", "a@b.com" }, - { "Salary", "z" }, + { "Salary", "z" }, }; var postContent = new FormUrlEncodedContent(validPostValues); diff --git a/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcRazorParserTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcRazorParserTest.cs index cc3213a446..3abbe53a72 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcRazorParserTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcRazorParserTest.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Razor.Generator.Compiler; @@ -15,30 +16,132 @@ namespace Microsoft.AspNet.Mvc.Razor { public class MvcRazorCodeParserTest { - [Fact] - public void GetTagHelperDescriptors_ReturnsDescriptorsFromViewStart() + public static TheoryData GlobalImportData + { + get + { + // codeTrees, expectedDirectiveDescriptors + return new TheoryData + { + { + new[] { CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP" }) }, + new[] { CreateDirectiveDescriptor("THP", TagHelperDirectiveType.TagHelperPrefix) } + }, + { + new[] { CreateCodeTree(new AddTagHelperChunk { LookupText = "ATH" }) }, + new[] { CreateDirectiveDescriptor("ATH", TagHelperDirectiveType.AddTagHelper) } + }, + { + new[] + { + CreateCodeTree( + new AddTagHelperChunk { LookupText = "ATH1" }, + new AddTagHelperChunk { LookupText = "ATH2" }) + }, + new[] + { + CreateDirectiveDescriptor("ATH1", TagHelperDirectiveType.AddTagHelper), + CreateDirectiveDescriptor("ATH2", TagHelperDirectiveType.AddTagHelper) + } + }, + { + new[] { CreateCodeTree(new RemoveTagHelperChunk { LookupText = "RTH" }) }, + new[] { CreateDirectiveDescriptor("RTH", TagHelperDirectiveType.RemoveTagHelper) } + }, + { + new[] + { + CreateCodeTree( + new RemoveTagHelperChunk { LookupText = "RTH1" }, + new RemoveTagHelperChunk { LookupText = "RTH2" }) + }, + new[] + { + CreateDirectiveDescriptor("RTH1", TagHelperDirectiveType.RemoveTagHelper), + CreateDirectiveDescriptor("RTH2", TagHelperDirectiveType.RemoveTagHelper) + } + }, + { + new[] + { + CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP1" }), + CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP2" }), + }, + new[] { CreateDirectiveDescriptor("THP1", TagHelperDirectiveType.TagHelperPrefix) } + }, + { + new[] + { + CreateCodeTree( + new TagHelperPrefixDirectiveChunk { Prefix = "THP" }, + new RemoveTagHelperChunk { LookupText = "RTH" }, + new AddTagHelperChunk { LookupText = "ATH" }) + }, + new[] + { + CreateDirectiveDescriptor("RTH", TagHelperDirectiveType.RemoveTagHelper), + CreateDirectiveDescriptor("ATH", TagHelperDirectiveType.AddTagHelper), + CreateDirectiveDescriptor("THP", TagHelperDirectiveType.TagHelperPrefix), + } + }, + { + new[] + { + CreateCodeTree( + new LiteralChunk { Text = "Hello world" }, + new AddTagHelperChunk { LookupText = "ATH" }), + CreateCodeTree(new RemoveTagHelperChunk { LookupText = "RTH" }) + }, + new[] + { + CreateDirectiveDescriptor("RTH", TagHelperDirectiveType.RemoveTagHelper), + CreateDirectiveDescriptor("ATH", TagHelperDirectiveType.AddTagHelper), + } + }, + { + new[] + { + CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP" }), + CreateCodeTree( + new LiteralChunk { Text = "Hello world" }, + new AddTagHelperChunk { LookupText = "ATH" }), + CreateCodeTree(new RemoveTagHelperChunk { LookupText = "RTH" }) + }, + new[] + { + CreateDirectiveDescriptor("RTH", TagHelperDirectiveType.RemoveTagHelper), + CreateDirectiveDescriptor("ATH", TagHelperDirectiveType.AddTagHelper), + CreateDirectiveDescriptor("THP", TagHelperDirectiveType.TagHelperPrefix), + } + }, + { + new[] + { + CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP1" }), + CreateCodeTree(new AddTagHelperChunk { LookupText = "ATH" }), + CreateCodeTree(new RemoveTagHelperChunk { LookupText = "RTH" }), + CreateCodeTree(new TagHelperPrefixDirectiveChunk { Prefix = "THP2" }), + }, + new[] + { + CreateDirectiveDescriptor("RTH", TagHelperDirectiveType.RemoveTagHelper), + CreateDirectiveDescriptor("ATH", TagHelperDirectiveType.AddTagHelper), + CreateDirectiveDescriptor("THP1", TagHelperDirectiveType.TagHelperPrefix), + } + }, + }; + } + } + + [Theory] + [MemberData(nameof(GlobalImportData))] + public void GetTagHelperDescriptors_ReturnsExpectedDirectiveDescriptors( + CodeTree[] codeTrees, + TagHelperDirectiveDescriptor[] expectedDirectiveDescriptors) { // Arrange var builder = new BlockBuilder { Type = BlockType.Comment }; var block = new Block(builder); - var codeTrees = new[] - { - new CodeTree - { - Chunks = new Chunk[] - { - new LiteralChunk { Text = "Hello world" }, - new AddTagHelperChunk { LookupText = "Add Tag Helper" }, - } - }, - new CodeTree - { - Chunks = new[] - { - new RemoveTagHelperChunk { LookupText = "Remove Tag Helper" }, - } - } - }; IList descriptors = null; var resolver = new Mock(); @@ -50,25 +153,43 @@ namespace Microsoft.AspNet.Mvc.Razor .Returns(Enumerable.Empty()) .Verifiable(); - var baseParser = new RazorParser(new CSharpCodeParser(), - new HtmlMarkupParser(), - resolver.Object); - var parser = new TestableMvcRazorParser(baseParser, codeTrees, new Chunk[0]); - var sink = new ParserErrorSink(); + var baseParser = new RazorParser( + new CSharpCodeParser(), + new HtmlMarkupParser(), + tagHelperDescriptorResolver: resolver.Object); + var parser = new TestableMvcRazorParser(baseParser, codeTrees, defaultInheritedChunks: new Chunk[0]); // Act - var result = parser.GetTagHelperDescriptorsPublic(block, sink).ToArray(); + parser.GetTagHelperDescriptorsPublic(block, errorSink: new ParserErrorSink()).ToArray(); // Assert Assert.NotNull(descriptors); - Assert.Equal(2, descriptors.Count); + Assert.Equal(expectedDirectiveDescriptors.Length, descriptors.Count); - Assert.Equal("Remove Tag Helper", descriptors[0].DirectiveText); - Assert.Equal(SourceLocation.Undefined, descriptors[0].Location); + for (var i = 0; i < expectedDirectiveDescriptors.Length; i++) + { + var expected = expectedDirectiveDescriptors[i]; + var actual = descriptors[i]; - Assert.Equal("Add Tag Helper", descriptors[1].DirectiveText); - Assert.Equal(TagHelperDirectiveType.AddTagHelper, descriptors[1].DirectiveType); - Assert.Equal(SourceLocation.Undefined, descriptors[1].Location); + Assert.Equal(expected.DirectiveText, actual.DirectiveText, StringComparer.Ordinal); + Assert.Equal(expected.Location, actual.Location); + Assert.Equal(expected.DirectiveType, actual.DirectiveType); + } + } + + private static CodeTree CreateCodeTree(params Chunk[] chunks) + { + return new CodeTree + { + Chunks = chunks + }; + } + + private static TagHelperDirectiveDescriptor CreateDirectiveDescriptor( + string directiveText, + TagHelperDirectiveType directiveType) + { + return new TagHelperDirectiveDescriptor(directiveText, SourceLocation.Undefined, directiveType); } private class TestableMvcRazorParser : MvcRazorParser diff --git a/test/WebSites/TagHelpersWebSite/Controllers/HomeController.cs b/test/WebSites/TagHelpersWebSite/Controllers/HomeController.cs index d0bf9a61f4..9c69ba533b 100644 --- a/test/WebSites/TagHelpersWebSite/Controllers/HomeController.cs +++ b/test/WebSites/TagHelpersWebSite/Controllers/HomeController.cs @@ -30,7 +30,7 @@ namespace TagHelpersWebSite.Controllers return View(); } - public ViewResult NestedViewStartTagHelper() + public ViewResult NestedGlobalImportTagHelper() { return View(); } @@ -44,5 +44,29 @@ namespace TagHelpersWebSite.Controllers { return View("/Views/RemoveInheritedTagHelpers/ViewWithInheritedRemoveTagHelper.cshtml"); } + + public ViewResult ViewWithInheritedTagHelperPrefix() + { + return View("/Views/InheritedTagHelperPrefix/InheritedTagHelperPrefix.cshtml"); + } + + public ViewResult ViewWithOverriddenTagHelperPrefix() + { + return View("/Views/InheritedTagHelperPrefix/OverriddenTagHelperPrefix.cshtml"); + } + + public ViewResult ViewWithNestedInheritedTagHelperPrefix() + { + return View( + "/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/" + + "NestedInheritedTagHelperPrefix.cshtml"); + } + + public ViewResult ViewWithNestedOverriddenTagHelperPrefix() + { + return View( + "/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/" + + "NestedOverriddenTagHelperPrefix.cshtml"); + } } } \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/TagHelpers/NestedViewStartTagHelper.cs b/test/WebSites/TagHelpersWebSite/TagHelpers/NestedGlobalImportTagHelper.cs similarity index 90% rename from test/WebSites/TagHelpersWebSite/TagHelpers/NestedViewStartTagHelper.cs rename to test/WebSites/TagHelpersWebSite/TagHelpers/NestedGlobalImportTagHelper.cs index 059df3e4b8..c2149c2b59 100644 --- a/test/WebSites/TagHelpersWebSite/TagHelpers/NestedViewStartTagHelper.cs +++ b/test/WebSites/TagHelpersWebSite/TagHelpers/NestedGlobalImportTagHelper.cs @@ -7,7 +7,7 @@ using Microsoft.AspNet.Razor.TagHelpers; namespace TagHelpersWebSite.TagHelpers { [HtmlElementName("nested")] - public class NestedViewStartTagHelper : TagHelper + public class NestedGlobalImportTagHelper : TagHelper { public override void Process(TagHelperContext context, TagHelperOutput output) { diff --git a/test/WebSites/TagHelpersWebSite/Views/Home/NestedViewStartTagHelper.cshtml b/test/WebSites/TagHelpersWebSite/Views/Home/NestedGlobalImportTagHelper.cshtml similarity index 100% rename from test/WebSites/TagHelpersWebSite/Views/Home/NestedViewStartTagHelper.cshtml rename to test/WebSites/TagHelpersWebSite/Views/Home/NestedGlobalImportTagHelper.cshtml diff --git a/test/WebSites/TagHelpersWebSite/Views/Home/_GlobalImport.cshtml b/test/WebSites/TagHelpersWebSite/Views/Home/_GlobalImport.cshtml index d5682ff618..e17878c5d8 100644 --- a/test/WebSites/TagHelpersWebSite/Views/Home/_GlobalImport.cshtml +++ b/test/WebSites/TagHelpersWebSite/Views/Home/_GlobalImport.cshtml @@ -1 +1 @@ -@addTagHelper "TagHelpersWebSite.TagHelpers.NestedViewStartTagHelper, TagHelpersWebSite" +@addTagHelper "TagHelpersWebSite.TagHelpers.NestedGlobalImportTagHelper, TagHelpersWebSite" diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/InheritedTagHelperPrefix.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/InheritedTagHelperPrefix.cshtml new file mode 100644 index 0000000000..21ff61e361 --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/InheritedTagHelperPrefix.cshtml @@ -0,0 +1 @@ +page: \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedInheritedTagHelperPrefix.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedInheritedTagHelperPrefix.cshtml new file mode 100644 index 0000000000..07283a4937 --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedInheritedTagHelperPrefix.cshtml @@ -0,0 +1 @@ +page: \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedOverriddenTagHelperPrefix.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedOverriddenTagHelperPrefix.cshtml new file mode 100644 index 0000000000..6bf3b82371 --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/NestedOverriddenTagHelperPrefix.cshtml @@ -0,0 +1,3 @@ +@tagHelperPrefix "nested-overridden" + +page: \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/_GlobalImport.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/_GlobalImport.cshtml new file mode 100644 index 0000000000..58e7c14f60 --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/NestedInheritedTagHelperPrefix/_GlobalImport.cshtml @@ -0,0 +1 @@ +@tagHelperPrefix "nested-" \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/OverriddenTagHelperPrefix.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/OverriddenTagHelperPrefix.cshtml new file mode 100644 index 0000000000..0db1a21aaf --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/OverriddenTagHelperPrefix.cshtml @@ -0,0 +1,3 @@ +@tagHelperPrefix "overridden" + +page: \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_GlobalImport.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_GlobalImport.cshtml new file mode 100644 index 0000000000..36569da394 --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_GlobalImport.cshtml @@ -0,0 +1 @@ +@tagHelperPrefix "inherited:" \ No newline at end of file diff --git a/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_ViewStart.cshtml b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_ViewStart.cshtml new file mode 100644 index 0000000000..da1c3b0b5d --- /dev/null +++ b/test/WebSites/TagHelpersWebSite/Views/InheritedTagHelperPrefix/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Shared/_LayoutWithRootTagHelper.cshtml"; +} diff --git a/test/WebSites/TagHelpersWebSite/Views/RemoveInheritedTagHelpers/_GlobalImport.cshtml b/test/WebSites/TagHelpersWebSite/Views/RemoveInheritedTagHelpers/_GlobalImport.cshtml index 015065f2a9..cd3709a79f 100644 --- a/test/WebSites/TagHelpersWebSite/Views/RemoveInheritedTagHelpers/_GlobalImport.cshtml +++ b/test/WebSites/TagHelpersWebSite/Views/RemoveInheritedTagHelpers/_GlobalImport.cshtml @@ -1,2 +1,2 @@ @removeTagHelper "TagHelpersWebSite.TagHelpers.RootViewStartTagHelper, TagHelpersWebSite" -@addTagHelper "TagHelpersWebSite.TagHelpers.NestedViewStartTagHelper, TagHelpersWebSite" +@addTagHelper "TagHelpersWebSite.TagHelpers.NestedGlobalImportTagHelper, TagHelpersWebSite" diff --git a/test/WebSites/TagHelpersWebSite/Views/Shared/ViewWithLayoutAndNestedTagHelper.cshtml b/test/WebSites/TagHelpersWebSite/Views/Shared/ViewWithLayoutAndNestedTagHelper.cshtml index d9c35bd83c..badf269931 100644 --- a/test/WebSites/TagHelpersWebSite/Views/Shared/ViewWithLayoutAndNestedTagHelper.cshtml +++ b/test/WebSites/TagHelpersWebSite/Views/Shared/ViewWithLayoutAndNestedTagHelper.cshtml @@ -1,5 +1,5 @@ @{ Layout = "~/Views/Shared/_LayoutWithRootTagHelper.cshtml"; } -@addTagHelper "TagHelpersWebSite.TagHelpers.NestedViewStartTagHelper, TagHelpersWebSite" +@addTagHelper "TagHelpersWebSite.TagHelpers.NestedGlobalImportTagHelper, TagHelpersWebSite" some-content