Removed extra IVT from `Microsoft.AspNet.Razor`.

- Added tests to validate `IsStringProperty` on `TagHelperAttributeDescriptor`s.

#464
This commit is contained in:
N. Taylor Mullen 2015-07-28 10:42:42 -07:00
parent e722f90481
commit 3b5692a5a5
6 changed files with 344 additions and 262 deletions

View File

@ -30,6 +30,7 @@ namespace Microsoft.AspNet.Razor.Test.Internal
string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal) && string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal) &&
string.Equals(descriptorX.PropertyName, descriptorY.PropertyName, StringComparison.Ordinal) && string.Equals(descriptorX.PropertyName, descriptorY.PropertyName, StringComparison.Ordinal) &&
string.Equals(descriptorX.TypeName, descriptorY.TypeName, StringComparison.Ordinal) && string.Equals(descriptorX.TypeName, descriptorY.TypeName, StringComparison.Ordinal) &&
descriptorX.IsStringProperty == descriptorY.IsStringProperty &&
TagHelperAttributeDesignTimeDescriptorComparer.Default.Equals( TagHelperAttributeDesignTimeDescriptorComparer.Default.Equals(
descriptorX.DesignTimeDescriptor, descriptorX.DesignTimeDescriptor,
descriptorY.DesignTimeDescriptor); descriptorY.DesignTimeDescriptor);
@ -37,13 +38,12 @@ namespace Microsoft.AspNet.Razor.Test.Internal
public int GetHashCode(TagHelperAttributeDescriptor descriptor) 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() return HashCodeCombiner.Start()
.Add(descriptor.IsIndexer) .Add(descriptor.IsIndexer)
.Add(descriptor.Name, StringComparer.Ordinal) .Add(descriptor.Name, StringComparer.Ordinal)
.Add(descriptor.PropertyName, StringComparer.Ordinal) .Add(descriptor.PropertyName, StringComparer.Ordinal)
.Add(descriptor.TypeName, StringComparer.Ordinal) .Add(descriptor.TypeName, StringComparer.Ordinal)
.Add(descriptor.IsStringProperty)
.Add(TagHelperAttributeDesignTimeDescriptorComparer.Default.GetHashCode( .Add(TagHelperAttributeDesignTimeDescriptorComparer.Default.GetHashCode(
descriptor.DesignTimeDescriptor)) descriptor.DesignTimeDescriptor))
.CombinedHash; .CombinedHash;

View File

@ -5,5 +5,4 @@ using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNet.Razor.Test")] [assembly: InternalsVisibleTo("Microsoft.AspNet.Razor.Test")]
[assembly: InternalsVisibleTo("Microsoft.AspNet.Razor.Runtime.Test")]
[assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("Serviceable", "True")]

View File

