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

Commit 8ba1682

Browse files
author
N. Taylor Mullen
committed
Add tests to validate @addtaghelper directive.
- Fixed existing tests to work with new RazorParser. - Validated directive syntax tree creation, errors and code generation. #111
1 parent 5632d9a commit 8ba1682

20 files changed

+320
-95
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public partial class CSharpCodeParser : TokenizerBackedParser<CSharpTokenizer, C
1919

2020
internal static ISet<string> DefaultKeywords = new HashSet<string>()
2121
{
22+
"addtaghelper",
2223
"if",
2324
"do",
2425
"try",

test/Microsoft.AspNet.Razor.Test/Framework/TestSpanBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,11 @@ public SpanConstructor AsRazorDirectiveAttribute(string key, string value)
300300
return _self.With(new RazorDirectiveAttributeCodeGenerator(key, value));
301301
}
302302

303+
public SpanConstructor AsAddTagHelper(string lookupText)
304+
{
305+
return _self.With(new AddTagHelperCodeGenerator(lookupText));
306+
}
307+
303308
public SpanConstructor As(ISpanCodeGenerator codeGenerator)
304309
{
305310
return _self.With(codeGenerator);

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

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -459,16 +459,41 @@ private void OpenedIf(bool withTabs)
459459
});
460460
}
461461

