// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using Xunit; namespace Microsoft.Web.Mvc.Test { public class ModelCopierTest { [Fact] public void CopyCollection_FromIsNull_DoesNothing() { // Arrange int[] from = null; List to = new List { 1, 2, 3 }; // Act ModelCopier.CopyCollection(from, to); // Assert Assert.Equal(new[] { 1, 2, 3 }, to.ToArray()); } [Fact] public void CopyCollection_ToIsImmutable_DoesNothing() { // Arrange List from = new List { 1, 2, 3 }; ICollection to = new ReadOnlyCollection(new[] { 4, 5, 6 }); // Act ModelCopier.CopyCollection(from, to); // Assert Assert.Equal(new[] { 1, 2, 3 }, from.ToArray()); Assert.Equal(new[] { 4, 5, 6 }, to.ToArray()); } [Fact] public void CopyCollection_ToIsMmutable_ClearsAndCopies() { // Arrange List from = new List { 1, 2, 3 }; ICollection to = new List { 4, 5, 6 }; // Act ModelCopier.CopyCollection(from, to); // Assert Assert.Equal(new[] { 1, 2, 3 }, from.ToArray()); Assert.Equal(new[] { 1, 2, 3 }, to.ToArray()); } [Fact] public void CopyCollection_ToIsNull_DoesNothing() { // Arrange List from = new List { 1, 2, 3 }; List to = null; // Act ModelCopier.CopyCollection(from, to); // Assert Assert.Equal(new[] { 1, 2, 3 }, from.ToArray()); } [Fact] public void CopyModel_ExactTypeMatch_Copies() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); Assert.Equal(21, to.TheProperty); } [Fact] public void CopyModel_FromIsNull_DoesNothing() { // Arrange GenericModel from = null; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(42, to.TheProperty); } [Fact] public void CopyModel_LiftedTypeMatch_ActualValueIsNotNull_Copies() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); Assert.Equal(21, to.TheProperty); } [Fact] public void CopyModel_LiftedTypeMatch_ActualValueIsNull_DoesNothing() { // Arrange GenericModel from = new GenericModel { TheProperty = null }; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Null(from.TheProperty); Assert.Equal(42, to.TheProperty); } [Fact] public void CopyModel_NoTypeMatch_DoesNothing() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); Assert.Equal(42, to.TheProperty); } [Fact] public void CopyModel_SubclassedTypeMatch_Copies() { // Arrange string originalModel = "Hello, world!"; GenericModel from = new GenericModel { TheProperty = originalModel }; GenericModel to = new GenericModel { TheProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Same(originalModel, from.TheProperty); Assert.Same(originalModel, to.TheProperty); } [Fact] public void CopyModel_ToDoesNotContainProperty_DoesNothing() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; OtherGenericModel to = new OtherGenericModel { SomeOtherProperty = 42 }; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); Assert.Equal(42, to.SomeOtherProperty); } [Fact] public void CopyModel_ToIsNull_DoesNothing() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; GenericModel to = null; // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); } [Fact] public void CopyModel_ToIsReadOnly_DoesNothing() { // Arrange GenericModel from = new GenericModel { TheProperty = 21 }; ReadOnlyGenericModel to = new ReadOnlyGenericModel(42); // Act ModelCopier.CopyModel(from, to); // Assert Assert.Equal(21, from.TheProperty); Assert.Equal(42, to.TheProperty); } private class GenericModel { public T TheProperty { get; set; } } private class OtherGenericModel { public T SomeOtherProperty { get; set; } } private class ReadOnlyGenericModel { public ReadOnlyGenericModel(T propertyValue) { TheProperty = propertyValue; } public T TheProperty { get; private set; } } } }