@ -114,19 +114,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "inherited-editor-browsable", tagName: "inherited-editor-browsable",
typeName: typeof(InheritedEditorBrowsableTagHelper).FullName, typeName: typeof(InheritedEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
attributes: new[] attributes: new[]
{ {
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "property", name: "property",
propertyName: nameof(InheritedEditorBrowsableTagHelper.Property), propertyName: nameof(InheritedEditorBrowsableTagHelper.Property),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: false, isIndexer: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}) })
} }
}, },
{ typeof(EditorBrowsableTagHelper), true, new TagHelperDescriptor[0] }, { typeof(EditorBrowsableTagHelper), true, new TagHelperDescriptor[0] },
@ -135,19 +135,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
false, false,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "editor-browsable", tagName: "editor-browsable",
typeName: typeof(EditorBrowsableTagHelper).FullName, typeName: typeof(EditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
attributes: new[] attributes: new[]
{ {
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "property", name: "property",
propertyName: nameof(EditorBrowsableTagHelper.Property), propertyName: nameof(EditorBrowsableTagHelper.Property),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: false, isIndexer: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}) })
} }
}, },
{ {
@ -155,11 +155,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "hidden-property-editor-browsable", tagName: "hidden-property-editor-browsable",
typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
attributes: new TagHelperAttributeDescriptor[0]) attributes: new TagHelperAttributeDescriptor[0])
} }
}, },
{ {
@ -167,19 +167,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
false, false,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "hidden-property-editor-browsable", tagName: "hidden-property-editor-browsable",
typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(HiddenPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
attributes: new[] attributes: new[]
{ {
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "property", name: "property",
propertyName: nameof(HiddenPropertyEditorBrowsableTagHelper.Property), propertyName: nameof(HiddenPropertyEditorBrowsableTagHelper.Property),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: false, isIndexer: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}) })
} }
}, },
{ {
@ -187,7 +187,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "overridden-editor-browsable", tagName: "overridden-editor-browsable",
typeName: typeof(OverriddenEditorBrowsableTagHelper).FullName, typeName: typeof(OverriddenEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
@ -207,7 +207,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "multi-property-editor-browsable", tagName: "multi-property-editor-browsable",
typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
@ -227,7 +227,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
false, false,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "multi-property-editor-browsable", tagName: "multi-property-editor-browsable",
typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(MultiPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
@ -253,7 +253,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "overridden-property-editor-browsable", tagName: "overridden-property-editor-browsable",
typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
@ -265,7 +265,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
false, false,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "overridden-property-editor-browsable", tagName: "overridden-property-editor-browsable",
typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName, typeName: typeof(OverriddenPropertyEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
@ -292,19 +292,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
true, true,
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
tagName: "default-editor-browsable", tagName: "default-editor-browsable",
typeName: typeof(DefaultEditorBrowsableTagHelper).FullName, typeName: typeof(DefaultEditorBrowsableTagHelper).FullName,
assemblyName: AssemblyName, assemblyName: AssemblyName,
attributes: new[] attributes: new[]
{ {
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "property", name: "property",
propertyName: nameof(DefaultEditorBrowsableTagHelper.Property), propertyName: nameof(DefaultEditorBrowsableTagHelper.Property),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: false, isIndexer: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}) })
} }
}, },
{ typeof(MultiEditorBrowsableTagHelper), true, new TagHelperDescriptor[0] } { typeof(MultiEditorBrowsableTagHelper), true, new TagHelperDescriptor[0] }
@ -347,7 +347,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(AttributeTargetingTagHelper), typeof(AttributeTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(AttributeTargetingTagHelper).FullName, typeof(AttributeTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -359,7 +359,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiAttributeTargetingTagHelper), typeof(MultiAttributeTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(MultiAttributeTargetingTagHelper).FullName, typeof(MultiAttributeTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -371,13 +371,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiAttributeAttributeTargetingTagHelper), typeof(MultiAttributeAttributeTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(MultiAttributeAttributeTargetingTagHelper).FullName, typeof(MultiAttributeAttributeTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
attributes, attributes,
requiredAttributes: new[] { "custom" }), requiredAttributes: new[] { "custom" }),
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(MultiAttributeAttributeTargetingTagHelper).FullName, typeof(MultiAttributeAttributeTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -389,7 +389,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(InheritedAttributeTargetingTagHelper), typeof(InheritedAttributeTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(InheritedAttributeTargetingTagHelper).FullName, typeof(InheritedAttributeTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -401,7 +401,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(RequiredAttributeTagHelper), typeof(RequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(RequiredAttributeTagHelper).FullName, typeof(RequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -413,7 +413,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(InheritedRequiredAttributeTagHelper), typeof(InheritedRequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"div", "div",
typeof(InheritedRequiredAttributeTagHelper).FullName, typeof(InheritedRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -425,13 +425,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiAttributeRequiredAttributeTagHelper), typeof(MultiAttributeRequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"div", "div",
typeof(MultiAttributeRequiredAttributeTagHelper).FullName, typeof(MultiAttributeRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
attributes, attributes,
requiredAttributes: new[] { "class" }), requiredAttributes: new[] { "class" }),
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(MultiAttributeRequiredAttributeTagHelper).FullName, typeof(MultiAttributeRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -443,13 +443,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiAttributeSameTagRequiredAttributeTagHelper), typeof(MultiAttributeSameTagRequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName, typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
attributes, attributes,
requiredAttributes: new[] { "style" }), requiredAttributes: new[] { "style" }),
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName, typeof(MultiAttributeSameTagRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -461,7 +461,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiRequiredAttributeTagHelper), typeof(MultiRequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(MultiRequiredAttributeTagHelper).FullName, typeof(MultiRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -473,13 +473,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiTagMultiRequiredAttributeTagHelper), typeof(MultiTagMultiRequiredAttributeTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"div", "div",
typeof(MultiTagMultiRequiredAttributeTagHelper).FullName, typeof(MultiTagMultiRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
attributes, attributes,
requiredAttributes: new[] { "class", "style" }), requiredAttributes: new[] { "class", "style" }),
new TagHelperDescriptor( CreateTagHelperDescriptor(
"input", "input",
typeof(MultiTagMultiRequiredAttributeTagHelper).FullName, typeof(MultiTagMultiRequiredAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -491,7 +491,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(AttributeWildcardTargetingTagHelper), typeof(AttributeWildcardTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(AttributeWildcardTargetingTagHelper).FullName, typeof(AttributeWildcardTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -503,7 +503,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(MultiAttributeWildcardTargetingTagHelper), typeof(MultiAttributeWildcardTargetingTagHelper),
new[] new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
TagHelperDescriptorProvider.ElementCatchAllTarget, TagHelperDescriptorProvider.ElementCatchAllTarget,
typeof(MultiAttributeWildcardTargetingTagHelper).FullName, typeof(MultiAttributeWildcardTargetingTagHelper).FullName,
AssemblyName, AssemblyName,
@ -599,14 +599,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(OverriddenAttributeTagHelper.ValidAttribute2)); nameof(OverriddenAttributeTagHelper.ValidAttribute2));
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"overridden-attribute", "overridden-attribute",
typeof(OverriddenAttributeTagHelper).FullName, typeof(OverriddenAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("SomethingElse", validProperty1), CreateTagHelperAttributeDescriptor("SomethingElse", validProperty1),
new TagHelperAttributeDescriptor("Something-Else", validProperty2) CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
}) })
}; };
@ -633,14 +633,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(InheritedOverriddenAttributeTagHelper.ValidAttribute2)); nameof(InheritedOverriddenAttributeTagHelper.ValidAttribute2));
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"inherited-overridden-attribute", "inherited-overridden-attribute",
typeof(InheritedOverriddenAttributeTagHelper).FullName, typeof(InheritedOverriddenAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("valid-attribute1", validProperty1), CreateTagHelperAttributeDescriptor("valid-attribute1", validProperty1),
new TagHelperAttributeDescriptor("Something-Else", validProperty2) CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
}) })
}; };
@ -667,14 +667,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(InheritedNotOverriddenAttributeTagHelper.ValidAttribute2)); nameof(InheritedNotOverriddenAttributeTagHelper.ValidAttribute2));
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"inherited-not-overridden-attribute", "inherited-not-overridden-attribute",
typeof(InheritedNotOverriddenAttributeTagHelper).FullName, typeof(InheritedNotOverriddenAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("SomethingElse", validProperty1), CreateTagHelperAttributeDescriptor("SomethingElse", validProperty1),
new TagHelperAttributeDescriptor("Something-Else", validProperty2) CreateTagHelperAttributeDescriptor("Something-Else", validProperty2)
}) })
}; };
@ -697,7 +697,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var objectAssemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name; var objectAssemblyName = typeof(object).GetTypeInfo().Assembly.GetName().Name;
var expectedDescriptor = var expectedDescriptor =
new TagHelperDescriptor("object", "System.Object", objectAssemblyName); CreateTagHelperDescriptor("object", "System.Object", objectAssemblyName);
// Act // Act
var descriptors = TagHelperDescriptorFactory.CreateDescriptors( var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
@ -717,9 +717,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{ {
// Arrange // Arrange
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var expectedDescriptor = CreateTagHelperDescriptor(
// Also confirm isStringProperty is calculated correctly.
var expectedDescriptor = new TagHelperDescriptor(
"inherited-single-attribute", "inherited-single-attribute",
typeof(InheritedSingleAttributeTagHelper).FullName, typeof(InheritedSingleAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -730,7 +728,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(InheritedSingleAttributeTagHelper.IntAttribute), nameof(InheritedSingleAttributeTagHelper.IntAttribute),
typeof(int).FullName, typeof(int).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}); });
@ -753,13 +750,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
// Arrange // Arrange
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var intProperty = typeof(SingleAttributeTagHelper).GetProperty(nameof(SingleAttributeTagHelper.IntAttribute)); var intProperty = typeof(SingleAttributeTagHelper).GetProperty(nameof(SingleAttributeTagHelper.IntAttribute));
var expectedDescriptor = new TagHelperDescriptor( var expectedDescriptor = CreateTagHelperDescriptor(
"single-attribute", "single-attribute",
typeof(SingleAttributeTagHelper).FullName, typeof(SingleAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("int-attribute", intProperty) CreateTagHelperAttributeDescriptor("int-attribute", intProperty)
}); });
// Act // Act
@ -782,13 +779,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var validProperty = typeof(MissingAccessorTagHelper).GetProperty( var validProperty = typeof(MissingAccessorTagHelper).GetProperty(
nameof(MissingAccessorTagHelper.ValidAttribute)); nameof(MissingAccessorTagHelper.ValidAttribute));
var expectedDescriptor = new TagHelperDescriptor( var expectedDescriptor = CreateTagHelperDescriptor(
"missing-accessor", "missing-accessor",
typeof(MissingAccessorTagHelper).FullName, typeof(MissingAccessorTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("valid-attribute", validProperty) CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
}); });
// Act // Act
@ -811,13 +808,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var validProperty = typeof(NonPublicAccessorTagHelper).GetProperty( var validProperty = typeof(NonPublicAccessorTagHelper).GetProperty(
nameof(NonPublicAccessorTagHelper.ValidAttribute)); nameof(NonPublicAccessorTagHelper.ValidAttribute));
var expectedDescriptor = new TagHelperDescriptor( var expectedDescriptor = CreateTagHelperDescriptor(
"non-public-accessor", "non-public-accessor",
typeof(NonPublicAccessorTagHelper).FullName, typeof(NonPublicAccessorTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("valid-attribute", validProperty) CreateTagHelperAttributeDescriptor("valid-attribute", validProperty)
}); });
// Act // Act
@ -838,9 +835,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{ {
// Arrange // Arrange
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var expectedDescriptor = CreateTagHelperDescriptor(
// Also confirm isStringProperty is calculated correctly.
var expectedDescriptor = new TagHelperDescriptor(
"not-bound-attribute", "not-bound-attribute",
typeof(NotBoundAttributeTagHelper).FullName, typeof(NotBoundAttributeTagHelper).FullName,
AssemblyName, AssemblyName,
@ -851,7 +846,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(NotBoundAttributeTagHelper.BoundProperty), nameof(NotBoundAttributeTagHelper.BoundProperty),
typeof(object).FullName, typeof(object).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null) designTimeDescriptor: null)
}); });
@ -891,11 +885,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{ {
// Arrange // Arrange
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
// Also confirm isStringProperty is calculated correctly.
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"div", "div",
typeof(MultiTagTagHelper).FullName, typeof(MultiTagTagHelper).FullName,
AssemblyName, AssemblyName,
@ -906,10 +898,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(MultiTagTagHelper.ValidAttribute), nameof(MultiTagTagHelper.ValidAttribute),
typeof(string).FullName, typeof(string).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: true,
designTimeDescriptor: null) designTimeDescriptor: null)
}), }),
new TagHelperDescriptor( CreateTagHelperDescriptor(
"p", "p",
typeof(MultiTagTagHelper).FullName, typeof(MultiTagTagHelper).FullName,
AssemblyName, AssemblyName,
@ -920,7 +911,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(MultiTagTagHelper.ValidAttribute), nameof(MultiTagTagHelper.ValidAttribute),
typeof(string).FullName, typeof(string).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: true,
designTimeDescriptor: null) designTimeDescriptor: null)
}) })
}; };
@ -948,13 +938,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
// Arrange // Arrange
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var validProp = typeof(InheritedMultiTagTagHelper).GetProperty(nameof(InheritedMultiTagTagHelper.ValidAttribute)); var validProp = typeof(InheritedMultiTagTagHelper).GetProperty(nameof(InheritedMultiTagTagHelper.ValidAttribute));
var expectedDescriptor = new TagHelperDescriptor( var expectedDescriptor = CreateTagHelperDescriptor(
"inherited-multi-tag", "inherited-multi-tag",
typeof(InheritedMultiTagTagHelper).FullName, typeof(InheritedMultiTagTagHelper).FullName,
AssemblyName, AssemblyName,
new[] new[]
{ {
new TagHelperAttributeDescriptor("valid-attribute", validProp) CreateTagHelperAttributeDescriptor("valid-attribute", validProp)
}); });
// Act // Act
@ -977,11 +967,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor( CreateTagHelperDescriptor(
"div", "div",
typeof(DuplicateTagNameTagHelper).FullName, typeof(DuplicateTagNameTagHelper).FullName,
AssemblyName), AssemblyName),
new TagHelperDescriptor( CreateTagHelperDescriptor(
"p", "p",
typeof(DuplicateTagNameTagHelper).FullName, typeof(DuplicateTagNameTagHelper).FullName,
AssemblyName) AssemblyName)
@ -1011,9 +1001,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink(); var errorSink = new ErrorSink();
var expectedDescriptors = new[] var expectedDescriptors = new[]
{ {
new TagHelperDescriptor("data-condition", CreateTagHelperDescriptor(
typeof(OverrideNameTagHelper).FullName, "data-condition",
AssemblyName), typeof(OverrideNameTagHelper).FullName,
AssemblyName),
}; };
// Act // Act
@ -1141,7 +1132,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(InvalidBoundAttributeWithValid), typeof(InvalidBoundAttributeWithValid),
new[] new[]
{ {
new TagHelperAttributeDescriptor( CreateTagHelperAttributeDescriptor(
"int-attribute", "int-attribute",
typeof(InvalidBoundAttributeWithValid) typeof(InvalidBoundAttributeWithValid)
.GetProperty(nameof(InvalidBoundAttributeWithValid.IntAttribute))) .GetProperty(nameof(InvalidBoundAttributeWithValid.IntAttribute)))
@ -1159,7 +1150,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
typeof(OverriddenInvalidBoundAttributeWithValid), typeof(OverriddenInvalidBoundAttributeWithValid),
new[] new[]
{ {
new TagHelperAttributeDescriptor( CreateTagHelperAttributeDescriptor(
"valid-something", "valid-something",
typeof(OverriddenInvalidBoundAttributeWithValid) typeof(OverriddenInvalidBoundAttributeWithValid)
.GetProperty(nameof(OverriddenInvalidBoundAttributeWithValid.DataSomething))) .GetProperty(nameof(OverriddenInvalidBoundAttributeWithValid.DataSomething)))
@ -1253,14 +1244,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(IDictionary<string, string>).FullName, typeName: typeof(IDictionary<string, string>).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "dictionary-property-", name: "dictionary-property-",
propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
}, },
new string[0] new string[0]
@ -1274,14 +1263,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(IDictionary<string, string>).FullName, typeName: typeof(IDictionary<string, string>).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name-", name: "valid-name-",
propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
}, },
new string[0] new string[0]
@ -1295,91 +1282,78 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(Dictionary<string, object>).FullName, typeName: typeof(Dictionary<string, object>).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name2", name: "valid-name2",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty),
typeName: typeof(DictionarySubclass).FullName, typeName: typeof(DictionarySubclass).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name3", name: "valid-name3",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty),
typeName: typeof(DictionaryWithoutParameterlessConstructor).FullName, typeName: typeof(DictionaryWithoutParameterlessConstructor).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name4", name: "valid-name4",
propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty),
typeName: typeof(GenericDictionarySubclass<object>).FullName, typeName: typeof(GenericDictionarySubclass<object>).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name5", name: "valid-name5",
propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty),
typeName: typeof(SortedDictionary<string, int>).FullName, typeName: typeof(SortedDictionary<string, int>).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-name6", name: "valid-name6",
propertyName: nameof(MultipleValidHtmlAttributePrefix.StringProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.StringProperty),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix1-", name: "valid-prefix1-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(object).FullName, typeName: typeof(object).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix2-", name: "valid-prefix2-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix3-", name: "valid-prefix3-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix4-", name: "valid-prefix4-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty),
typeName: typeof(object).FullName, typeName: typeof(object).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix5-", name: "valid-prefix5-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.SortedDictionaryProperty),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "get-only-dictionary-property-", name: "get-only-dictionary-property-",
propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryProperty), propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryProperty),
typeName: typeof(int).FullName, typeName: typeof(int).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
new TagHelperAttributeDescriptor( new TagHelperAttributeDescriptor(
name: "valid-prefix6", name: "valid-prefix6",
propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryPropertyWithAttributePrefix), propertyName: nameof(MultipleValidHtmlAttributePrefix.GetOnlyDictionaryPropertyWithAttributePrefix),
typeName: typeof(string).FullName, typeName: typeof(string).FullName,
isIndexer: true, isIndexer: true,
isStringProperty: true,
designTimeDescriptor: null), designTimeDescriptor: null),
}, },
new string[0] new string[0]
@ -1403,7 +1377,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(MultipleInvalidHtmlAttributePrefix.LongProperty), propertyName: nameof(MultipleInvalidHtmlAttributePrefix.LongProperty),
typeName: typeof(long).FullName, typeName: typeof(long).FullName,
isIndexer: false, isIndexer: false,
isStringProperty: false,
designTimeDescriptor: null), designTimeDescriptor: null),
}, },
new[] new[]
@ -1883,6 +1856,35 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
return data; return data;
} }
private static TagHelperDescriptor CreateTagHelperDescriptor(
string tagName,
string typeName,
string assemblyName,
IEnumerable<TagHelperAttributeDescriptor> attributes = null,
IEnumerable<string> requiredAttributes = null)
{
return new TagHelperDescriptor(
prefix: string.Empty,
tagName: tagName,
typeName: typeName,
assemblyName: assemblyName,
attributes: attributes ?? Enumerable.Empty<TagHelperAttributeDescriptor>(),
requiredAttributes: requiredAttributes ?? Enumerable.Empty<string>(),
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)] [EditorBrowsable(EditorBrowsableState.Always)]
private class DefaultEditorBrowsableTagHelper : TagHelper private class DefaultEditorBrowsableTagHelper : TagHelper
{ {

View File

@ -25,9 +25,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{ {
get get
{ {
return new TagHelperDescriptor("valid_plain", return new TagHelperDescriptor(
Valid_PlainTagHelperType.FullName, prefix: string.Empty,
AssemblyName); tagName: "valid_plain",
typeName: Valid_PlainTagHelperType.FullName,
assemblyName: AssemblyName,
attributes: Enumerable.Empty<TagHelperAttributeDescriptor>(),
requiredAttributes: Enumerable.Empty<string>(),
designTimeDescriptor: null);
} }
} }
@ -35,9 +40,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{ {
get get
{ {
return new TagHelperDescriptor("valid_inherited", return new TagHelperDescriptor(
Valid_InheritedTagHelperType.FullName, prefix: string.Empty,
AssemblyName); tagName: "valid_inherited",
typeName: Valid_InheritedTagHelperType.FullName,
assemblyName: AssemblyName,
attributes: Enumerable.Empty<TagHelperAttributeDescriptor>(),
requiredAttributes: Enumerable.Empty<string>(),
designTimeDescriptor: null);
} }
} }
@ -365,8 +375,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -376,8 +386,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -387,10 +397,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix)
}, },
new [] { CreatePrefixedValidPlainDescriptor("th:") } new [] { CreatePrefixedValidPlainDescriptor("th:") }
}, },
@ -398,8 +408,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix)
}, },
new [] new []
{ {
@ -411,11 +421,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("th-", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("th-", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Inherited*, " + assemblyA, "*Inherited*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper) TagHelperDirectiveType.AddTagHelper)
}, },
@ -429,11 +439,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Inherited*, " + assemblyA, "*Inherited*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper) TagHelperDirectiveType.AddTagHelper)
}, },
@ -443,13 +453,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Inherited*, " + assemblyA, "*Inherited*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix) CreateTagHelperDirectiveDescriptor("th:", TagHelperDirectiveType.TagHelperPrefix)
}, },
new [] new []
{ {
@ -461,11 +471,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor("th", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("th", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyA, "*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyB, "*, " + assemblyB,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -480,11 +490,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
defaultAssemblyLookups, defaultAssemblyLookups,
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyA, "*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("th:-", TagHelperDirectiveType.TagHelperPrefix), CreateTagHelperDirectiveDescriptor("th:-", TagHelperDirectiveType.TagHelperPrefix),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyB, "*, " + assemblyB,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -534,7 +544,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
// Arrange // Arrange
var tagHelperDescriptorResolver = new AssemblyCheckingTagHelperDescriptorResolver(); var tagHelperDescriptorResolver = new AssemblyCheckingTagHelperDescriptorResolver();
var context = new TagHelperDescriptorResolutionContext( var context = new TagHelperDescriptorResolutionContext(
new[] { new TagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper) }, new[] { CreateTagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper) },
new ErrorSink()); new ErrorSink());
// Act // 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 // We're treating 'string' as a TagHelper so we can test TagHelpers in multiple assemblies without
// building a separate assembly with a single TagHelper. // building a separate assembly with a single TagHelper.
var stringTagHelperDescriptor = var stringTagHelperDescriptor =
new TagHelperDescriptor("string", new TagHelperDescriptor(
"System.String", prefix: string.Empty,
assemblyB); tagName: "string",
typeName: "System.String",
assemblyName: assemblyB,
attributes: Enumerable.Empty<TagHelperAttributeDescriptor>(),
requiredAttributes: Enumerable.Empty<string>(),
designTimeDescriptor: null);
return new TheoryData<Dictionary<string, IEnumerable<Type>>, // descriptorAssemblyLookups return new TheoryData<Dictionary<string, IEnumerable<Type>>, // descriptorAssemblyLookups
IEnumerable<TagHelperDirectiveDescriptor>, // directiveDescriptors IEnumerable<TagHelperDirectiveDescriptor>, // directiveDescriptors
@ -571,7 +586,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor }
}, },
@ -583,8 +598,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor, stringTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor, stringTagHelperDescriptor }
}, },
@ -596,8 +611,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor }
}, },
@ -609,9 +624,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { stringTagHelperDescriptor } new [] { stringTagHelperDescriptor }
}, },
@ -622,10 +637,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.FullName + ", " + assemblyA, Valid_PlainTagHelperType.FullName + ", " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor, Valid_InheritedTagHelperDescriptor }
}, },
@ -636,8 +651,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.FullName + ", " + assemblyA, Valid_PlainTagHelperType.FullName + ", " + assemblyA,
TagHelperDirectiveType.RemoveTagHelper) TagHelperDirectiveType.RemoveTagHelper)
}, },
@ -650,11 +665,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.FullName + ", " + assemblyA, Valid_PlainTagHelperType.FullName + ", " + assemblyA,
TagHelperDirectiveType.RemoveTagHelper), TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor }
}, },
@ -665,8 +680,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
}, },
new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor }
}, },
@ -677,7 +692,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.Namespace + ".Valid_Plain*, " + assemblyA, Valid_PlainTagHelperType.Namespace + ".Valid_Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -690,7 +705,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.Namespace + ".Valid?Plain*, " + assemblyA, Valid_PlainTagHelperType.Namespace + ".Valid?Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -703,7 +718,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -716,7 +731,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain?*, " + assemblyA, "*Plain?*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -729,7 +744,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
Valid_PlainTagHelperType.Namespace + "*, " + assemblyA, Valid_PlainTagHelperType.Namespace + "*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -742,7 +757,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*_*lain*, " + assemblyA, "*_*lain*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -755,7 +770,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*?*l?in*, " + assemblyA, "*?*l?in*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -768,7 +783,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA, "*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -781,7 +796,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA, "*" + Valid_PlainTagHelperType.FullName + "*, " + assemblyA,
TagHelperDirectiveType.AddTagHelper), TagHelperDirectiveType.AddTagHelper),
}, },
@ -794,8 +809,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*_*la*, " + assemblyA, "*_*la*, " + assemblyA,
TagHelperDirectiveType.RemoveTagHelper) TagHelperDirectiveType.RemoveTagHelper)
}, },
@ -808,11 +823,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*Plain*, " + assemblyA, "*Plain*, " + assemblyA,
TagHelperDirectiveType.RemoveTagHelper), TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor }
}, },
@ -823,11 +838,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"?*Plain*?, " + assemblyA, "?*Plain*?, " + assemblyA,
TagHelperDirectiveType.RemoveTagHelper), TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor } new [] { Valid_InheritedTagHelperDescriptor, Valid_PlainTagHelperDescriptor }
}, },
@ -839,8 +854,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*ring, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*ring, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor }
}, },
@ -852,8 +867,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("?*?, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("?*?, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*?r?n?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*?r?n?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor }
}, },
@ -865,8 +880,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("?*TagHelper, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("?*TagHelper, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.AddTagHelper) CreateTagHelperDirectiveDescriptor("?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.AddTagHelper)
}, },
new [] { Valid_PlainTagHelperDescriptor } new [] { Valid_PlainTagHelperDescriptor }
}, },
@ -878,9 +893,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { stringTagHelperDescriptor } new [] { stringTagHelperDescriptor }
}, },
@ -892,9 +907,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*????*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*????*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*?, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*?, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("Microsoft?*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("Microsoft?*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] { stringTagHelperDescriptor } new [] { stringTagHelperDescriptor }
}, },
@ -906,13 +921,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"?Microsoft*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), "?Microsoft*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) "?" + stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] new []
@ -930,13 +945,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), "*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), "*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
"Microsoft*TagHelper?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), "Microsoft*TagHelper?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor( CreateTagHelperDirectiveDescriptor(
stringType.FullName + "?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) stringType.FullName + "?, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
}, },
new [] new []
@ -986,9 +1001,14 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var assemblyB = stringType.GetTypeInfo().Assembly.GetName().Name; var assemblyB = stringType.GetTypeInfo().Assembly.GetName().Name;
var stringTagHelperDescriptor = var stringTagHelperDescriptor =
new TagHelperDescriptor("string", new TagHelperDescriptor(
"System.String", prefix: string.Empty,
assemblyB); tagName: "string",
typeName: "System.String",
assemblyName: assemblyB,
attributes: Enumerable.Empty<TagHelperAttributeDescriptor>(),
requiredAttributes: Enumerable.Empty<string>(),
designTimeDescriptor: null);
return new TheoryData<Dictionary<string, IEnumerable<Type>>, // descriptorAssemblyLookups return new TheoryData<Dictionary<string, IEnumerable<Type>>, // descriptorAssemblyLookups
IEnumerable<TagHelperDirectiveDescriptor>> // directiveDescriptors IEnumerable<TagHelperDirectiveDescriptor>> // directiveDescriptors
@ -1000,8 +1020,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
} }
}, },
{ {
@ -1011,9 +1031,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
@ -1024,10 +1044,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
@ -1038,19 +1058,19 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor(Valid_InheritedTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor(stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor(stringType.FullName + ", " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
new Dictionary<string, IEnumerable<Type>>(), new Dictionary<string, IEnumerable<Type>>(),
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor(Valid_PlainTagHelperType.FullName + ", " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
} }
}, },
{ {
@ -1060,8 +1080,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*TagHelper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*TagHelper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
} }
}, },
{ {
@ -1071,8 +1091,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*TagHelpe?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*TagHelpe?, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
} }
}, },
{ {
@ -1082,9 +1102,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("*_*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("*_*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*Plain*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*Plain*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("*_*Inhe*ed*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("*_*Inhe*ed*, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
@ -1095,10 +1115,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("Microsoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*Helper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*Helper, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("System.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
@ -1109,10 +1129,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("?icrosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("?icrosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("?ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("?ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("*?????r, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper), CreateTagHelperDirectiveDescriptor("*?????r, " + assemblyA, TagHelperDirectiveType.RemoveTagHelper),
new TagHelperDirectiveDescriptor("Sy??em.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper) CreateTagHelperDirectiveDescriptor("Sy??em.*, " + assemblyB, TagHelperDirectiveType.RemoveTagHelper)
} }
}, },
{ {
@ -1123,8 +1143,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
}, },
new [] new []
{ {
new TagHelperDirectiveDescriptor("?i?crosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("?i?crosoft.*, " + assemblyA, TagHelperDirectiveType.AddTagHelper),
new TagHelperDirectiveDescriptor("??ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper), CreateTagHelperDirectiveDescriptor("??ystem.*, " + assemblyB, TagHelperDirectiveType.AddTagHelper),
} }
}, },
}; };
@ -1402,6 +1422,13 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
assemblyName: stringType.GetTypeInfo().Assembly.GetName().Name); 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 private class TestTagHelperDescriptorResolver : TagHelperDescriptorResolver
{ {
public TestTagHelperDescriptorResolver(TagHelperTypeResolver typeResolver) public TestTagHelperDescriptorResolver(TagHelperTypeResolver typeResolver)
@ -1415,7 +1442,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
new TagHelperDescriptorResolutionContext( new TagHelperDescriptorResolutionContext(
lookupTexts.Select( lookupTexts.Select(
lookupText => lookupText =>
new TagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper)), CreateTagHelperDirectiveDescriptor(lookupText, TagHelperDirectiveType.AddTagHelper)),
new ErrorSink())); new ErrorSink()));
} }
} }

View File

@ -7,6 +7,10 @@
"type": "build" "type": "build"
}, },
"Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*",
"Microsoft.Framework.HashCodeCombiner.Sources": {
"type": "build",
"version": "1.0.0-*"
},
"Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*" "xunit.runner.aspnet": "2.0.0-aspnet-*"
}, },

View File

@ -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<Type, bool, bool>
{
{ typeof(int), false, false },
{ typeof(string), false, true },
{ typeof(string), true, true },
{ typeof(object), false, false },
{ typeof(IEnumerable<string>), false, false },
{ typeof(IDictionary<string, string>), false, false },
{ typeof(IDictionary<string, string>), 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);
}
}
}