462-
private static LineMapping BuildLineMapping(int documentAbsoluteIndex, int documentLineIndex, int generatedAbsoluteIndex, int generatedLineIndex, int characterOffsetIndex, int contentLength)
463-
{
464-
return BuildLineMapping(documentAbsoluteIndex, documentLineIndex, characterOffsetIndex, generatedAbsoluteIndex, generatedLineIndex, characterOffsetIndex, contentLength);
465-
}
466-
467-
private static LineMapping BuildLineMapping(int documentAbsoluteIndex, int documentLineIndex, int documentCharacterOffsetIndex, int generatedAbsoluteIndex, int generatedLineIndex, int generatedCharacterOffsetIndex, int contentLength)
462+
protected static LineMapping BuildLineMapping(int documentAbsoluteIndex,
463+
int documentLineIndex,
464+
int generatedAbsoluteIndex,
465+
int generatedLineIndex,
466+
int characterOffsetIndex,
467+
int contentLength)
468+
{
469+
return BuildLineMapping(documentAbsoluteIndex,
470+
documentLineIndex,
471+
characterOffsetIndex,
472+
generatedAbsoluteIndex,
473+
generatedLineIndex,
474+
characterOffsetIndex,
475+
contentLength);
476+
}
477+
478+
protected static LineMapping BuildLineMapping(int documentAbsoluteIndex,
479+
int documentLineIndex,
480+
int documentCharacterOffsetIndex,
481+
int generatedAbsoluteIndex,
482+
int generatedLineIndex,
483+
int generatedCharacterOffsetIndex,
484+
int contentLength)
468485
{
469486
return new LineMapping(
470-
documentLocation: new MappingLocation(new SourceLocation(documentAbsoluteIndex, documentLineIndex, documentCharacterOffsetIndex), contentLength),
471-
generatedLocation: new MappingLocation(new SourceLocation(generatedAbsoluteIndex, generatedLineIndex, generatedCharacterOffsetIndex), contentLength)
487+
documentLocation: new MappingLocation(
488+
new SourceLocation(documentAbsoluteIndex,
489+
documentLineIndex,
490+
documentCharacterOffsetIndex),
491+
contentLength),
492+
generatedLocation: new MappingLocation(
493+
new SourceLocation(generatedAbsoluteIndex,
494+
generatedLineIndex,
495+
generatedCharacterOffsetIndex),
496+
contentLength)
472497
);
473498
}
474499
}
Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using System.Collections.Generic;
45
using System.Reflection;
6+
using Microsoft.AspNet.Razor.Generator.Compiler;
57
using Microsoft.AspNet.Razor.TagHelpers;
68
using Moq;
79
using Xunit;
@@ -10,6 +12,29 @@ namespace Microsoft.AspNet.Razor.Test.Generator
1012
{
1113
public class CSharpTagHelperRenderingTest : TagHelperTestBase
1214
{
15+
[Fact]
16+
public void CSharpCodeGeneratorCorrectlyGeneratesMappingsForAddTagHelperDirective()
17+
{
18+
RunTest("AddTagHelperDirective",
19+
designTimeMode: true,
20+
tabTest: TabTest.NoTabs,
21+
expectedDesignTimePragmas: new List<LineMapping>()
22+
{
23+
BuildLineMapping(14, 0, 440, 14, 14, 11)
24+
});
25+
}
26+
27+
[Fact]
28+
public void TagHelpers_DirectivesGenerateDesignTimeMappings()
29+
{
30+
// Act & Assert
31+
RunTagHelperTest(testName: "AddTagHelperDirective",
32+
designTimeMode: true,
33+
tagHelperDescriptors: new[] {
34+
new TagHelperDescriptor("p", "pTagHelper", ContentBehavior.None)
35+
});
36+
}
37+
1338
[Theory]
1439
[InlineData("SingleTagHelper")]
1540
[InlineData("BasicTagHelpers")]
@@ -26,50 +51,48 @@ public void TagHelpers_ChangeGeneratedOutput(string testType)
2651
checkedPropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(bool));
2752
checkedPropertyInfo.Setup(ipi => ipi.Name).Returns("Checked");
2853
// Arrange
29-
var tagHelperProvider = new TagHelperDescriptorProvider(
30-
new TagHelperDescriptor[]
31-
{
32-
new TagHelperDescriptor("p",
33-
"PTagHelper",
34-
ContentBehavior.None,
35-
new [] {
36-
new TagHelperAttributeDescriptor("foo", pFooPropertyInfo.Object)
37-
}),
38-
new TagHelperDescriptor("input",
39-
"InputTagHelper",
40-
ContentBehavior.None,
41-
new TagHelperAttributeDescriptor[] {
42-
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
43-
}),
44-
new TagHelperDescriptor("input",
45-
"InputTagHelper2",
46-
ContentBehavior.None,
47-
new TagHelperAttributeDescriptor[] {
48-
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
49-
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
50-
}),
51-
});
54+
var tagHelperDescriptors = new TagHelperDescriptor[]
55+
{
56+
new TagHelperDescriptor("p",
57+
"PTagHelper",
58+
ContentBehavior.None,
59+
new [] {
60+
new TagHelperAttributeDescriptor("foo", pFooPropertyInfo.Object)
61+
}),
62+
new TagHelperDescriptor("input",
63+
"InputTagHelper",
64+
ContentBehavior.None,
65+
new TagHelperAttributeDescriptor[] {
66+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
67+
}),
68+
new TagHelperDescriptor("input",
69+
"InputTagHelper2",
70+
ContentBehavior.None,
71+
new TagHelperAttributeDescriptor[] {
72+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
73+
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
74+
})
75+
};
5276

5377
// Act & Assert
54-
RunTagHelperTest(testType, tagHelperProvider);
78+
RunTagHelperTest(testType, tagHelperDescriptors);
5579
}
5680

5781
[Fact]
5882
public void TagHelpers_ContentBehavior()
5983
{
6084
// Arrange
61-
var tagHelperProvider = new TagHelperDescriptorProvider(
62-
new TagHelperDescriptor[]
63-
{
85+
var tagHelperDescriptors = new TagHelperDescriptor[]
86+
{
6487
new TagHelperDescriptor("modify", "ModifyTagHelper", ContentBehavior.Modify),
6588
new TagHelperDescriptor("none", "NoneTagHelper", ContentBehavior.None),
6689
new TagHelperDescriptor("append", "AppendTagHelper", ContentBehavior.Append),
6790
new TagHelperDescriptor("prepend", "PrependTagHelper", ContentBehavior.Prepend),
6891
new TagHelperDescriptor("replace", "ReplaceTagHelper", ContentBehavior.Replace),
69-
});
92+
};
7093

7194
// Act & Assert
72-
RunTagHelperTest("ContentBehaviorTagHelpers", tagHelperProvider);
95+
RunTagHelperTest("ContentBehaviorTagHelpers", tagHelperDescriptors);
7396
}
7497
}
7598
}

