using System; using System.Collections.Generic; using System.Linq; using Moq; using Xunit; using Xunit.Extensions; namespace Microsoft.AspNet.Mvc.ModelBinding.Test { public class ModelMetadataTest { // Guard clauses [Fact] public void NullProviderThrows() { // Act & Assert ExceptionAssert.ThrowsArgumentNull( () => new ModelMetadata(provider: null, containerType: null, modelAccessor: null, modelType: typeof(object), propertyName: null), "provider"); } [Fact] public void NullTypeThrows() { // Arrange Mock provider = new Mock(); // Act & Assert ExceptionAssert.ThrowsArgumentNull( () => new ModelMetadata(provider: provider.Object, containerType: null, modelAccessor: null, modelType: null, propertyName: null), "modelType"); } // Constructor [Fact] public void DefaultValues() { // Arrange Mock provider = new Mock(); // Act ModelMetadata metadata = new ModelMetadata(provider.Object, typeof(Exception), () => "model", typeof(string), "propertyName"); // Assert Assert.Equal(typeof(Exception), metadata.ContainerType); Assert.True(metadata.ConvertEmptyStringToNull); Assert.Null(metadata.Description); Assert.Equal("model", metadata.Model); Assert.Equal(typeof(string), metadata.ModelType); Assert.Equal("propertyName", metadata.PropertyName); Assert.False(metadata.IsReadOnly); } // IsComplexType struct IsComplexTypeModel { } [Theory] [InlineData(typeof(string))] [InlineData(typeof(Nullable))] [InlineData(typeof(int))] public void IsComplexTypeTestsReturnsFalseForSimpleTypes(Type type) { // Arrange Mock provider = new Mock(); // Act var modelMetadata = new ModelMetadata(provider.Object, null, null, type, null); // Assert Assert.False(modelMetadata.IsComplexType); } [Theory] [InlineData(typeof(object))] [InlineData(typeof(IDisposable))] [InlineData(typeof(IsComplexTypeModel))] [InlineData(typeof(Nullable))] public void IsComplexTypeTestsReturnsTrueForComplexTypes(Type type) { // Arrange Mock provider = new Mock(); // Act var modelMetadata = new ModelMetadata(provider.Object, null, null, type, null); // Assert Assert.True(modelMetadata.IsComplexType); } // IsNullableValueType [Fact] public void IsNullableValueTypeTests() { // Arrange Mock provider = new Mock(); // Act & Assert Assert.False(new ModelMetadata(provider.Object, null, null, typeof(string), null).IsNullableValueType); Assert.False(new ModelMetadata(provider.Object, null, null, typeof(IDisposable), null).IsNullableValueType); Assert.True(new ModelMetadata(provider.Object, null, null, typeof(Nullable), null).IsNullableValueType); Assert.False(new ModelMetadata(provider.Object, null, null, typeof(int), null).IsNullableValueType); } // Properties [Fact] public void PropertiesCallsProvider() { // Arrange Type modelType = typeof(string); List propertyMetadata = new List(); Mock provider = new Mock(); ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, modelType, null); provider.Setup(p => p.GetMetadataForProperties(null, modelType)) .Returns(propertyMetadata) .Verifiable(); // Act IEnumerable result = metadata.Properties; // Assert Assert.Equal(propertyMetadata, result.ToList()); provider.Verify(); } [Fact] public void PropertiesListGetsResetWhenModelGetsReset() { // Dev10 Bug #923263 // Arrange IModelMetadataProvider provider = new EmptyModelMetadataProvider(); var metadata = new ModelMetadata(provider, null, () => new Class1(), typeof(Class1), null); // Act ModelMetadata[] originalProps = metadata.Properties.ToArray(); metadata.Model = new Class2(); ModelMetadata[] newProps = metadata.Properties.ToArray(); // Assert ModelMetadata originalProp = Assert.Single(originalProps); Assert.Equal(typeof(string), originalProp.ModelType); Assert.Equal("Prop1", originalProp.PropertyName); ModelMetadata newProp = Assert.Single(newProps); Assert.Equal(typeof(int), newProp.ModelType); Assert.Equal("Prop2", newProp.PropertyName); } class Class1 { public string Prop1 { get; set; } } class Class2 { public int Prop2 { get; set; } } // GetDisplayName() [Fact] public void ReturnsPropertyNameWhenSetAndDisplayNameIsNull() { // Arrange Mock provider = new Mock(); ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), "PropertyName"); // Act string result = metadata.GetDisplayName(); // Assert Assert.Equal("PropertyName", result); } [Fact] public void ReturnsTypeNameWhenPropertyNameAndDisplayNameAreNull() { // Arrange Mock provider = new Mock(); ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), null); // Act string result = metadata.GetDisplayName(); // Assert Assert.Equal("Object", result); } // Helpers private class DummyContactModel { public int IntField = 0; public string FirstName { get; set; } public string LastName { get; set; } public Nullable NullableIntValue { get; set; } public int[] Array { get; set; } public string this[int index] { get { return "Indexed into " + index; } } } private class DummyModelContainer { public DummyContactModel Model { get; set; } } } }