diff --git a/test/Microsoft.AspNet.Razor.Test/Generator/CSharpTagHelperRenderingTest.cs b/test/Microsoft.AspNet.Razor.Test/Generator/CSharpTagHelperRenderingTest.cs new file mode 100644 index 0000000000..239584e795 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/Generator/CSharpTagHelperRenderingTest.cs @@ -0,0 +1,142 @@ +// 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.Linq; +using System.Reflection; +using Microsoft.AspNet.Razor.Parser; +using Microsoft.AspNet.Razor.Parser.TagHelpers.Internal; +using Microsoft.AspNet.Razor.TagHelpers; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.Razor.Test.Generator +{ + public class CSharpTagHelperRenderingTest : CSharpRazorCodeGeneratorTest + { + [Theory] + [InlineData("TagHelpersInSection")] + [InlineData("TagHelpersInHelper")] + public void TagHelpers_WithinHelpersAndSections_GeneratesExpectedOutput(string testType) + { + // Arrange + var propertyInfoMock = new Mock(); + propertyInfoMock.Setup(propertyInfo => propertyInfo.PropertyType).Returns(typeof(string)); + propertyInfoMock.Setup(propertyInfo => propertyInfo.Name).Returns("BoundProperty"); + var tagHelperDescriptorProvider = new TagHelperDescriptorProvider( + new TagHelperDescriptor[] + { + new TagHelperDescriptor("MyTagHelper", + "MyTagHelper", + ContentBehavior.None, + new [] { + new TagHelperAttributeDescriptor("BoundProperty", + propertyInfoMock.Object) + }), + new TagHelperDescriptor("NestedTagHelper", "NestedTagHelper", ContentBehavior.Modify) + }); + + // Act & Assert + RunTagHelperTest(testType, tagHelperDescriptorProvider); + } + + [Theory] + [InlineData("SingleTagHelper")] + [InlineData("BasicTagHelpers")] + [InlineData("ComplexTagHelpers")] + public void TagHelpers_GenerateExpectedOutput(string testType) + { + // Arrange + var pFooPropertyInfo = new Mock(); + pFooPropertyInfo.Setup(propertyInfo => propertyInfo.PropertyType).Returns(typeof(int)); + pFooPropertyInfo.Setup(propertyInfo => propertyInfo.Name).Returns("Foo"); + var inputTypePropertyInfo = new Mock(); + inputTypePropertyInfo.Setup(propertyInfo => propertyInfo.PropertyType).Returns(typeof(string)); + inputTypePropertyInfo.Setup(propertyInfo => propertyInfo.Name).Returns("Type"); + var checkedPropertyInfo = new Mock(); + checkedPropertyInfo.Setup(propertyInfo => propertyInfo.PropertyType).Returns(typeof(bool)); + checkedPropertyInfo.Setup(propertyInfo => propertyInfo.Name).Returns("Checked"); + var tagHelperDescriptorProvider = new TagHelperDescriptorProvider( + new TagHelperDescriptor[] + { + new TagHelperDescriptor("p", + "PTagHelper", + ContentBehavior.None, + new [] { + new TagHelperAttributeDescriptor("foo", pFooPropertyInfo.Object) + }), + new TagHelperDescriptor("input", + "InputTagHelper", + ContentBehavior.None, + new TagHelperAttributeDescriptor[] { + new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object) + }), + new TagHelperDescriptor("input", + "InputTagHelper2", + ContentBehavior.None, + new TagHelperAttributeDescriptor[] { + new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object), + new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object) + }), + }); + + // Act & Assert + RunTagHelperTest(testType, tagHelperDescriptorProvider); + } + + [Fact] + public void TagHelpers_WithContentBehaviors_GenerateExpectedOutput() + { + // Arrange + var tagHelperDescriptorProvider = new TagHelperDescriptorProvider( + new TagHelperDescriptor[] + { + new TagHelperDescriptor("modify", "ModifyTagHelper", ContentBehavior.Modify), + new TagHelperDescriptor("none", "NoneTagHelper", ContentBehavior.None), + new TagHelperDescriptor("append", "AppendTagHelper", ContentBehavior.Append), + new TagHelperDescriptor("prepend", "PrependTagHelper", ContentBehavior.Prepend), + new TagHelperDescriptor("replace", "ReplaceTagHelper", ContentBehavior.Replace), + }); + + // Act & Assert + RunTagHelperTest("ContentBehaviorTagHelpers", tagHelperDescriptorProvider); + } + + private void RunTagHelperTest(string testName, TagHelperDescriptorProvider tagHelperDescriptorProvider) + { + RunTest( + name: testName, + templateEngineConfig: (engine) => + { + return new TagHelperTemplateEngine(engine, tagHelperDescriptorProvider); + }); + } + + private class TagHelperTemplateEngine : RazorTemplateEngine + { + private TagHelperDescriptorProvider _tagHelperDescriptorProvider; + + public TagHelperTemplateEngine(RazorTemplateEngine engine, TagHelperDescriptorProvider tagHelperDescriptorProvider) + : base(engine.Host) + { + _tagHelperDescriptorProvider = tagHelperDescriptorProvider; + } + + protected internal override RazorParser CreateParser() + { + var parser = base.CreateParser(); + var tagHelperParseTreeRewriter = new TagHelperParseTreeRewriter(_tagHelperDescriptorProvider); + + for (var i = 0; i < parser.Optimizers.Count; i++) + { + if (parser.Optimizers[i] is TagHelperParseTreeRewriter) + { + parser.Optimizers[i] = tagHelperParseTreeRewriter; + break; + } + } + + return parser; + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/Generator/RazorCodeGeneratorTest.cs b/test/Microsoft.AspNet.Razor.Test/Generator/RazorCodeGeneratorTest.cs index 56852dd1d0..9bbad9c8fc 100644 --- a/test/Microsoft.AspNet.Razor.Test/Generator/RazorCodeGeneratorTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/Generator/RazorCodeGeneratorTest.cs @@ -38,6 +38,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator TestSpan[] spans = null, TabTest tabTest = TabTest.Both, Action hostConfig = null, + Func templateEngineConfig = null, Action onResults = null) { bool testRun = false; @@ -55,6 +56,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator spans: spans, withTabs: true, hostConfig: hostConfig, + templateEngineConfig: templateEngineConfig, onResults: onResults); } @@ -74,6 +76,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator spans: spans, withTabs: false, hostConfig: hostConfig, + templateEngineConfig: templateEngineConfig, onResults: onResults); } @@ -84,14 +87,15 @@ namespace Microsoft.AspNet.Razor.Test.Generator } private void RunTestInternal(string name, - string baselineName, - bool generatePragmas, - bool designTimeMode, - IList expectedDesignTimePragmas, - TestSpan[] spans, - bool withTabs, - Action hostConfig, - Action onResults = null) + string baselineName, + bool generatePragmas, + bool designTimeMode, + IList expectedDesignTimePragmas, + TestSpan[] spans, + bool withTabs, + Action hostConfig, + Func templateEngineConfig, + Action onResults = null) { // Load the test files if (baselineName == null) @@ -118,7 +122,8 @@ namespace Microsoft.AspNet.Razor.Test.Generator "Template", "DefineSection", "Instrumentation.BeginContext", - "Instrumentation.EndContext") + "Instrumentation.EndContext", + new GeneratedTagHelperContext()) { LayoutPropertyName = "Layout", ResolveUrlMethodName = "Href" @@ -133,6 +138,11 @@ namespace Microsoft.AspNet.Razor.Test.Generator RazorTemplateEngine engine = new RazorTemplateEngine(host); + if(templateEngineConfig != null) + { + engine = templateEngineConfig(engine); + } + // Generate code for the file GeneratorResults results = null; using (var source = TestFile.Create(sourceLocation).OpenRead()) diff --git a/test/Microsoft.AspNet.Razor.Test/Parser/PartialParsing/PartialParsingTestBase.cs b/test/Microsoft.AspNet.Razor.Test/Parser/PartialParsing/PartialParsingTestBase.cs index e584e4d94d..719608713f 100644 --- a/test/Microsoft.AspNet.Razor.Test/Parser/PartialParsing/PartialParsingTestBase.cs +++ b/test/Microsoft.AspNet.Razor.Test/Parser/PartialParsing/PartialParsingTestBase.cs @@ -58,7 +58,14 @@ namespace Microsoft.AspNet.Razor.Test.Parser.PartialParsing { return new RazorEngineHost(new TLanguage()) { - GeneratedClassContext = new GeneratedClassContext("Execute", "Write", "WriteLiteral", "WriteTo", "WriteLiteralTo", "Template", "DefineSection"), + GeneratedClassContext = new GeneratedClassContext("Execute", + "Write", + "WriteLiteral", + "WriteTo", + "WriteLiteralTo", + "Template", + "DefineSection", + new GeneratedTagHelperContext()), DesignTimeMode = true }; } diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/BasicTagHelpers.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/BasicTagHelpers.cs new file mode 100644 index 0000000000..85f57d07cc --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/BasicTagHelpers.cs @@ -0,0 +1,88 @@ +#pragma checksum "BasicTagHelpers.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8d60e58d54168749dc71a0d6d3a95887b2adb5e7" +namespace TestOutput +{ + using Microsoft.AspNet.Razor.Runtime.TagHelpers; + using System; + using System.Threading.Tasks; + + public class BasicTagHelpers + { + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private PTagHelper __PTagHelper = null; + private InputTagHelper __InputTagHelper = null; + private InputTagHelper2 __InputTagHelper2 = null; + #line hidden + public BasicTagHelpers() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { + Instrumentation.BeginContext(0, 47, true); + WriteLiteral("
\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + __tagHelperExecutionContext.AddHtmlAttribute("class", "Hello World"); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(70, 10, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(87, 10, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + __InputTagHelper.Type = "text"; + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(118, 10, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + __InputTagHelper.Type = "checkbox"; + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __InputTagHelper2.Checked = true; + __tagHelperExecutionContext.AddTagHelperAttribute("checked", __InputTagHelper2.Checked); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(167, 6, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(177, 8, true); + WriteLiteral("\r\n
"); + Instrumentation.EndContext(); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ComplexTagHelpers.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ComplexTagHelpers.cs new file mode 100644 index 0000000000..6d1a6ad451 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ComplexTagHelpers.cs @@ -0,0 +1,225 @@ +#pragma checksum "ComplexTagHelpers.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7540f76029963ad4e3c0a02077a63d0fe2cb0157" +namespace TestOutput +{ + using Microsoft.AspNet.Razor.Runtime.TagHelpers; + using System; + using System.Threading.Tasks; + + public class ComplexTagHelpers + { + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private PTagHelper __PTagHelper = null; + private InputTagHelper __InputTagHelper = null; + private InputTagHelper2 __InputTagHelper2 = null; + #line hidden + public ComplexTagHelpers() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { +#line 1 "ComplexTagHelpers.cshtml" + if (true) +{ + var checkbox = "checkbox"; + + +#line default +#line hidden + + Instrumentation.BeginContext(49, 55, true); + WriteLiteral("
\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + StartWritingScope(); + WriteLiteral("Current Time: "); +#line 6 "ComplexTagHelpers.cshtml" +Write(DateTime.Now); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.AddHtmlAttribute("time", __tagHelperStringValueBuffer.ToString()); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(142, 34, true); + WriteLiteral("\r\n

Set Time:

\r\n"); + Instrumentation.EndContext(); +#line 8 "ComplexTagHelpers.cshtml" + + +#line default +#line hidden + +#line 8 "ComplexTagHelpers.cshtml" + if (false) + { + +#line default +#line hidden + + Instrumentation.BeginContext(216, 16, true); + WriteLiteral(" "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(235, 10, true); + WriteLiteral("New Time: "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + __InputTagHelper.Type = "text"; + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __tagHelperExecutionContext.AddHtmlAttribute("value", ""); + __tagHelperExecutionContext.AddHtmlAttribute("placeholder", "Enter in a new time..."); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(315, 2, true); + WriteLiteral("\r\n"); + Instrumentation.EndContext(); +#line 11 "ComplexTagHelpers.cshtml" + } + else + { + +#line default +#line hidden + + Instrumentation.BeginContext(365, 16, true); + WriteLiteral(" "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(384, 14, true); + WriteLiteral("Current Time: "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + StartWritingScope(); +#line 14 "ComplexTagHelpers.cshtml" +Write(checkbox); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __InputTagHelper.Type = __tagHelperStringValueBuffer.ToString(); + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __InputTagHelper2.Checked = true; + __tagHelperExecutionContext.AddTagHelperAttribute("checked", __InputTagHelper2.Checked); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(439, 18, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + StartWritingScope(); +#line 15 "ComplexTagHelpers.cshtml" +Write(true ? "checkbox" : "anything"); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __InputTagHelper.Type = __tagHelperStringValueBuffer.ToString(); + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(507, 18, true); + WriteLiteral("\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input"); + __InputTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper); + StartWritingScope(); +#line 16 "ComplexTagHelpers.cshtml" +if(true) { + +#line default +#line hidden + + WriteLiteral(" checkbox "); +#line 16 "ComplexTagHelpers.cshtml" +} else { + +#line default +#line hidden + + WriteLiteral(" anything "); +#line 16 "ComplexTagHelpers.cshtml" +} + +#line default +#line hidden + + __tagHelperStringValueBuffer = EndWritingScope(); + __InputTagHelper.Type = __tagHelperStringValueBuffer.ToString(); + __tagHelperExecutionContext.AddTagHelperAttribute("type", __InputTagHelper.Type); + __InputTagHelper2 = CreateTagHelper(); + __tagHelperExecutionContext.Add(__InputTagHelper2); + __InputTagHelper2.Type = __InputTagHelper.Type; + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(608, 2, true); + WriteLiteral("\r\n"); + Instrumentation.EndContext(); +#line 17 "ComplexTagHelpers.cshtml" + } + +#line default +#line hidden + + Instrumentation.BeginContext(625, 8, true); + WriteLiteral(" "); + Instrumentation.EndContext(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(637, 14, true); + WriteLiteral("\r\n
\r\n"); + Instrumentation.EndContext(); +#line 20 "ComplexTagHelpers.cshtml" +} + +#line default +#line hidden + + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ContentBehaviorTagHelpers.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ContentBehaviorTagHelpers.cs new file mode 100644 index 0000000000..f671242af7 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/ContentBehaviorTagHelpers.cs @@ -0,0 +1,80 @@ +#pragma checksum "ContentBehaviorTagHelpers.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "27af4f673a178e8b27e320ea0d869aaf6a16a18b" +namespace TestOutput +{ + using Microsoft.AspNet.Razor.Runtime.TagHelpers; + using System; + using System.Threading.Tasks; + + public class ContentBehaviorTagHelpers + { + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private ModifyTagHelper __ModifyTagHelper = null; + private NoneTagHelper __NoneTagHelper = null; + private AppendTagHelper __AppendTagHelper = null; + private PrependTagHelper __PrependTagHelper = null; + private ReplaceTagHelper __ReplaceTagHelper = null; + #line hidden + public ContentBehaviorTagHelpers() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("modify"); + __ModifyTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__ModifyTagHelper); + StartWritingScope(); + WriteLiteral("\r\n "); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("none"); + __NoneTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__NoneTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral("\r\n "); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("append"); + __AppendTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__AppendTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral("\r\n "); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("prepend"); + __PrependTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PrependTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteral("\r\n "); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("replace"); + __ReplaceTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__ReplaceTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral("\r\n "); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral("\r\n "); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral("\r\n "); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + WriteLiteral("\r\n"); + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext, __tagHelperStringValueBuffer).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/SingleTagHelper.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/SingleTagHelper.cs new file mode 100644 index 0000000000..6b54ef7b48 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/SingleTagHelper.cs @@ -0,0 +1,40 @@ +#pragma checksum "SingleTagHelper.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "2c9b5f2ce383fe784f68f84cbb669ab04077c417" +namespace TestOutput +{ + using Microsoft.AspNet.Razor.Runtime.TagHelpers; + using System; + using System.Threading.Tasks; + + public class SingleTagHelper + { + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private PTagHelper __PTagHelper = null; + #line hidden + public SingleTagHelper() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("p"); + __PTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__PTagHelper); + __PTagHelper.Foo = 1337; + __tagHelperExecutionContext.AddTagHelperAttribute("foo", __PTagHelper.Foo); + __tagHelperExecutionContext.AddHtmlAttribute("class", "Hello World"); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(34, 11, true); + WriteLiteral("Body of Tag"); + Instrumentation.EndContext(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInHelper.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInHelper.cs new file mode 100644 index 0000000000..1251dbf24c --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInHelper.cs @@ -0,0 +1,140 @@ +#pragma checksum "TagHelpersInHelper.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "522348d1a7650330b24372fade70f418f61027bd" +namespace TestOutput +{ + using Microsoft.AspNet.Razor.Runtime.TagHelpers; + using System; + using System.Threading.Tasks; + + public class TagHelpersInHelper + { +public static Template +#line 1 "TagHelpersInHelper.cshtml" +MyHelper(string val) +{ + +#line default +#line hidden + return new Template((__razor_helper_writer) => { +#line 2 "TagHelpersInHelper.cshtml" + + +#line default +#line hidden + + Instrumentation.BeginContext(33, 19, true); + WriteLiteralTo(__razor_helper_writer, "
\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("mytaghelper"); + __MyTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__MyTagHelper); + StartWritingScope(); + WriteLiteral("Current Time: "); +#line 4 "TagHelpersInHelper.cshtml" +Write(DateTime.Now); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __MyTagHelper.BoundProperty = __tagHelperStringValueBuffer.ToString(); + __tagHelperExecutionContext.AddTagHelperAttribute("BoundProperty", __MyTagHelper.BoundProperty); + StartWritingScope(); + WriteLiteral("Current Time: "); +#line 4 "TagHelpersInHelper.cshtml" +Write(DateTime.Now); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.AddHtmlAttribute("unboundproperty", __tagHelperStringValueBuffer.ToString()); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteralTo(__razor_helper_writer, __tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(155, 52, true); + WriteLiteralTo(__razor_helper_writer, "\r\n In None ContentBehavior.\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("nestedtaghelper"); + __NestedTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__NestedTagHelper); + StartWritingScope(); + WriteLiteral("Some buffered values with a value of "); +#line 6 "TagHelpersInHelper.cshtml" + Write(val); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext, __tagHelperStringValueBuffer).Result; + WriteLiteralTo(__razor_helper_writer, __tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteralTo(__razor_helper_writer, __tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteralTo(__razor_helper_writer, __tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(283, 10, true); + WriteLiteralTo(__razor_helper_writer, "\r\n "); + Instrumentation.EndContext(); + WriteLiteralTo(__razor_helper_writer, __tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(307, 14, true); + WriteLiteralTo(__razor_helper_writer, "\r\n
\r\n"); + Instrumentation.EndContext(); +#line 9 "TagHelpersInHelper.cshtml" + +#line default +#line hidden + + } + ); +#line 9 "TagHelpersInHelper.cshtml" +} + +#line default +#line hidden + + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private MyTagHelper __MyTagHelper = null; + private NestedTagHelper __NestedTagHelper = null; + #line hidden + public TagHelpersInHelper() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("mytaghelper"); + __MyTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__MyTagHelper); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteral(__tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(338, 9, false); +#line 10 "TagHelpersInHelper.cshtml" +Write(MyHelper(item => new Template((__razor_template_writer) => { + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("nestedtaghelper"); + __NestedTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__NestedTagHelper); + StartWritingScope(); + WriteLiteral("Custom Value"); + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext, __tagHelperStringValueBuffer).Result; + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); +} +) +)); + +#line default +#line hidden + Instrumentation.EndContext(); + WriteLiteral(__tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(410, 2, true); + WriteLiteral("\r\n"); + Instrumentation.EndContext(); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInSection.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInSection.cs new file mode 100644 index 0000000000..fc12441f5a --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Output/TagHelpersInSection.cs @@ -0,0 +1,94 @@ +#pragma checksum "TagHelpersInSection.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "bfe8d61279682f87dc473aa71134e86af554f55e" +namespace TestOutput +{ + using System; + using System.Threading.Tasks; + + public class TagHelpersInSection + { + #line hidden + private System.IO.TextWriter __tagHelperStringValueBuffer = null; + private TagHelperExecutionContext __tagHelperExecutionContext = null; + private TagHelperRunner __tagHelperRunner = new TagHelperRunner(); + private TagHelperScopeManager __tagHelperScopeManager = new TagHelperScopeManager(); + private MyTagHelper __MyTagHelper = null; + private NestedTagHelper __NestedTagHelper = null; + #line hidden + public TagHelpersInSection() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { +#line 1 "TagHelpersInSection.cshtml" + + var code = "some code"; + +#line default +#line hidden + + Instrumentation.BeginContext(34, 4, true); + WriteLiteral("\r\n\r\n"); + Instrumentation.EndContext(); + DefineSection("MySection", new Template((__razor_template_writer) => { + Instrumentation.BeginContext(58, 21, true); + WriteLiteralTo(__razor_template_writer, "\r\n
\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("mytaghelper"); + __MyTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__MyTagHelper); + StartWritingScope(); + WriteLiteral("Current Time: "); +#line 7 "TagHelpersInSection.cshtml" +Write(DateTime.Now); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __MyTagHelper.BoundProperty = __tagHelperStringValueBuffer.ToString(); + __tagHelperExecutionContext.AddTagHelperAttribute("BoundProperty", __MyTagHelper.BoundProperty); + StartWritingScope(); + WriteLiteral("Current Time: "); +#line 7 "TagHelpersInSection.cshtml" +Write(DateTime.Now); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.AddHtmlAttribute("unboundproperty", __tagHelperStringValueBuffer.ToString()); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext).Result; + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateStartTag()); + Instrumentation.BeginContext(182, 52, true); + WriteLiteralTo(__razor_template_writer, "\r\n In None ContentBehavior.\r\n "); + Instrumentation.EndContext(); + __tagHelperExecutionContext = __tagHelperScopeManager.Begin("nestedtaghelper"); + __NestedTagHelper = CreateTagHelper(); + __tagHelperExecutionContext.Add(__NestedTagHelper); + StartWritingScope(); + WriteLiteral("Some buffered values with "); +#line 9 "TagHelpersInSection.cshtml" + Write(code); + +#line default +#line hidden + __tagHelperStringValueBuffer = EndWritingScope(); + __tagHelperExecutionContext.Output = __tagHelperRunner.RunAsync(__tagHelperExecutionContext, __tagHelperStringValueBuffer).Result; + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateStartTag()); + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateContent()); + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(300, 10, true); + WriteLiteralTo(__razor_template_writer, "\r\n "); + Instrumentation.EndContext(); + WriteLiteralTo(__razor_template_writer, __tagHelperExecutionContext.Output.GenerateEndTag()); + __tagHelperExecutionContext = __tagHelperScopeManager.End(); + Instrumentation.BeginContext(324, 14, true); + WriteLiteralTo(__razor_template_writer, "\r\n
\r\n"); + Instrumentation.EndContext(); + } + )); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/BasicTagHelpers.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/BasicTagHelpers.cshtml new file mode 100644 index 0000000000..e180b12d53 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/BasicTagHelpers.cshtml @@ -0,0 +1,7 @@ +
+

+

+ + +

+
\ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ComplexTagHelpers.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ComplexTagHelpers.cshtml new file mode 100644 index 0000000000..eb28e6a594 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ComplexTagHelpers.cshtml @@ -0,0 +1,20 @@ +@if (true) +{ + var checkbox = "checkbox"; + +
+

+

Set Time:

+ @if (false) + { +

New Time:

+ } + else + { +

Current Time:

+ + + } +

+
+} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ContentBehaviorTagHelpers.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ContentBehaviorTagHelpers.cshtml new file mode 100644 index 0000000000..1856158b6b --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/ContentBehaviorTagHelpers.cshtml @@ -0,0 +1,9 @@ + + + + + This should not be in the output + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/SingleTagHelper.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/SingleTagHelper.cshtml new file mode 100644 index 0000000000..832b95049d --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/SingleTagHelper.cshtml @@ -0,0 +1 @@ +

Body of Tag

\ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInHelper.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInHelper.cshtml new file mode 100644 index 0000000000..28a7219bc1 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInHelper.cshtml @@ -0,0 +1,10 @@ +@helper MyHelper(string val) +{ +
+ + In None ContentBehavior. + Some buffered values with a value of @val + +
+} +@MyHelper(@Custom Value) diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInSection.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInSection.cshtml new file mode 100644 index 0000000000..f87c72a863 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/CS/Source/TagHelpersInSection.cshtml @@ -0,0 +1,12 @@ +@{ + var code = "some code"; +} + +@section MySection { +
+ + In None ContentBehavior. + Some buffered values with @code + +
+} \ No newline at end of file