// 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 Microsoft.AspNet.Mvc.ModelBinding; using Moq; using Xunit; namespace Microsoft.AspNet.Mvc.Core { public class ViewDataDictionaryTest { [Fact] public void ConstructorWithOneParameterInitalizesMembers() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); // Act var viewData = new ViewDataDictionary(metadataProvider); // Assert Assert.NotNull(viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.Null(viewData.Model); Assert.Null(viewData.ModelMetadata); Assert.Equal(0, viewData.Count); } [Fact] public void ConstructorInitalizesMembers() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); var modelState = new ModelStateDictionary(); // Act var viewData = new ViewDataDictionary(metadataProvider, modelState); // Assert Assert.Same(modelState, viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.Null(viewData.Model); Assert.Null(viewData.ModelMetadata); Assert.Equal(0, viewData.Count); } [Fact] public void SetModelUsesPassedInModelMetadataProvider() { // Arrange var metadataProvider = new Mock(); metadataProvider.Setup(m => m.GetMetadataForType(It.IsAny>(), typeof(TestModel))) .Returns(new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(TestModel))) .Verifiable(); var modelState = new ModelStateDictionary(); var viewData = new TestViewDataDictionary(metadataProvider.Object, modelState); var model = new TestModel(); // Act viewData.SetModelPublic(model); // Assert Assert.NotNull(viewData.ModelMetadata); metadataProvider.Verify(); } [Fact] public void CopyConstructorInitalizesModelAndModelMetadataBasedOnSource() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); var model = new TestModel(); var source = new ViewDataDictionary(metadataProvider) { Model = model }; source["foo"] = "bar"; // Act var viewData = new ViewDataDictionary(source); // Assert Assert.NotNull(viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.NotSame(source.TemplateInfo, viewData.TemplateInfo); Assert.Same(model, viewData.Model); Assert.NotNull(viewData.ModelMetadata); Assert.Equal(typeof(TestModel), viewData.ModelMetadata.ModelType); Assert.Equal("bar", viewData["foo"]); Assert.IsType>(viewData.Data); } [Fact] public void CopyConstructorUsesPassedInModel() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); var model = new TestModel(); var source = new ViewDataDictionary(metadataProvider) { Model = "string model" }; source["key1"] = "value1"; // Act var viewData = new ViewDataDictionary(source, model); // Assert Assert.NotNull(viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.Same(model, viewData.Model); Assert.NotNull(viewData.ModelMetadata); Assert.Equal(typeof(TestModel), viewData.ModelMetadata.ModelType); Assert.Equal("value1", viewData["key1"]); Assert.IsType>(viewData.Data); } [Fact] public void CopyConstructorDoesNotThrowOnNullModel() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); var source = new ViewDataDictionary(metadataProvider); source["key1"] = "value1"; // Act var viewData = new ViewDataDictionary(source, null); // Assert Assert.NotNull(viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.Null(viewData.Model); Assert.Null(viewData.ModelMetadata); Assert.Equal("value1", viewData["key1"]); Assert.IsType>(viewData.Data); } [Fact] public void CopyConstructorDoesNotThrowOnNullModel_WithValueTypeTModel() { // Arrange var metadataProvider = new EmptyModelMetadataProvider(); var source = new ViewDataDictionary(metadataProvider); source["key1"] = "value1"; // Act var viewData = new ViewDataDictionary(source, null); // Assert Assert.NotNull(viewData.ModelState); Assert.NotNull(viewData.TemplateInfo); Assert.Throws(() => viewData.Model); Assert.NotNull(viewData.ModelMetadata); Assert.Equal("value1", viewData["key1"]); Assert.IsType>(viewData.Data); } private class TestModel { } private class TestViewDataDictionary : ViewDataDictionary { public TestViewDataDictionary(IModelMetadataProvider modelMetadataProvider, ModelStateDictionary modelState) : base(modelMetadataProvider, modelState) { } public TestViewDataDictionary(ViewDataDictionary source) : base(source) { } public void SetModelPublic(object value) { SetModel(value); } } } }