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

Commit c4efe4a

Browse files
author
N. Taylor Mullen
committed
Add tests to verify TagHelperDescriptorResolver functionality.
#99
1 parent e1591a1 commit c4efe4a

File tree

5 files changed

+230
-5
lines changed

5 files changed

+230
-5
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
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;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
8+
using Microsoft.AspNet.Razor.TagHelpers;
9+
using Microsoft.Internal.Web.Utils;
10+
using Xunit;
11+
12+
namespace Microsoft.AspNet.Razor.Runtime.Test.TagHelpers
13+
{
14+
public class TagHelperDescriptorResolverTest
15+
{
16+
private static readonly CompleteTagHelperDescriptorComparer DefaultDescriptorComparer =
17+
new CompleteTagHelperDescriptorComparer();
18+
19+
[Fact]
20+
public void DescriptorResolver_ResolvesOnlyTypeResolverProvidedTypes()
21+
{
22+
// Arrange
23+
var resolver = new TagHelperDescriptorResolver(
24+
new CustomTagHelperTypeResolver(
25+
new Dictionary<string, IEnumerable<Type>>(StringComparer.OrdinalIgnoreCase)
26+
{
27+
{ "lookupText1", new Type[]{ typeof(string), typeof(int) } },
28+
{ "lookupText2", new Type[]{ typeof(object) } }
29+
}));
30+
var expectedDescriptor = new TagHelperDescriptor("Object", "System.Object", ContentBehavior.None);
31+
32+
// Act
33+
var descriptors = resolver.Resolve("lookupText2");
34+
35+
// Assert
36+
var descriptor = Assert.Single(descriptors);
37+
Assert.Equal(descriptor, expectedDescriptor, DefaultDescriptorComparer);
38+
}
39+
40+
[Fact]
41+
public void DescriptorResolver_ResolvesMultipleTypes()
42+
{
43+
// Arrange
44+
var resolver = new TagHelperDescriptorResolver(
45+
new CustomTagHelperTypeResolver(
46+
new Dictionary<string, IEnumerable<Type>>(StringComparer.OrdinalIgnoreCase)
47+
{
48+
{ "lookupText", new Type[]{ typeof(string), typeof(int) } },
49+
}));
50+
var expectedDescriptors = new TagHelperDescriptor[]
51+
{
52+
new TagHelperDescriptor("String", "System.String", ContentBehavior.None),
53+
new TagHelperDescriptor("Int32", "System.Int32", ContentBehavior.None),
54+
};
55+
56+
// Act
57+
var descriptors = resolver.Resolve("lookupText").ToArray();
58+
59+
// Assert
60+
Assert.Equal(descriptors.Length, 2);
61+
Assert.Equal(descriptors, expectedDescriptors, DefaultDescriptorComparer);
62+
}
63+
64+
[Fact]
65+
public void DescriptorResolver_ResolvesCustomTypeWithConventionName()
66+
{
67+
// Arrange
68+
var resolver = new TagHelperDescriptorResolver(
69+
new CustomTagHelperTypeResolver(
70+
new Dictionary<string, IEnumerable<Type>>(StringComparer.OrdinalIgnoreCase)
71+
{
72+
{ "lookupText", new Type[]{ typeof(SingleAttributeTagHelper) } },
73+
}));
74+
var intProp = typeof(SingleAttributeTagHelper).GetProperty(nameof(SingleAttributeTagHelper.IntAttribute));
75+
var expectedDescriptor = new TagHelperDescriptor(
76+
"SingleAttribute",
77+
typeof(SingleAttributeTagHelper).FullName,
78+
ContentBehavior.None,
79+
new[] {
80+
new TagHelperAttributeDescriptor(nameof(SingleAttributeTagHelper.IntAttribute), intProp)
81+
});
82+
83+
// Act
84+
var descriptors = resolver.Resolve("lookupText").ToArray();
85+
86+
// Assert
87+
var descriptor = Assert.Single(descriptors);
88+
Assert.Equal(descriptor, expectedDescriptor, DefaultDescriptorComparer);
89+
}
90+
91+
[Fact]
92+
public void DescriptorResolver_OnlyResolvesPropertiesWithGetAndSet()
93+
{
94+
// Arrange
95+
var resolver = new TagHelperDescriptorResolver(
96+
new CustomTagHelperTypeResolver(
97+
new Dictionary<string, IEnumerable<Type>>(StringComparer.OrdinalIgnoreCase)
98+
{
99+
{ "lookupText", new Type[]{ typeof(TwoInvalidAttributeTagHelper) } },
100+
}));
101+
var validProp = typeof(TwoInvalidAttributeTagHelper).GetProperty(nameof(TwoInvalidAttributeTagHelper.ValidAttribute));
102+
var expectedDescriptor = new TagHelperDescriptor(
103+
"TwoInvalidAttribute",
104+
typeof(TwoInvalidAttributeTagHelper).FullName,
105+
ContentBehavior.None,
106+
new[] {
107+
new TagHelperAttributeDescriptor(nameof(TwoInvalidAttributeTagHelper.ValidAttribute), validProp)
108+
});
109+
110+
// Act
111+
var descriptors = resolver.Resolve("lookupText").ToArray();
112+
113+
// Assert
114+
var descriptor = Assert.Single(descriptors);
115+
Assert.Equal(descriptor, expectedDescriptor, DefaultDescriptorComparer);
116+
}
117+
118+
[Fact]
119+
public void DescriptorResolver_DoesntResolveTypesForInvalidLookupText()
120+
{
121+
// Arrange
122+
var resolver = new TagHelperDescriptorResolver(
123+
new CustomTagHelperTypeResolver(
124+
new Dictionary<string, IEnumerable<Type>>(StringComparer.OrdinalIgnoreCase)
125+
{
126+
{ "lookupText1", new Type[]{ typeof(string), typeof(int) } },
127+
{ "lookupText2", new Type[]{ typeof(object) } }
128+
}));
129+
130+
// Act
131+
var descriptors = resolver.Resolve("lookupText").ToArray();
132+
133+
// Assert
134+
Assert.Empty(descriptors);
135+
}
136+
137+
private class CustomTagHelperTypeResolver : ITagHelperTypeResolver
138+
{
139+
private Dictionary<string, IEnumerable<Type>> _lookupValues;
140+
141+
public CustomTagHelperTypeResolver(Dictionary<string, IEnumerable<Type>> lookupValues)
142+
{
143+
_lookupValues = lookupValues;
144+
}
145+
146+
public IEnumerable<Type> Resolve(string lookupText)
147+
{
148+
IEnumerable<Type> types;
149+
150+
_lookupValues.TryGetValue(lookupText, out types);
151+
152+
return types ?? Enumerable.Empty<Type>();
153+
}
154+
}
155+
156+
private class SingleAttributeTagHelper
157+
{
158+
public int IntAttribute { get; set; }
159+
}
160+
161+
private class TwoInvalidAttributeTagHelper
162+
{
163+
public string ValidAttribute { get; set; }
164+
public string InvalidNoGetAttribute { set { } }
165+
public string InvalidNoSetAttribute { get { return string.Empty; } }
166+
}
167+
168+
private class CompleteTagHelperDescriptorComparer : TagHelperDescriptorComparer
169+
{
170+
public new bool Equals(TagHelperDescriptor descriptorX, TagHelperDescriptor descriptorY)
171+
{
172+
return base.Equals(descriptorX, descriptorY) &&
173+
descriptorX.Attributes.SequenceEqual(descriptorY.Attributes,
174+
CompleteTagHelperAttributeDescriptorComparer.Default);
175+
}
176+
177+
public new int GetHashCode(TagHelperDescriptor descriptor)
178+
{
179+
return HashCodeCombiner.Start()
180+
.Add(base.GetHashCode())
181+
.Add(descriptor.Attributes)
182+
.CombinedHash;
183+
}
184+
}
185+
186+
private class CompleteTagHelperAttributeDescriptorComparer : IEqualityComparer<TagHelperAttributeDescriptor>
187+
{
188+
public static readonly CompleteTagHelperAttributeDescriptorComparer Default =
189+
new CompleteTagHelperAttributeDescriptorComparer();
190+
191+
public bool Equals(TagHelperAttributeDescriptor descriptorX, TagHelperAttributeDescriptor descriptorY)
192+
{
193+
return descriptorX.AttributeName == descriptorY.AttributeName &&
194+
descriptorX.AttributePropertyName == descriptorY.AttributePropertyName;
195+
}
196+
197+
public int GetHashCode(TagHelperAttributeDescriptor descriptor)
198+
{
199+
return HashCodeCombiner.Start()
200+
.Add(descriptor.AttributeName)
201+
.Add(descriptor.AttributePropertyName)
202+
.CombinedHash;
203+
}
204+
}
205+
}
206+
}

