// Copyright (c) Microsoft Open Technologies, Inc. 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; using System.Collections.Generic; using System.Collections.ObjectModel; using Microsoft.AspNet.Mvc.ModelBinding.Metadata; using Xunit; namespace Microsoft.AspNet.Mvc.ModelBinding { public class ModelMetadataTest { // IsComplexType private struct IsComplexTypeModel { } [Theory] [InlineData(typeof(string))] [InlineData(typeof(Nullable))] [InlineData(typeof(int))] public void IsComplexTypeTestsReturnsFalseForSimpleTypes(Type type) { // Arrange var provider = new EmptyModelMetadataProvider(); // Act var modelMetadata = new TestModelMetadata(type); // Assert Assert.False(modelMetadata.IsComplexType); } [Theory] [InlineData(typeof(object))] [InlineData(typeof(IDisposable))] [InlineData(typeof(IsComplexTypeModel))] [InlineData(typeof(Nullable))] public void IsComplexTypeTestsReturnsTrueForComplexTypes(Type type) { // Arrange var provider = new EmptyModelMetadataProvider(); // Act var modelMetadata = new TestModelMetadata(type); // Assert Assert.True(modelMetadata.IsComplexType); } [Theory] [InlineData(typeof(object))] [InlineData(typeof(int))] [InlineData(typeof(NonCollectionType))] [InlineData(typeof(string))] public void IsCollectionType_NonCollectionTypes(Type type) { // Arrange var provider = new EmptyModelMetadataProvider(); // Act var modelMetadata = new TestModelMetadata(type); // Assert Assert.False(modelMetadata.IsCollectionType); } [Theory] [InlineData(typeof(int[]))] [InlineData(typeof(List))] [InlineData(typeof(DerivedList))] [InlineData(typeof(IEnumerable))] [InlineData(typeof(IEnumerable))] [InlineData(typeof(Collection))] [InlineData(typeof(Dictionary))] public void IsCollectionType_CollectionTypes(Type type) { // Arrange var provider = new EmptyModelMetadataProvider(); // Act var modelMetadata = new TestModelMetadata(type); // Assert Assert.True(modelMetadata.IsCollectionType); } private class NonCollectionType { } private class DerivedList : List { } // IsNullableValueType [Theory] [InlineData(typeof(string), false)] [InlineData(typeof(IDisposable), false)] [InlineData(typeof(Nullable), true)] [InlineData(typeof(int), false)] public void IsNullableValueTypeTests(Type modelType, bool expected) { // Arrange var modelMetadata = new TestModelMetadata(modelType); // Act & Assert Assert.Equal(expected, modelMetadata.IsNullableValueType); } private class Class1 { public string Prop1 { get; set; } public override string ToString() { return "Class1"; } } private class Class2 { public int Prop2 { get; set; } } // GetDisplayName() [Fact] public void GetDisplayName_ReturnsDisplayName_IfSet() { // Arrange var provider = new EmptyModelMetadataProvider(); var metadata = new TestModelMetadata(typeof(int), "Length", typeof(string)); metadata.SetDisplayName("displayName"); // Act var result = metadata.GetDisplayName(); // Assert Assert.Equal("displayName", result); } [Fact] public void ReturnsPropertyNameWhenSetAndDisplayNameIsNull() { // Arrange var provider = new EmptyModelMetadataProvider(); var metadata = new TestModelMetadata(typeof(int), "Length", typeof(string)); // Act var result = metadata.GetDisplayName(); // Assert Assert.Equal("Length", result); } [Fact] public void ReturnsTypeNameWhenPropertyNameAndDisplayNameAreNull() { // Arrange var provider = new EmptyModelMetadataProvider(); var metadata = new TestModelMetadata(typeof(string)); // Act var result = metadata.GetDisplayName(); // Assert Assert.Equal("String", result); } private class TestModelMetadata : ModelMetadata { private string _displayName; public TestModelMetadata(Type modelType) : base(ModelMetadataIdentity.ForType(modelType)) { } public TestModelMetadata(Type modelType, string propertyName, Type containerType) : base(ModelMetadataIdentity.ForProperty(modelType, propertyName, containerType)) { } public override IReadOnlyDictionary AdditionalValues { get { throw new NotImplementedException(); } } public override string BinderModelName { get { throw new NotImplementedException(); } } public override Type BinderType { get { throw new NotImplementedException(); } } public override BindingSource BindingSource { get { throw new NotImplementedException(); } } public override bool ConvertEmptyStringToNull { get { throw new NotImplementedException(); } } public override string DataTypeName { get { throw new NotImplementedException(); } } public override string Description { get { throw new NotImplementedException(); } } public override string DisplayFormatString { get { throw new NotImplementedException(); } } public override string DisplayName { get { return _displayName; } } public void SetDisplayName(string displayName) { _displayName = displayName; } public override string EditFormatString { get { throw new NotImplementedException(); } } public override bool HasNonDefaultEditFormat { get { throw new NotImplementedException(); } } public override bool HideSurroundingHtml { get { throw new NotImplementedException(); } } public override bool HtmlEncode { get { throw new NotImplementedException(); } } public override bool IsReadOnly { get { throw new NotImplementedException(); } } public override bool IsRequired { get { throw new NotImplementedException(); } } public override string NullDisplayText { get { throw new NotImplementedException(); } } public override int Order { get { throw new NotImplementedException(); } } public override ModelPropertyCollection Properties { get { throw new NotImplementedException(); } } public override IPropertyBindingPredicateProvider PropertyBindingPredicateProvider { get { throw new NotImplementedException(); } } public override bool ShowForDisplay { get { throw new NotImplementedException(); } } public override bool ShowForEdit { get { throw new NotImplementedException(); } } public override string SimpleDisplayProperty { get { throw new NotImplementedException(); } } public override string TemplateHint { get { throw new NotImplementedException(); } } } } }