public void CreateMetadataForProperty() { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForProperty(typeof(string), "Message", typeof(Exception)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0], new object[0])); // Act var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Assert Assert.Equal(typeof(string), metadata.ModelType); Assert.Equal("Message", metadata.PropertyName); Assert.Equal(typeof(Exception), metadata.ContainerType); }
public void IsReadOnly_ReturnsFalse_ForPublicSetProperty() { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(typeof(TypeWithProperties)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var isReadOnly = metadata.Properties["PublicGetPublicSetProperty"].IsReadOnly; // Assert Assert.False(isReadOnly); }
public void ValidateChildren_ComplexAndEnumerableTypes(Type modelType) { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(typeof(TypeWithProperties)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var validateChildren = metadata.ValidateChildren; // Assert Assert.True(validateChildren); }
public void IsRequired_ReturnsTrue_ForNonNullableTypes(Type modelType) { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(modelType); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var isRequired = metadata.IsRequired; // Assert Assert.True(isRequired); }
public void ElementMetadata_ReturnsNull_ForNonCollections(Type modelType) { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(modelType); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var elementMetadata = metadata.ElementMetadata; // Assert Assert.Null(elementMetadata); }
public void ValidateChildren_SimpleTypes(Type modelType) { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(modelType); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0], null, null)); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var validateChildren = metadata.ValidateChildren; // Assert Assert.False(validateChildren); }
public void ElementMetadata_ReturnsExpectedMetadata(Type modelType, Type elementType) { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(modelType); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0], null, null)); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var elementMetadata = metadata.ElementMetadata; // Assert Assert.NotNull(elementMetadata); Assert.Equal(elementType, elementMetadata.ModelType); }
public void PropertiesEnumerationEvaluatedOnce() { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(typeof(string)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var firstPropertiesEvaluation = metadata.Properties.ToList(); var secondPropertiesEvaluation = metadata.Properties.ToList(); // Assert // Identical ModelMetadata objects every time we run through the Properties collection. Assert.Equal(firstPropertiesEvaluation, secondPropertiesEvaluation); }
public void PropertiesSetOnce() { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(typeof(string)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var firstPropertiesEvaluation = metadata.Properties; var secondPropertiesEvaluation = metadata.Properties; // Assert // Same IEnumerable<ModelMetadata> object. Assert.Same(firstPropertiesEvaluation, secondPropertiesEvaluation); }
public void PropertiesProperty_OrdersPropertyNamesUsingOrder_ThenAsProvided( IEnumerable <KeyValuePair <string, int> > originalNamesAndOrders, IEnumerable <string> expectedNames) { // Arrange var provider = new Mock <IModelMetadataProvider>(MockBehavior.Strict); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var expectedProperties = new List <DefaultModelMetadata>(); foreach (var kvp in originalNamesAndOrders) { var propertyCache = new DefaultMetadataDetails( ModelMetadataIdentity.ForProperty(typeof(int), kvp.Key, typeof(string)), attributes: new ModelAttributes(new object[0], new object[0], null)) { DisplayMetadata = new DisplayMetadata(), }; propertyCache.DisplayMetadata.Order = kvp.Value; expectedProperties.Add(new DefaultModelMetadata( provider.Object, detailsProvider, propertyCache)); } provider .Setup(p => p.GetMetadataForProperties(typeof(string))) .Returns(expectedProperties); var key = ModelMetadataIdentity.ForType(typeof(string)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0], null, null)); var metadata = new DefaultModelMetadata(provider.Object, detailsProvider, cache); // Act var properties = metadata.Properties; // Assert Assert.Equal(expectedNames.Count(), properties.Count); Assert.Equal(expectedNames.ToArray(), properties.Select(p => p.PropertyName).ToArray()); }
public void PropertiesProperty_CallsProvider() { // Arrange var provider = new Mock <IModelMetadataProvider>(MockBehavior.Strict); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var expectedProperties = new DefaultModelMetadata[] { new DefaultModelMetadata( provider.Object, detailsProvider, new DefaultMetadataDetails( ModelMetadataIdentity.ForProperty(typeof(int), "Prop1", typeof(string)), attributes: new ModelAttributes(new object[0], new object[0]))), new DefaultModelMetadata( provider.Object, detailsProvider, new DefaultMetadataDetails( ModelMetadataIdentity.ForProperty(typeof(int), "Prop2", typeof(string)), attributes: new ModelAttributes(new object[0], new object[0]))), }; provider .Setup(p => p.GetMetadataForProperties(typeof(string))) .Returns(expectedProperties); var key = ModelMetadataIdentity.ForType(typeof(string)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider.Object, detailsProvider, cache); // Act var properties = metadata.Properties; // Assert Assert.Equal(expectedProperties.Length, properties.Count); for (var i = 0; i < expectedProperties.Length; i++) { Assert.Same(expectedProperties[i], properties[i]); } }
public void ValidateChildren_OverrideFalse() { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(typeof(XmlDocument)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); cache.ValidationMetadata = new ValidationMetadata() { ValidateChildren = false, }; var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var validateChildren = metadata.ValidateChildren; // Assert Assert.False(validateChildren); }
public void PropertyValidationFilter_ReflectsFilter_FromValidationMetadata(IPropertyValidationFilter value) { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(typeof(int)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); cache.ValidationMetadata = new ValidationMetadata { PropertyValidationFilter = value, }; var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var validationFilter = metadata.PropertyValidationFilter; // Assert Assert.Same(value, validationFilter); }
public void IsReadOnly_ReturnsFalse_ForType() { // Arrange var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var provider = new DefaultModelMetadataProvider(detailsProvider); var key = ModelMetadataIdentity.ForType(typeof(int[])); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); cache.BindingMetadata = new BindingMetadata() { IsReadOnly = true, // Will be ignored. }; var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var isReadOnly = metadata.IsReadOnly; // Assert Assert.False(isReadOnly); }
public void IsBindingRequired_ReturnsFalse_ForTypes(Type modelType) { // Arrange var provider = new EmptyModelMetadataProvider(); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var key = ModelMetadataIdentity.ForType(modelType); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); cache.BindingMetadata = new BindingMetadata() { IsBindingRequired = true, // Will be ignored. }; var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); // Act var isBindingRequired = metadata.IsBindingRequired; // Assert Assert.False(isBindingRequired); }
public void PropertiesProperty_WithDefaultOrder_OrdersPropertyNamesAsProvided( IEnumerable <string> originalNames, IEnumerable <string> expectedNames) { // Arrange var provider = new Mock <IModelMetadataProvider>(MockBehavior.Strict); var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); var expectedProperties = new List <DefaultModelMetadata>(); foreach (var originalName in originalNames) { expectedProperties.Add(new DefaultModelMetadata( provider.Object, detailsProvider, new DefaultMetadataDetails( ModelMetadataIdentity.ForProperty(typeof(int), originalName, typeof(string)), attributes: new ModelAttributes(new object[0], new object[0])))); } provider .Setup(p => p.GetMetadataForProperties(typeof(string))) .Returns(expectedProperties); var key = ModelMetadataIdentity.ForType(typeof(string)); var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0])); var metadata = new DefaultModelMetadata(provider.Object, detailsProvider, cache); // Act var properties = metadata.Properties; // Assert Assert.Equal(expectedNames.Count(), properties.Count); Assert.Equal(expectedNames.ToArray(), properties.Select(p => p.PropertyName).ToArray()); }