diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperAttributeDescriptorComparer.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperAttributeDescriptorComparer.cs
deleted file mode 100644
index b31394fbef..0000000000
--- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperAttributeDescriptorComparer.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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 Microsoft.AspNet.Razor.TagHelpers;
-using Microsoft.Internal.Web.Utils;
-
-namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
-{
- public class CaseSensitiveTagHelperAttributeDescriptorComparer : TagHelperAttributeDescriptorComparer
- {
- public new static readonly CaseSensitiveTagHelperAttributeDescriptorComparer Default =
- new CaseSensitiveTagHelperAttributeDescriptorComparer();
-
- private CaseSensitiveTagHelperAttributeDescriptorComparer()
- : base()
- {
- }
-
- public override bool Equals(TagHelperAttributeDescriptor descriptorX, TagHelperAttributeDescriptor descriptorY)
- {
- if (descriptorX == descriptorY)
- {
- return true;
- }
-
- // Base comparer does not care about Name case but in tests we do. Also double-check IsStringProperty
- // though it is inferred from TypeName.
- return base.Equals(descriptorX, descriptorY) &&
- descriptorX.IsStringProperty == descriptorY.IsStringProperty &&
- string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal);
- }
-
- public override int GetHashCode(TagHelperAttributeDescriptor descriptor)
- {
- // Ignore IsStringProperty because it is directly inferred from TypeName and thus won't vary the hash
- // bucket. Base comparer does not care about Name case in its hash code but in tests we do.
- return HashCodeCombiner.Start()
- .Add(base.GetHashCode(descriptor))
- .Add(descriptor.Name, StringComparer.Ordinal)
- .CombinedHash;
- }
- }
-}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperDescriptorComparer.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperDescriptorComparer.cs
index 3bdfade638..280d6dfb51 100644
--- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperDescriptorComparer.cs
+++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CaseSensitiveTagHelperDescriptorComparer.cs
@@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
StringComparer.Ordinal) &&
descriptorX.Attributes.SequenceEqual(
descriptorY.Attributes,
- CaseSensitiveTagHelperAttributeDescriptorComparer.Default);
+ TagHelperAttributeDescriptorComparer.Default);
}
public override int GetHashCode(TagHelperDescriptor descriptor)
@@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
foreach (var attribute in descriptor.Attributes)
{
- hashCodeCombiner.Add(CaseSensitiveTagHelperAttributeDescriptorComparer.Default.GetHashCode(attribute));
+ hashCodeCombiner.Add(TagHelperAttributeDescriptorComparer.Default.GetHashCode(attribute));
}
return hashCodeCombiner.CombinedHash;
diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CommonTagHelpers.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CommonTagHelpers.cs
index e6ebbbdb06..67d2433f49 100644
--- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CommonTagHelpers.cs
+++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/CommonTagHelpers.cs
@@ -1,6 +1,8 @@
// 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.Collections.Generic;
+
namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
public class Valid_PlainTagHelper : TagHelper
@@ -32,4 +34,33 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
internal string InvalidInternalAttribute { get; set; }
protected internal string InvalidProtectedInternalAttribute { get; set; }
}
+
+ ///
+ /// The summary for .
+ ///
+ ///
+ /// Inherits from .
+ ///
+ public class DocumentedTagHelper : TagHelper
+ {
+ ///
+ /// This is of type .
+ ///
+ public string SummaryProperty { get; set; }
+
+ ///
+ /// The may be null.
+ ///
+ public int RemarksProperty { get; set; }
+
+ ///
+ /// This is a complex .
+ ///
+ ///
+ ///
+ ///
+ public IDictionary RemarksAndSummaryProperty { get; set; }
+
+ public bool UndocumentedProperty { get; set; }
+ }
}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperAttributeDescriptorComparer.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperAttributeDescriptorComparer.cs
new file mode 100644
index 0000000000..d08024bb70
--- /dev/null
+++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperAttributeDescriptorComparer.cs
@@ -0,0 +1,51 @@
+// 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 Microsoft.Internal.Web.Utils;
+
+namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
+{
+ public class TagHelperAttributeDescriptorComparer : IEqualityComparer
+ {
+ public static readonly TagHelperAttributeDescriptorComparer Default =
+ new TagHelperAttributeDescriptorComparer();
+
+ private TagHelperAttributeDescriptorComparer()
+ {
+ }
+
+ public bool Equals(TagHelperAttributeDescriptor descriptorX, TagHelperAttributeDescriptor descriptorY)
+ {
+ if (descriptorX == descriptorY)
+ {
+ return true;
+ }
+
+ return descriptorX != null &&
+ descriptorY != null &&
+ descriptorX.IsIndexer == descriptorY.IsIndexer &&
+ string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal) &&
+ string.Equals(descriptorX.PropertyName, descriptorY.PropertyName, StringComparison.Ordinal) &&
+ string.Equals(descriptorX.TypeName, descriptorY.TypeName, StringComparison.Ordinal) &&
+ TagHelperUsageDescriptorComparer.Default.Equals(
+ descriptorX.UsageDescriptor,
+ descriptorY.UsageDescriptor);
+ }
+
+ 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(TagHelperUsageDescriptorComparer.Default.GetHashCode(descriptor.UsageDescriptor))
+ .CombinedHash;
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs
index ea2d645178..85f8b3cd35 100644
--- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs
+++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperDescriptorFactoryTest.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Razor.TagHelpers;
@@ -210,7 +209,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
tagHelperType,
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -258,7 +258,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
tagHelperType,
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -294,7 +295,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(OverriddenAttributeTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -327,7 +329,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(InheritedOverriddenAttributeTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -360,7 +363,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(InheritedNotOverriddenAttributeTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -380,7 +384,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
objectAssemblyName,
typeof(object),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -406,14 +411,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(InheritedSingleAttributeTagHelper.IntAttribute),
typeof(int).FullName,
isIndexer: false,
- isStringProperty: false)
+ isStringProperty: false,
+ usageDescriptor: null)
});
// Act
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(InheritedSingleAttributeTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -440,7 +447,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(SingleAttributeTagHelper),
- new ErrorSink());
+ designTime: false,
+ errorSink: new ErrorSink());
// Assert
Assert.Empty(errorSink.Errors);
@@ -468,7 +476,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(MissingAccessorTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -496,7 +505,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(NonPublicAccessorTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -522,14 +532,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(NotBoundAttributeTagHelper.BoundProperty),
typeof(object).FullName,
isIndexer: false,
- isStringProperty: false)
+ isStringProperty: false,
+ usageDescriptor: null)
});
// Act
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(NotBoundAttributeTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -547,7 +559,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(DuplicateAttributeNameTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(descriptors);
@@ -574,7 +587,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(MultiTagTagHelper.ValidAttribute),
typeof(string).FullName,
isIndexer: false,
- isStringProperty: true)
+ isStringProperty: true,
+ usageDescriptor: null)
}),
new TagHelperDescriptor(
"p",
@@ -587,7 +601,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
nameof(MultiTagTagHelper.ValidAttribute),
typeof(string).FullName,
isIndexer: false,
- isStringProperty: true)
+ isStringProperty: true,
+ usageDescriptor: null)
})
};
@@ -595,7 +610,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(MultiTagTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -626,7 +642,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(InheritedMultiTagTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -655,7 +672,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(DuplicateTagNameTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -683,7 +701,8 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
AssemblyName,
typeof(OverrideNameTagHelper),
- errorSink);
+ designTime: false,
+ errorSink: errorSink);
// Assert
Assert.Empty(errorSink.Errors);
@@ -867,7 +886,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
var errorSink = new ErrorSink();
// Act
- var descriptors = TagHelperDescriptorFactory.CreateDescriptors(AssemblyName, type, errorSink);
+ var descriptors = TagHelperDescriptorFactory.CreateDescriptors(
+ AssemblyName,
+ type,
+ designTime: false,
+ errorSink: errorSink);
// Assert
var actualErrors = errorSink.Errors.ToArray();
@@ -885,7 +908,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
Assert.Equal(
expectedAttributeDescriptors,
actualDescriptor.Attributes,
- CaseSensitiveTagHelperAttributeDescriptorComparer.Default);
+ TagHelperAttributeDescriptorComparer.Default);
}
// tagTelperType, expectedAttributeDescriptors, expectedErrorMessages
@@ -911,13 +934,15 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(IDictionary).FullName,
isIndexer: false,
- isStringProperty: false),
+ isStringProperty: false,
+ usageDescriptor: null),
new TagHelperAttributeDescriptor(
name: "dictionary-property-",
propertyName: nameof(DefaultValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(string).FullName,
isIndexer: true,
- isStringProperty: true),
+ isStringProperty: true,
+ usageDescriptor: null),
},
new string[0]
},
@@ -930,13 +955,15 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(IDictionary).FullName,
isIndexer: false,
- isStringProperty: false),
+ isStringProperty: false,
+ usageDescriptor: null),
new TagHelperAttributeDescriptor(
name: "valid-prefix",
propertyName: nameof(SingleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(string).FullName,
isIndexer: true,
- isStringProperty: true),
+ isStringProperty: true,
+ usageDescriptor: null),
},
new string[0]
},
@@ -949,67 +976,78 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryProperty),
typeName: typeof(Dictionary).FullName,
isIndexer: false,
- isStringProperty: false),
+ isStringProperty: false,
+ usageDescriptor: null),
new TagHelperAttributeDescriptor(
name: "valid-name2",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionarySubclassProperty),
typeName: typeof(DictionarySubclass).FullName,
isIndexer: false,
- isStringProperty: false),
+ isStringProperty: false,
+ usageDescriptor: null),
new TagHelperAttributeDescriptor(
name: "valid-name3",
propertyName: nameof(MultipleValidHtmlAttributePrefix.DictionaryWithoutParameterlessConstructorProperty),
typeName: typeof(DictionaryWithoutParameterlessConstructor).FullName,
isIndexer: false,
- isStringProperty: false),
+ isStringProperty: false,
+ usageDescriptor: null),
new TagHelperAttributeDescriptor(
name: "valid-name4",
propertyName: nameof(MultipleValidHtmlAttributePrefix.GenericDictionarySubclassProperty),
typeName: typeof(GenericDictionarySubclass