Skip to content
This repository was archived by the owner on Dec 19, 2018. It is now read-only.

Commit daafb00

Browse files
author
N. Taylor Mullen
committed
Add code generation tests for tag helpers.
#72
1 parent 29b0cdb commit daafb00

File tree

11 files changed

+547
-11
lines changed

11 files changed

+547
-11
lines changed

src/Microsoft.AspNet.Razor/Parser/RazorParser.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public RazorParser(ParserBase codeParser, ParserBase markupParser)
5252

5353
internal ParserBase CodeParser { get; private set; }
5454
internal ParserBase MarkupParser { get; private set; }
55-
internal IList<ISyntaxTreeRewriter> Optimizers { get; private set; }
55+
// Internal for testing
56+
internal IList<ISyntaxTreeRewriter> Optimizers { get; set; }
5657

5758
public bool DesignTimeMode { get; set; }
5859

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Linq;
5+
using System.Reflection;
6+
using Microsoft.AspNet.Razor.Parser;
7+
using Microsoft.AspNet.Razor.Parser.TagHelpers.Internal;
8+
using Microsoft.AspNet.Razor.TagHelpers;
9+
using Moq;
10+
using Xunit;
11+
12+
namespace Microsoft.AspNet.Razor.Test.Generator
13+
{
14+
public class CSharpTagHelperRenderingTest : CSharpRazorCodeGeneratorTest
15+
{
16+
[Theory]
17+
[InlineData("BasicTagHelpers")]
18+
[InlineData("ComplexTagHelpers")]
19+
public void TagHelpers_ChangeGeneratedOutput(string testType)
20+
{
21+
var inputTypePropertyInfo = new Mock<PropertyInfo>();
22+
inputTypePropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(string));
23+
inputTypePropertyInfo.Setup(ipi => ipi.Name).Returns("Type");
24+
var checkedPropertyInfo = new Mock<PropertyInfo>();
25+
checkedPropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(bool));
26+
checkedPropertyInfo.Setup(ipi => ipi.Name).Returns("Checked");
27+
// Arrange
28+
var tagHelperProvider = new TagHelperDescriptorProvider(
29+
new TagHelperDescriptor[]
30+
{
31+
new TagHelperDescriptor("p", "pTagHelper", ContentBehavior.None),
32+
new TagHelperDescriptor("input",
33+
"inputTagHelper",
34+
ContentBehavior.None,
35+
new TagHelperAttributeDescriptor[] {
36+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
37+
}),
38+
new TagHelperDescriptor("input",
39+
"inputTagHelper2",
40+
ContentBehavior.None,
41+
new TagHelperAttributeDescriptor[] {
42+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
43+
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
44+
}),
45+
});
46+
47+
// Act & Assert
48+
RunTagHelperTest(testType, tagHelperProvider);
49+
}
50+
51+
[Fact]
52+
public void TagHelpers_ContentBehavior()
53+
{
54+
// Arrange
55+
var tagHelperProvider = new TagHelperDescriptorProvider(
56+
new TagHelperDescriptor[]
57+
{
58+
new TagHelperDescriptor("modify", "modifyTagHelper", ContentBehavior.Modify),
59+
new TagHelperDescriptor("none", "noneTagHelper", ContentBehavior.None),
60+
new TagHelperDescriptor("append", "appendTagHelper", ContentBehavior.Append),
61+
new TagHelperDescriptor("prepend", "prependTagHelper", ContentBehavior.Prepend),
62+
new TagHelperDescriptor("replace", "replaceTagHelper", ContentBehavior.Replace),
63+
});
64+
65+
// Act & Assert
66+
RunTagHelperTest("ContentBehaviorTagHelpers", tagHelperProvider);
67+
}
68+
69+
private void RunTagHelperTest(string testName, TagHelperDescriptorProvider tagHelperProvider)
70+
{
71+
RunTest(
72+
name: testName,
73+
templateEngineConfig: (engine) =>
74+
{
75+
return new TagHelperTemplateEngine(engine, tagHelperProvider);
76+
});
77+
}
78+
79+
private class TagHelperTemplateEngine : RazorTemplateEngine
80+
{
81+
private TagHelperDescriptorProvider _tagHelperProvider;
82+
83+
public TagHelperTemplateEngine(RazorTemplateEngine engine, TagHelperDescriptorProvider tagHelperProvider)
84+
: base(engine.Host)
85+
{
86+
_tagHelperProvider = tagHelperProvider;
87+
}
88+
89+
protected internal override RazorParser CreateParser()
90+
{
91+
var parser = base.CreateParser();
92+
var optimizers = parser.Optimizers.Where(opmzr => !(opmzr is TagHelperParseTreeRewriter));
93+
94+
parser.Optimizers = optimizers.Concat(new[] {
95+
new TagHelperParseTreeRewriter(_tagHelperProvider)
96+
}).ToList();
97+
98+
return parser;
99+
}
100+
}
101+
}
102+
}

