diff --git a/src/Microsoft.AspNet.Razor.Test.Sources/TagHelperAttributeDescriptorComparer.cs b/src/Microsoft.AspNet.Razor.Test.Sources/TagHelperAttributeDescriptorComparer.cs index 3c1d4e077f..3be8b7c23e 100644 --- a/src/Microsoft.AspNet.Razor.Test.Sources/TagHelperAttributeDescriptorComparer.cs +++ b/src/Microsoft.AspNet.Razor.Test.Sources/TagHelperAttributeDescriptorComparer.cs @@ -30,6 +30,7 @@ namespace Microsoft.AspNet.Razor.Test.Internal string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal) && string.Equals(descriptorX.PropertyName, descriptorY.PropertyName, StringComparison.Ordinal) && string.Equals(descriptorX.TypeName, descriptorY.TypeName, StringComparison.Ordinal) && + descriptorX.IsStringProperty == descriptorY.IsStringProperty && TagHelperAttributeDesignTimeDescriptorComparer.Default.Equals( descriptorX.DesignTimeDescriptor, descriptorY.DesignTimeDescriptor); @@ -37,13 +38,12 @@ namespace Microsoft.AspNet.Razor.Test.Internal public int GetHashCode(TagHelperAttributeDescriptor descriptor) { - // Ignore IsStringProperty because it is directly inferred from TypeName and thus won't vary the hash - // bucket. return HashCodeCombiner.Start() .Add(descriptor.IsIndexer) .Add(descriptor.Name, StringComparer.Ordinal) .Add(descriptor.PropertyName, StringComparer.Ordinal) .Add(descriptor.TypeName, StringComparer.Ordinal) + .Add(descriptor.IsStringProperty) .Add(TagHelperAttributeDesignTimeDescriptorComparer.Default.GetHashCode( descriptor.DesignTimeDescriptor)) .CombinedHash; diff --git a/src/Microsoft.AspNet.Razor/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Razor/Properties/AssemblyInfo.cs index 7854351698..76531b6add 100644 --- a/src/Microsoft.AspNet.Razor/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Razor/Properties/AssemblyInfo.cs @@ -5,5 +5,4 @@ using System.Reflection; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.AspNet.Razor.Test")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Razor.Runtime.Test")] [assembly: AssemblyMetadata("Serviceable", "True")] diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs index 37bcfca618..270c29c34b 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs @@ -114,19 +114,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( - tagName: "inherited-editor-browsable", - typeName: typeof(InheritedEditorBrowsableTagHelper).FullName, - assemblyName: AssemblyName, - attributes: new[] - { - new TagHelperAttributeDescriptor( - name: "property", - propertyName: nameof(InheritedEditorBrowsableTagHelper.Property), - typeName: typeof(int).FullName, - isIndexer: false, - designTimeDescriptor: null) - }) + CreateTagHelperDescriptor( + tagName: "inherited-editor-browsable", + typeName: typeof(InheritedEditorBrowsableTagHelper).FullName, + assemblyName: AssemblyName, + attributes: new[] + { + new TagHelperAttributeDescriptor( + name: "property", + propertyName: nameof(InheritedEditorBrowsableTagHelper.Property), + typeName: typeof(int).FullName, + isIndexer: false, + designTimeDescriptor: null) + }) } }, { typeof(EditorBrowsableTagHelper), true, new TagHelperDescriptor[0] }, @@ -135,19 +135,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers false, new[] { - new TagHelperDescriptor( - tagName: "editor-browsable", - typeName: typeof(EditorBrowsableTagHelper).FullName, - assemblyName: AssemblyName, - attributes: new[] - { - new TagHelperAttributeDescriptor( - name: "property", - propertyName: nameof(EditorBrowsableTagHelper.Property), - typeName: typeof(int).FullName, - isIndexer: false, - designTimeDescriptor: null) - }) + CreateTagHelperDescriptor( + tagName: "editor-browsable", + typeName: typeof(EditorBrowsableTagHelper).FullName, + assemblyName: AssemblyName, + attributes: new[] + { + new TagHelperAttributeDescriptor( + name: "property", + propertyName: nameof(EditorBrowsableTagHelper.Property), + typeName: typeof(int).FullName, + isIndexer: false, + designTimeDescriptor: null) + }) } }, { @@ -155,11 +155,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( - tagName: "hidden-property-editor-browsable", - typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, - assemblyName: AssemblyName, - attributes: new TagHelperAttributeDescriptor[0]) + CreateTagHelperDescriptor( + tagName: "hidden-property-editor-browsable", + typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, + assemblyName: AssemblyName, + attributes: new TagHelperAttributeDescriptor[0]) } }, { @@ -167,19 +167,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers false, new[] { - new TagHelperDescriptor( - tagName: "hidden-property-editor-browsable", - typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, - assemblyName: AssemblyName, - attributes: new[] - { - new TagHelperAttributeDescriptor( - name: "property", - propertyName: nameof(HiddenPropertyEditorBrowsableTagHelper.Property), - typeName: typeof(int).FullName, - isIndexer: false, - designTimeDescriptor: null) - }) + CreateTagHelperDescriptor( + tagName: "hidden-property-editor-browsable", + typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, + assemblyName: AssemblyName, + attributes: new[] + { + new TagHelperAttributeDescriptor( + name: "property", + propertyName: nameof(HiddenPropertyEditorBrowsableTagHelper.Property), + typeName: typeof(int).FullName, + isIndexer: false, + designTimeDescriptor: null) + }) } }, { @@ -187,7 +187,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( tagName: "overridden-editor-browsable", typeName: typeof(OverriddenEditorBrowsableTagHelper).FullName, assemblyName: AssemblyName, @@ -207,7 +207,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( tagName: "multi-property-editor-browsable", typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName, assemblyName: AssemblyName, @@ -227,7 +227,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers false, new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( tagName: "multi-property-editor-browsable", typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName, assemblyName: AssemblyName, @@ -253,7 +253,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( tagName: "overridden-property-editor-browsable", typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName, assemblyName: AssemblyName, @@ -265,7 +265,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers false, new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( tagName: "overridden-property-editor-browsable", typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName, assemblyName: AssemblyName, @@ -292,19 +292,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers true, new[] { - new TagHelperDescriptor( - tagName: "default-editor-browsable", - typeName: typeof(DefaultEditorBrowsableTagHelper).FullName, - assemblyName: AssemblyName, - attributes: new[] - { - new TagHelperAttributeDescriptor( - name: "property", - propertyName: nameof(DefaultEditorBrowsableTagHelper.Property), - typeName: typeof(int).FullName, - isIndexer: false, - designTimeDescriptor: null) - }) + CreateTagHelperDescriptor( + tagName: "default-editor-browsable", + typeName: typeof(DefaultEditorBrowsableTagHelper).FullName, + assemblyName: AssemblyName, + attributes: new[] + { + new TagHelperAttributeDescriptor( + name: "property", + propertyName: nameof(DefaultEditorBrowsableTagHelper.Property), + typeName: typeof(int).FullName, + isIndexer: false, + designTimeDescriptor: null) + }) } }, { typeof(MultiEditorBrowsableTagHelper), true, new TagHelperDescriptor[0] } @@ -347,7 +347,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(AttributeTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(AttributeTargetingTagHelper).FullName, AssemblyName, @@ -359,7 +359,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiAttributeTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(MultiAttributeTargetingTagHelper).FullName, AssemblyName, @@ -371,13 +371,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiAttributeAttributeTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(MultiAttributeAttributeTargetingTagHelper).FullName, AssemblyName, attributes, requiredAttributes: new[] { "custom" }), - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(MultiAttributeAttributeTargetingTagHelper).FullName, AssemblyName, @@ -389,7 +389,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(InheritedAttributeTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(InheritedAttributeTargetingTagHelper).FullName, AssemblyName, @@ -401,7 +401,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(RequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(RequiredAttributeTagHelper).FullName, AssemblyName, @@ -413,7 +413,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(InheritedRequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "div", typeof(InheritedRequiredAttributeTagHelper).FullName, AssemblyName, @@ -425,13 +425,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiAttributeRequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "div", typeof(MultiAttributeRequiredAttributeTagHelper).FullName, AssemblyName, attributes, requiredAttributes: new[] { "class" }), - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(MultiAttributeRequiredAttributeTagHelper).FullName, AssemblyName, @@ -443,13 +443,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiAttributeSameTagRequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName, AssemblyName, attributes, requiredAttributes: new[] { "style" }), - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName, AssemblyName, @@ -461,7 +461,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiRequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(MultiRequiredAttributeTagHelper).FullName, AssemblyName, @@ -473,13 +473,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiTagMultiRequiredAttributeTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "div", typeof(MultiTagMultiRequiredAttributeTagHelper).FullName, AssemblyName, attributes, requiredAttributes: new[] { "class", "style" }), - new TagHelperDescriptor( + CreateTagHelperDescriptor( "input", typeof(MultiTagMultiRequiredAttributeTagHelper).FullName, AssemblyName, @@ -491,7 +491,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(AttributeWildcardTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(AttributeWildcardTargetingTagHelper).FullName, AssemblyName, @@ -503,7 +503,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(MultiAttributeWildcardTargetingTagHelper), new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( TagHelperDescriptorProvider.ElementCatchAllTarget, typeof(MultiAttributeWildcardTargetingTagHelper).FullName, AssemblyName, @@ -599,14 +599,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(OverriddenAttributeTagHelper.ValidAttribute2)); var expectedDescriptors = new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "overridden-attribute", typeof(OverriddenAttributeTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("SomethingElse", validProperty1), - new TagHelperAttributeDescriptor("Something-Else", validProperty2) + CreateTagHelperAttributeDescriptor("SomethingElse", validProperty1), + CreateTagHelperAttributeDescriptor("Something-Else", validProperty2) }) }; @@ -633,14 +633,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(InheritedOverriddenAttributeTagHelper.ValidAttribute2)); var expectedDescriptors = new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "inherited-overridden-attribute", typeof(InheritedOverriddenAttributeTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("valid-attribute1", validProperty1), - new TagHelperAttributeDescriptor("Something-Else", validProperty2) + CreateTagHelperAttributeDescriptor("valid-attribute1", validProperty1), + CreateTagHelperAttributeDescriptor("Something-Else", validProperty2) }) }; @@ -667,14 +667,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(InheritedNotOverriddenAttributeTagHelper.ValidAttribute2)); var expectedDescriptors = new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "inherited-not-overridden-attribute", typeof(InheritedNotOverriddenAttributeTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("SomethingElse", validProperty1), - new TagHelperAttributeDescriptor("Something-Else", validProperty2) + CreateTagHelperAttributeDescriptor("SomethingElse", validProperty1), + CreateTagHelperAttributeDescriptor("Something-Else", validProperty2) }) }; @@ -697,7 +697,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var errorSink = new ErrorSink(); var objectAssemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name; var expectedDescriptor = - new TagHelperDescriptor("object", "System.Object", objectAssemblyName); + CreateTagHelperDescriptor("object", "System.Object", objectAssemblyName); // Act var descriptors = TagHelperDescriptorFactory.CreateDescriptors( @@ -717,9 +717,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { // Arrange var errorSink = new ErrorSink(); - - // Also confirm isStringProperty is calculated correctly. - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "inherited-single-attribute", typeof(InheritedSingleAttributeTagHelper).FullName, AssemblyName, @@ -730,7 +728,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(InheritedSingleAttributeTagHelper.IntAttribute), typeof(int).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null) }); @@ -753,13 +750,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // Arrange var errorSink = new ErrorSink(); var intProperty = typeof(SingleAttributeTagHelper).GetProperty(nameof(SingleAttributeTagHelper.IntAttribute)); - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "single-attribute", typeof(SingleAttributeTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("int-attribute", intProperty) + CreateTagHelperAttributeDescriptor("int-attribute", intProperty) }); // Act @@ -782,13 +779,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var errorSink = new ErrorSink(); var validProperty = typeof(MissingAccessorTagHelper).GetProperty( nameof(MissingAccessorTagHelper.ValidAttribute)); - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "missing-accessor", typeof(MissingAccessorTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("valid-attribute", validProperty) + CreateTagHelperAttributeDescriptor("valid-attribute", validProperty) }); // Act @@ -811,13 +808,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var errorSink = new ErrorSink(); var validProperty = typeof(NonPublicAccessorTagHelper).GetProperty( nameof(NonPublicAccessorTagHelper.ValidAttribute)); - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "non-public-accessor", typeof(NonPublicAccessorTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("valid-attribute", validProperty) + CreateTagHelperAttributeDescriptor("valid-attribute", validProperty) }); // Act @@ -838,9 +835,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { // Arrange var errorSink = new ErrorSink(); - - // Also confirm isStringProperty is calculated correctly. - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "not-bound-attribute", typeof(NotBoundAttributeTagHelper).FullName, AssemblyName, @@ -851,7 +846,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(NotBoundAttributeTagHelper.BoundProperty), typeof(object).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null) }); @@ -891,11 +885,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { // Arrange var errorSink = new ErrorSink(); - - // Also confirm isStringProperty is calculated correctly. var expectedDescriptors = new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "div", typeof(MultiTagTagHelper).FullName, AssemblyName, @@ -906,10 +898,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(MultiTagTagHelper.ValidAttribute), typeof(string).FullName, isIndexer: false, - isStringProperty: true, designTimeDescriptor: null) }), - new TagHelperDescriptor( + CreateTagHelperDescriptor( "p", typeof(MultiTagTagHelper).FullName, AssemblyName, @@ -920,7 +911,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers nameof(MultiTagTagHelper.ValidAttribute), typeof(string).FullName, isIndexer: false, - isStringProperty: true, designTimeDescriptor: null) }) }; @@ -948,13 +938,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // Arrange var errorSink = new ErrorSink(); var validProp = typeof(InheritedMultiTagTagHelper).GetProperty(nameof(InheritedMultiTagTagHelper.ValidAttribute)); - var expectedDescriptor = new TagHelperDescriptor( + var expectedDescriptor = CreateTagHelperDescriptor( "inherited-multi-tag", typeof(InheritedMultiTagTagHelper).FullName, AssemblyName, new[] { - new TagHelperAttributeDescriptor("valid-attribute", validProp) + CreateTagHelperAttributeDescriptor("valid-attribute", validProp) }); // Act @@ -977,11 +967,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var errorSink = new ErrorSink(); var expectedDescriptors = new[] { - new TagHelperDescriptor( + CreateTagHelperDescriptor( "div", typeof(DuplicateTagNameTagHelper).FullName, AssemblyName), - new TagHelperDescriptor( + CreateTagHelperDescriptor( "p", typeof(DuplicateTagNameTagHelper).FullName, AssemblyName) @@ -1011,9 +1001,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var errorSink = new ErrorSink(); var expectedDescriptors = new[] { - new TagHelperDescriptor("data-condition", - typeof(OverrideNameTagHelper).FullName, - AssemblyName), + CreateTagHelperDescriptor( + "data-condition", + typeof(OverrideNameTagHelper).FullName, + AssemblyName), }; // Act @@ -1141,7 +1132,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(InvalidBoundAttributeWithValid), new[] { - new TagHelperAttributeDescriptor( + CreateTagHelperAttributeDescriptor( "int-attribute", typeof(InvalidBoundAttributeWithValid) .GetProperty(nameof(InvalidBoundAttributeWithValid.IntAttribute))) @@ -1159,7 +1150,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers typeof(OverriddenInvalidBoundAttributeWithValid), new[] { - new TagHelperAttributeDescriptor( + CreateTagHelperAttributeDescriptor( "valid-something", typeof(OverriddenInvalidBoundAttributeWithValid) .GetProperty(nameof(OverriddenInvalidBoundAttributeWithValid.DataSomething))) @@ -1253,14 +1244,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(IDictionary).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "dictionary-property-", propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(string).FullName, isIndexer: true, - isStringProperty: true, designTimeDescriptor: null), }, new string[0] @@ -1274,14 +1263,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(IDictionary).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name-", propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(string).FullName, isIndexer: true, - isStringProperty: true, designTimeDescriptor: null), }, new string[0] @@ -1295,91 +1282,78 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(Dictionary).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name2", propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty), typeName: typeof(DictionarySubclass).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name3", propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty), typeName: typeof(DictionaryWithoutParameterlessConstructor).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name4", propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty), typeName: typeof(GenericDictionarySubclass).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name5", propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty), typeName: typeof(SortedDictionary).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-name6", propertyName: nameof(MultipleValidHtmlAttributePrefix.StringProperty), typeName: typeof(string).FullName, isIndexer: false, - isStringProperty: true, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix1-", propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty), typeName: typeof(object).FullName, isIndexer: true, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix2-", propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty), typeName: typeof(string).FullName, isIndexer: true, - isStringProperty: true, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix3-", propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty), typeName: typeof(string).FullName, isIndexer: true, - isStringProperty: true, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix4-", propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty), typeName: typeof(object).FullName, isIndexer: true, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix5-", propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty), typeName: typeof(int).FullName, isIndexer: true, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "get-only-dictionary-property-", propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryProperty), typeName: typeof(int).FullName, isIndexer: true, - isStringProperty: false, designTimeDescriptor: null), new TagHelperAttributeDescriptor( name: "valid-prefix6", propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryPropertyWithAttributePrefix), typeName: typeof(string).FullName, isIndexer: true, - isStringProperty: true, designTimeDescriptor: null), }, new string[0] @@ -1403,7 +1377,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers propertyName: nameof(MultipleInvalidHtmlAttributePrefix.LongProperty), typeName: typeof(long).FullName, isIndexer: false, - isStringProperty: false, designTimeDescriptor: null), }, new[] @@ -1883,6 +1856,35 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers return data; } + private static TagHelperDescriptor CreateTagHelperDescriptor( + string tagName, + string typeName, + string assemblyName, + IEnumerable attributes = null, + IEnumerable requiredAttributes = null) + { + return new TagHelperDescriptor( + prefix: string.Empty, + tagName: tagName, + typeName: typeName, + assemblyName: assemblyName, + attributes: attributes ?? Enumerable.Empty(), + requiredAttributes: requiredAttributes ?? Enumerable.Empty(), + designTimeDescriptor: null); + } + + private static TagHelperAttributeDescriptor CreateTagHelperAttributeDescriptor( + string name, + PropertyInfo propertyInfo) + { + return new TagHelperAttributeDescriptor( + name, + propertyInfo.Name, + propertyInfo.PropertyType.FullName, + isIndexer: false, + designTimeDescriptor: null); + } + [EditorBrowsable(EditorBrowsableState.Always)] private class DefaultEditorBrowsableTagHelper : TagHelper { diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorResolverTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorResolverTest.cs index 2f414830ae..06ac46da7f 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorResolverTest.cs +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorResolverTest.cs @@ -25,9 +25,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { get { - return new TagHelperDescriptor("valid_plain", - Valid_PlainTagHelperType.FullName, - AssemblyName); + return new TagHelperDescriptor( + prefix: string.Empty, + tagName: "valid_plain", + typeName: Valid_PlainTagHelperType.FullName, + assemblyName: AssemblyName, + attributes: Enumerable.Empty(), + requiredAttributes: Enumerable.Empty(), + designTimeDescriptor: null); } } @@ -35,9 +40,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { get { - return new TagHelperDescriptor("valid_inherited", - Valid_InheritedTagHelperType.FullName, - AssemblyName); + return new TagHelperDescriptor( + prefix: string.Empty, + tagName: "valid_inherited", + typeName: Valid_InheritedTagHelperType.FullName, + assemblyName: AssemblyName, + attributes: Enumerable.Empty(), + requiredAttributes: Enumerable.Empty(), + designTimeDescriptor: null); } } @@ -365,8 +375,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -376,8 +386,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -387,10 +397,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) + CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) }, new [] { CreatePrefixedValidPlainDescriptor("th:") } }, @@ -398,8 +408,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) }, new [] { @@ -411,11 +421,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("th-", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("th-", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Inherited*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, @@ -429,11 +439,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Inherited*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, @@ -443,13 +453,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Inherited*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) + CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) }, new [] { @@ -461,11 +471,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor("th", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("th", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), }, @@ -480,11 +490,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers defaultAssemblyLookups, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("th:-", TagHelperDirectiveType.TagHelperPrefix), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("th:-", TagHelperDirectiveType.TagHelperPrefix), + CreateTagHelperDirectiveDescriptor( "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), }, @@ -534,7 +544,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // Arrange var tagHelperDescriptorResolver = new AssemblyCheckingTagHelperDescriptorResolver(); var context = new TagHelperDescriptorResolutionContext( - new[] { new TagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper) }, + new[] { CreateTagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper) }, new ErrorSink()); // Act @@ -556,9 +566,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // We're treating 'string' as a TagHelper so we can test TagHelpers in multiple assemblies without // building a separate assembly with a single TagHelper. var stringTagHelperDescriptor = - new TagHelperDescriptor("string", - "System.String", - assemblyB); + new TagHelperDescriptor( + prefix: string.Empty, + tagName: "string", + typeName: "System.String", + assemblyName: assemblyB, + attributes: Enumerable.Empty(), + requiredAttributes: Enumerable.Empty(), + designTimeDescriptor: null); return new TheoryData>, // descriptorAssemblyLookups IEnumerable, // directiveDescriptors @@ -571,7 +586,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_PlainTagHelperDescriptor } }, @@ -583,8 +598,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_PlainTagHelperDescriptor, stringTagHelperDescriptor } }, @@ -596,8 +611,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) }, new [] { Valid_PlainTagHelperDescriptor } }, @@ -609,9 +624,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) }, new [] { stringTagHelperDescriptor } }, @@ -622,10 +637,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor } }, @@ -636,8 +651,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) }, @@ -650,11 +665,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } }, @@ -665,8 +680,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } }, @@ -677,7 +692,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.Namespace + ".Valid_Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -690,7 +705,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.Namespace + ".Valid?Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -703,7 +718,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -716,7 +731,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*Plain?*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -729,7 +744,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( Valid_PlainTagHelperType.Namespace + "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -742,7 +757,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*_*lain*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -755,7 +770,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*?*l?in*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -768,7 +783,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -781,7 +796,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), }, @@ -794,8 +809,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor( "*_*la*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) }, @@ -808,11 +823,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor( "*Plain*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } }, @@ -823,11 +838,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor( "?*Plain*?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } }, @@ -839,8 +854,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*ring, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*ring, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) }, new [] { Valid_PlainTagHelperDescriptor } }, @@ -852,8 +867,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("?*?, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*?r?n?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("?*?, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*?r?n?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) }, new [] { Valid_PlainTagHelperDescriptor } }, @@ -865,8 +880,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("?*TagHelper, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.AddTagHelper) + CreateTagHelperDirectiveDescriptor("?*TagHelper, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.AddTagHelper) }, new [] { Valid_PlainTagHelperDescriptor } }, @@ -878,9 +893,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) }, new [] { stringTagHelperDescriptor } }, @@ -892,9 +907,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*????*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*?, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("Microsoft?*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*????*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*?, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("Microsoft?*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) }, new [] { stringTagHelperDescriptor } }, @@ -906,13 +921,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "?Microsoft*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) }, new [] @@ -930,13 +945,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( "Microsoft*TagHelper?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor( + CreateTagHelperDirectiveDescriptor( stringType.FullName + "?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) }, new [] @@ -986,9 +1001,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers var assemblyB = stringType.GetTypeInfo().Assembly.GetName().Name; var stringTagHelperDescriptor = - new TagHelperDescriptor("string", - "System.String", - assemblyB); + new TagHelperDescriptor( + prefix: string.Empty, + tagName: "string", + typeName: "System.String", + assemblyName: assemblyB, + attributes: Enumerable.Empty(), + requiredAttributes: Enumerable.Empty(), + designTimeDescriptor: null); return new TheoryData>, // descriptorAssemblyLookups IEnumerable> // directiveDescriptors @@ -1000,8 +1020,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), } }, { @@ -1011,9 +1031,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) } }, { @@ -1024,10 +1044,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) } }, { @@ -1038,19 +1058,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor(stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor(stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) } }, { new Dictionary>(), new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), } }, { @@ -1060,8 +1080,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*TagHelper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*TagHelper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), } }, { @@ -1071,8 +1091,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*TagHelpe?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*TagHelpe?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), } }, { @@ -1082,9 +1102,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("*_*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*Plain*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("*_*Inhe*ed*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("*_*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*Plain*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("*_*Inhe*ed*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) } }, { @@ -1095,10 +1115,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*Helper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*Helper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) } }, { @@ -1109,10 +1129,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("?icrosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("?ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("*?????r, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), - new TagHelperDirectiveDescriptor("Sy??em.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) + CreateTagHelperDirectiveDescriptor("?icrosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("?ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("*?????r, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), + CreateTagHelperDirectiveDescriptor("Sy??em.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) } }, { @@ -1123,8 +1143,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers }, new [] { - new TagHelperDirectiveDescriptor("?i?crosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), - new TagHelperDirectiveDescriptor("??ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("?i?crosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), + CreateTagHelperDirectiveDescriptor("??ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), } }, }; @@ -1402,6 +1422,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers assemblyName: stringType.GetTypeInfo().Assembly.GetName().Name); } + private static TagHelperDirectiveDescriptor CreateTagHelperDirectiveDescriptor( + string directiveText, + TagHelperDirectiveType directiveType) + { + return new TagHelperDirectiveDescriptor(directiveText, SourceLocation.Zero, directiveType); + } + private class TestTagHelperDescriptorResolver : TagHelperDescriptorResolver { public TestTagHelperDescriptorResolver(TagHelperTypeResolver typeResolver) @@ -1415,7 +1442,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers new TagHelperDescriptorResolutionContext( lookupTexts.Select( lookupText => - new TagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper)), + CreateTagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper)), new ErrorSink())); } } diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/project.json b/test/Microsoft.AspNet.Razor.Runtime.Test/project.json index b0b13a79cd..8de0fb84b2 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/project.json +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/project.json @@ -7,6 +7,10 @@ "type": "build" }, "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Framework.HashCodeCombiner.Sources": { + "type": "build", + "version": "1.0.0-*" + }, "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperAttributeDescriptorTest.cs b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperAttributeDescriptorTest.cs new file mode 100644 index 0000000000..a979d40025 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperAttributeDescriptorTest.cs @@ -0,0 +1,50 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Razor.TagHelpers; +using Xunit; + +namespace Microsoft.AspNet.Razor.Test.TagHelpers +{ + public class TagHelperAttributeDescriptorTest + { + public static TheoryData IsStringPropertyData + { + get + { + // attributeType, isIndexer, expectedIsStringProperty + return new TheoryData + { + { typeof(int), false, false }, + { typeof(string), false, true }, + { typeof(string), true, true }, + { typeof(object), false, false }, + { typeof(IEnumerable), false, false }, + { typeof(IDictionary), false, false }, + { typeof(IDictionary), true, false }, + }; + } + } + + [Theory] + [MemberData(nameof(IsStringPropertyData))] + public void TagHelperAttributeDescriptor_IsStringPropertySetCorrectly( + Type attributeType, + bool isIndexer, + bool expectedIsStringProperty) + { + // Arrange + var attributeDescriptor = new TagHelperAttributeDescriptor( + "someAttribute", + "someProperty", + attributeType.FullName, + isIndexer, + designTimeDescriptor: null); + + // Assert + Assert.Equal(expectedIsStringProperty, attributeDescriptor.IsStringProperty); + } + } +}