test/Microsoft.AspNet.Razor.Runtime.Test/project.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"dependencies": {
3+
"Microsoft.AspNet.Razor.Runtime": "",
34
"Microsoft.AspNet.Razor.Test": ""
45
},
56
"commands": {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.AspNet.Razor.Parser;
1010
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
1111
using Microsoft.AspNet.Razor.TagHelpers;
12+
using Microsoft.AspNet.Razor.Test.TagHelpers;
1213
using Xunit;
1314

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

225-
var parser = new RazorParser(new TagHelperDescriptorResolver(),
226+
var parser = new RazorParser(new TestTagHelperDescriptorResolver(),
226227
new CSharpCodeParser(),
227228
new HtmlMarkupParser());
228229

test/Microsoft.AspNet.Razor.Test/Parser/RazorParserTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
using System.IO;
66
using Microsoft.AspNet.Razor.Parser;
77
using Microsoft.AspNet.Razor.Parser.SyntaxTree;
8-
using Microsoft.AspNet.Razor.TagHelpers;
98
using Microsoft.AspNet.Razor.Test.Framework;
9+
using Microsoft.AspNet.Razor.Test.TagHelpers;
1010
using Xunit;
1111

1212
namespace Microsoft.AspNet.Razor.Test.Parser
@@ -42,7 +42,7 @@ public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
4242
var factory = SpanFactory.CreateCsHtml();
4343

4444
// Arrange
45-
RazorParser parser = new RazorParser(new TagHelperDescriptorResolver(),
45+
RazorParser parser = new RazorParser(new TestTagHelperDescriptorResolver(),
4646
new CSharpCodeParser(),
4747
new HtmlMarkupParser());
4848

@@ -64,7 +64,7 @@ public void ParseMethodUsesProvidedParserListenerIfSpecified()
6464
var factory = SpanFactory.CreateCsHtml();
6565

6666
// Arrange
67-
RazorParser parser = new RazorParser(new TagHelperDescriptorResolver(),
67+
RazorParser parser = new RazorParser(new TestTagHelperDescriptorResolver(),
6868
new CSharpCodeParser(),
6969
new HtmlMarkupParser());
7070

@@ -94,7 +94,7 @@ private static void RunParseWithListenerTest(Action<RazorParser, TextReader> par
9494
// Arrange
9595
ParserBase markupParser = new MockMarkupParser();
9696
ParserBase codeParser = new CSharpCodeParser();
97-
RazorParser parser = new RazorParser(new TagHelperDescriptorResolver(), codeParser, markupParser);
97+
RazorParser parser = new RazorParser(new TestTagHelperDescriptorResolver(), codeParser, markupParser);
9898
TextReader expectedReader = new StringReader("foo");
9999

100100
// Act
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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.Collections.Generic;
5+
using System.Linq;
6+
using Microsoft.AspNet.Razor.TagHelpers;
7+
8+
namespace Microsoft.AspNet.Razor.Test.TagHelpers
9+
{
10+
internal class TestTagHelperDescriptorResolver : ITagHelperDescriptorResolver
11+
{
12+
public IEnumerable<TagHelperDescriptor> Resolve(string lookupText)
13+
{
14+
return Enumerable.Empty<TagHelperDescriptor>();
15+
}
16+
}
17+
}

0 commit comments

Comments
 (0)