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+ }
0 commit comments