test/Microsoft.AspNet.Razor.Test/Generator/CodeTree/CSharpPaddingBuilderTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.AspNet.Razor.Generator.Compiler.CSharp;
99
using Microsoft.AspNet.Razor.Parser;
1010
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
11+
using Microsoft.AspNet.Razor.TagHelpers;
1112
using Xunit;
1213

1314
namespace Microsoft.AspNet.Razor.Test.Generator
@@ -221,7 +222,9 @@ private static Span[] GenerateSpans(string text, SpanKind spanKind, int spanInde
221222
{
222223
Assert.True(spanIndex > 0);
223224

224-
var parser = new RazorParser(new CSharpCodeParser(), new HtmlMarkupParser());
225+
var parser = new RazorParser(new TagHelperDescriptorResolver(),
226+
new CSharpCodeParser(),
227+
new HtmlMarkupParser());
225228

226229
Span[] spans;
227230

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

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,28 @@ public void TagHelpers_CanReplaceAttributeCodeGeneratorLogic()
2424
var checkedPropertyInfo = new Mock<PropertyInfo>();
2525
checkedPropertyInfo.Setup(ipi => ipi.PropertyType).Returns(typeof(bool));
2626
checkedPropertyInfo.Setup(ipi => ipi.Name).Returns("Checked");
27-
var tagHelperProvider = new TagHelperDescriptorProvider(
28-
new TagHelperDescriptor[]
29-
{
30-
new TagHelperDescriptor("p", "PTagHelper", ContentBehavior.None),
31-
new TagHelperDescriptor("input",
32-
"InputTagHelper",
33-
ContentBehavior.None,
34-
new TagHelperAttributeDescriptor[] {
35-
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
36-
}),
37-
new TagHelperDescriptor("input",
38-
"InputTagHelper2",
39-
ContentBehavior.None,
40-
new TagHelperAttributeDescriptor[] {
41-
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
42-
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
43-
}),
44-
});
27+
var tagHelperDescriptors = new TagHelperDescriptor[]
28+
{
29+
new TagHelperDescriptor("p", "PTagHelper", ContentBehavior.None),
30+
new TagHelperDescriptor("input",
31+
"InputTagHelper",
32+
ContentBehavior.None,
33+
new TagHelperAttributeDescriptor[] {
34+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object)
35+
}),
36+
new TagHelperDescriptor("input",
37+
"InputTagHelper2",
38+
ContentBehavior.None,
39+
new TagHelperAttributeDescriptor[] {
40+
new TagHelperAttributeDescriptor("type", inputTypePropertyInfo.Object),
41+
new TagHelperAttributeDescriptor("checked", checkedPropertyInfo.Object)
42+
})
43+
};
4544

4645
// Act & Assert
4746
RunTagHelperTest(testName: "BasicTagHelpers",
4847
baseLineName: "BasicTagHelpers.CustomAttributeCodeGenerator",
49-
tagHelperProvider: tagHelperProvider,
48+
tagHelperDescriptors: tagHelperDescriptors,
5049
hostConfig: (host) =>
5150
{
5251
return new CodeBuilderReplacingHost();

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

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,111 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Collections.Generic;
56
using System.Linq;
67
using Microsoft.AspNet.Razor.Parser;
7-
using Microsoft.AspNet.Razor.Parser.TagHelpers.Internal;
88
using Microsoft.AspNet.Razor.TagHelpers;
99

1010
namespace Microsoft.AspNet.Razor.Test.Generator
1111
{
1212
public class TagHelperTestBase : CSharpRazorCodeGeneratorTest
1313
{
14-
protected void RunTagHelperTest(string testName, TagHelperDescriptorProvider tagHelperProvider)
14+
protected void RunTagHelperTest(string testName, IEnumerable<TagHelperDescriptor> tagHelperDescriptors)
1515
{
16-
RunTagHelperTest(testName, testName, tagHelperProvider, (host) => host);
16+
RunTagHelperTest(testName, testName, tagHelperDescriptors, host => host);
17+
}
18+
19+
protected void RunTagHelperTest(string testName,
20+
bool designTimeMode,
21+
IEnumerable<TagHelperDescriptor> tagHelperDescriptors)
22+
{
23+
RunTagHelperTest(testName, testName, designTimeMode, tagHelperDescriptors);
1724
}
1825

1926
protected void RunTagHelperTest(string testName,
2027
string baseLineName,
21-
TagHelperDescriptorProvider tagHelperProvider,
28+
IEnumerable<TagHelperDescriptor> tagHelperDescriptors,
29+
Func<RazorEngineHost, RazorEngineHost> hostConfig)
30+
{
31+
RunTagHelperTest(testName,
32+
baseLineName,
33+
designTimeMode: false,
34+
tagHelperDescriptors: tagHelperDescriptors,
35+
hostConfig: hostConfig);
36+
}
37+
38+
protected void RunTagHelperTest(string testName,
39+
string baseLineName,
40+
bool designTimeMode,
41+
IEnumerable<TagHelperDescriptor> tagHelperDescriptors)
42+
{
43+
RunTagHelperTest(testName,
44+
baseLineName,
45+
designTimeMode,
46+
tagHelperDescriptors,
47+
hostConfig: host => host);
48+
}
49+
50+
protected void RunTagHelperTest(string testName,
51+
string baseLineName,
52+
bool designTimeMode,
53+
IEnumerable<TagHelperDescriptor> tagHelperDescriptors,
2254
Func<RazorEngineHost, RazorEngineHost> hostConfig)
2355
{
2456
RunTest(name: testName,
2557
baselineName: baseLineName,
58+
designTimeMode: designTimeMode,
59+
tabTest: TabTest.NoTabs,
2660
templateEngineConfig: (engine) =>
2761
{
28-
return new TagHelperTemplateEngine(engine, tagHelperProvider);
62+
return new TagHelperTemplateEngine(engine, tagHelperDescriptors);
2963
},
3064
hostConfig: hostConfig);
3165
}
3266

67+
private class CustomTagHelperDescriptorResolver : ITagHelperDescriptorResolver
68+
{
69+
private IEnumerable<TagHelperDescriptor> _tagHelperDescriptors;
70+
private bool _resolved;
71+
72+
public CustomTagHelperDescriptorResolver(IEnumerable<TagHelperDescriptor> tagHelperDescriptors)
73+
{
74+
_tagHelperDescriptors = tagHelperDescriptors;
75+
}
76+
77+
public IEnumerable<TagHelperDescriptor> Resolve(string lookupText)
78+
{
79+
if (!_resolved)
80+
{
81+
_resolved = true;
82+
83+
return _tagHelperDescriptors;
84+
}
85+
else
86+
{
87+
return Enumerable.Empty<TagHelperDescriptor>();
88+
}
89+
}
90+
}
91+
3392
private class TagHelperTemplateEngine : RazorTemplateEngine
3493
{
35-
private TagHelperDescriptorProvider _tagHelperProvider;
94+
private IEnumerable<TagHelperDescriptor> _tagHelperDescriptors;
3695

37-
public TagHelperTemplateEngine(RazorTemplateEngine engine, TagHelperDescriptorProvider tagHelperProvider)
96+
public TagHelperTemplateEngine(RazorTemplateEngine engine,
97+
IEnumerable<TagHelperDescriptor> tagHelperDescriptors)
3898
: base(engine.Host)
3999
{
40-
_tagHelperProvider = tagHelperProvider;
100+
_tagHelperDescriptors = tagHelperDescriptors;
41101
}
42102

43103
protected internal override RazorParser CreateParser()
44104
{
45105
var parser = base.CreateParser();
46-
var optimizers = parser.Optimizers.Where(opmzr => !(opmzr is TagHelperParseTreeRewriter));
47-
48-
parser.Optimizers = optimizers.Concat(new[] {
49-
new TagHelperParseTreeRewriter(_tagHelperProvider)
50-
}).ToList();
51106

52-
return parser;
107+
return new RazorParser(new CustomTagHelperDescriptorResolver(_tagHelperDescriptors),
108+
parser.CodeParser,
109+
parser.MarkupParser);
53110
}
54111
}
55112
}

0 commit comments

Comments
 (0)