test/Microsoft.AspNet.Razor.Test/Generator/RazorCodeGeneratorTest.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ protected void RunTest(string name,
3838
TestSpan[] spans = null,
3939
TabTest tabTest = TabTest.Both,
4040
Action<RazorEngineHost> hostConfig = null,
41+
Func<RazorTemplateEngine, RazorTemplateEngine> templateEngineConfig = null,
4142
Action<GeneratorResults> onResults = null)
4243
{
4344
bool testRun = false;
@@ -55,6 +56,7 @@ protected void RunTest(string name,
5556
spans: spans,
5657
withTabs: true,
5758
hostConfig: hostConfig,
59+
templateEngineConfig: templateEngineConfig,
5860
onResults: onResults);
5961
}
6062

@@ -74,6 +76,7 @@ protected void RunTest(string name,
7476
spans: spans,
7577
withTabs: false,
7678
hostConfig: hostConfig,
79+
templateEngineConfig: templateEngineConfig,
7780
onResults: onResults);
7881
}
7982

@@ -84,14 +87,15 @@ protected void RunTest(string name,
8487
}
8588

8689
private void RunTestInternal(string name,
87-
string baselineName,
88-
bool generatePragmas,
89-
bool designTimeMode,
90-
IList<LineMapping> expectedDesignTimePragmas,
91-
TestSpan[] spans,
92-
bool withTabs,
93-
Action<RazorEngineHost> hostConfig,
94-
Action<GeneratorResults> onResults = null)
90+
string baselineName,
91+
bool generatePragmas,
92+
bool designTimeMode,
93+
IList<LineMapping> expectedDesignTimePragmas,
94+
TestSpan[] spans,
95+
bool withTabs,
96+
Action<RazorEngineHost> hostConfig,
97+
Func<RazorTemplateEngine, RazorTemplateEngine> templateEngineConfig,
98+
Action<GeneratorResults> onResults = null)
9599
{
96100
// Load the test files
97101
if (baselineName == null)
@@ -111,7 +115,8 @@ private void RunTestInternal(string name,
111115
host.DefaultClassName = name;
112116

113117
// Add support for templates, etc.
114-
host.GeneratedClassContext = new GeneratedClassContext(GeneratedClassContext.DefaultExecuteMethodName,
118+
host.GeneratedClassContext = new GeneratedClassContext(GeneratedTagHelperRenderingContext.Default,
119+
GeneratedClassContext.DefaultExecuteMethodName,
115120
GeneratedClassContext.DefaultWriteMethodName,
116121
GeneratedClassContext.DefaultWriteLiteralMethodName,
117122
"WriteTo",
@@ -133,6 +138,11 @@ private void RunTestInternal(string name,
133138

134139
RazorTemplateEngine engine = new RazorTemplateEngine(host);
135140

141+
if(templateEngineConfig != null)
142+
{
143+
engine = templateEngineConfig(engine);
144+
}
145+
136146
// Generate code for the file
137147
GeneratorResults results = null;
138148
using (StringTextBuffer buffer = new StringTextBuffer(source))

test/Microsoft.AspNet.Razor.Test/Parser/PartialParsing/PartialParsingTestBase.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,14 @@ protected static RazorEngineHost CreateHost()
5858
{
5959
return new RazorEngineHost(new TLanguage())
6060
{
61-
GeneratedClassContext = new GeneratedClassContext("Execute", "Write", "WriteLiteral", "WriteTo", "WriteLiteralTo", "Template", "DefineSection"),
61+
GeneratedClassContext = new GeneratedClassContext(GeneratedTagHelperRenderingContext.Default,
62+
"Execute",
63+
"Write",
64+
"WriteLiteral",
65+
"WriteTo",
66+
"WriteLiteralTo",
67+
"Template",
68+
"DefineSection"),
6269
DesignTimeMode = true
6370
};
6471
}

test/Microsoft.AspNet.Razor.Test/RazorEngineHostTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ private static RazorEngineHost CreateHost()
119119
private static void VerifyCommonDefaults(RazorEngineHost host)
120120
{
121121
Assert.Equal(GeneratedClassContext.Default, host.GeneratedClassContext);
122+
Assert.Equal(GeneratedTagHelperRenderingContext.Default, host.GeneratedClassContext.GeneratedTagHelperRenderingContext);
122123
Assert.Empty(host.NamespaceImports);
123124
Assert.False(host.DesignTimeMode);
124125
Assert.Equal(RazorEngineHost.InternalDefaultClassName, host.DefaultClassName);
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
namespace TestOutput
2+
{
3+
using System;
4+
using System.Threading.Tasks;
5+
6+
public class BasicTagHelpers
7+
{
8+
#line hidden
9+
public BasicTagHelpers()
10+
{
11+
}
12+
13+
#pragma warning disable 1998
14+
public override async Task ExecuteAsync()
15+
{
16+
ITagHelperManager __tagHelperManager = CreateTagHelper();
17+
var __tagHelperBufferValue = string.Empty;
18+
pTagHelper __p_pTagHelper_None = null;
19+
inputTagHelper __input_inputTagHelper_None = null;
20+
inputTagHelper2 __input_inputTagHelper2_None = null;
21+
WriteLiteral("<div class=\"randomNonTagHelperAttribute\">\r\n ");
22+
__p_pTagHelper_None = CreateTagHelper<pTagHelper>();
23+
__tagHelperManager.AddActiveTagHelper(__p_pTagHelper_None);
24+
__tagHelperManager.AddHTMLAttribute("class", "Hello World");
25+
__tagHelperManager.StartActiveTagHelpers("p");
26+
__tagHelperManager.ExecuteTagHelpers();
27+
WriteLiteral(__tagHelperManager.GenerateTagStart());
28+
WriteLiteral("\r\n ");
29+
__p_pTagHelper_None = CreateTagHelper<pTagHelper>();
30+
__tagHelperManager.AddActiveTagHelper(__p_pTagHelper_None);
31+
__tagHelperManager.StartActiveTagHelpers("p");
32+
__tagHelperManager.ExecuteTagHelpers();
33+
WriteLiteral(__tagHelperManager.GenerateTagStart());
34+
WriteLiteral(__tagHelperManager.GenerateTagEnd());
35+
__tagHelperManager.EndTagHelpers();
36+
WriteLiteral("\r\n ");
37+
__input_inputTagHelper_None = CreateTagHelper<inputTagHelper>();
38+
__input_inputTagHelper_None.Type = "text";
39+
__tagHelperManager.AddTagHelperAttribute("type", __input_inputTagHelper_None.Type);
40+
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper_None);
41+
__input_inputTagHelper2_None = CreateTagHelper<inputTagHelper2>();
42+
__input_inputTagHelper2_None.Type = __input_inputTagHelper_None.Type;
43+
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper2_None);
44+
__tagHelperManager.StartActiveTagHelpers("input");
45+
__tagHelperManager.ExecuteTagHelpers();
46+
WriteLiteral(__tagHelperManager.GenerateTagStart());
47+
WriteLiteral(__tagHelperManager.GenerateTagEnd());
48+
__tagHelperManager.EndTagHelpers();
49+
WriteLiteral("\r\n ");
50+
__input_inputTagHelper_None = CreateTagHelper<inputTagHelper>();
51+
__input_inputTagHelper_None.Type = "checkbox";
52+
__tagHelperManager.AddTagHelperAttribute("type", __input_inputTagHelper_None.Type);
53+
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper_None);
54+
__input_inputTagHelper2_None = CreateTagHelper<inputTagHelper2>();
55+
__input_inputTagHelper2_None.Type = __input_inputTagHelper_None.Type;
56+
__input_inputTagHelper2_None.Checked = true;
57+
__tagHelperManager.AddTagHelperAttribute("checked", __input_inputTagHelper2_None.Checked);
58+
__tagHelperManager.AddActiveTagHelper(__input_inputTagHelper2_None);
59+
__tagHelperManager.StartActiveTagHelpers("input");
60+
__tagHelperManager.ExecuteTagHelpers();
61+
WriteLiteral(__tagHelperManager.GenerateTagStart());
62+
WriteLiteral(__tagHelperManager.GenerateTagEnd());
63+
__tagHelperManager.EndTagHelpers();
64+
WriteLiteral("\r\n ");
65+
WriteLiteral(__tagHelperManager.GenerateTagEnd());
66+
__tagHelperManager.EndTagHelpers();
67+
WriteLiteral("\r\n</div>");
68+
}
69+
#pragma warning restore 1998
70+
}
71+
}

0 commit comments

Comments
 (0)