public void CopyConstructor_CopiesAllProperties()
        {
            // Arrange
            var propertyModel = new PropertyModel(typeof(TestController).GetProperty("Property"),
                                               new List<object>() { new FromBodyAttribute() });

            propertyModel.Controller = new ControllerModel(typeof(TestController).GetTypeInfo(), new List<object>());
            propertyModel.BindingInfo = BindingInfo.GetBindingInfo(propertyModel.Attributes);
            propertyModel.PropertyName = "Property";
            propertyModel.Properties.Add(new KeyValuePair<object, object>("test key", "test value"));

            // Act
            var propertyModel2 = new PropertyModel(propertyModel);

            // Assert
            foreach (var property in typeof(PropertyModel).GetProperties())
            {
                if (property.Name.Equals("BindingInfo"))
                {
                    // This test excludes other mutable objects on purpose because we deep copy them.
                    continue;
                }

                var value1 = property.GetValue(propertyModel);
                var value2 = property.GetValue(propertyModel2);

                if (typeof(IEnumerable<object>).IsAssignableFrom(property.PropertyType))
                {
                    Assert.Equal<object>((IEnumerable<object>)value1, (IEnumerable<object>)value2);

                    // Ensure non-default value
                    Assert.NotEmpty((IEnumerable<object>)value1);
                }
                else if (typeof(IDictionary<object, object>).IsAssignableFrom(property.PropertyType))
                {
                    Assert.Equal(value1, value2);

                    // Ensure non-default value
                    Assert.NotEmpty((IDictionary<object, object>)value1);
                }
                else if (property.PropertyType.GetTypeInfo().IsValueType ||
                    Nullable.GetUnderlyingType(property.PropertyType) != null)
                {
                    Assert.Equal(value1, value2);

                    // Ensure non-default value
                    Assert.NotEqual(value1, Activator.CreateInstance(property.PropertyType));
                }
                else
                {
                    Assert.Same(value1, value2);

                    // Ensure non-default value
                    Assert.NotNull(value1);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Creats a new instance of <see cref="PropertyModel"/> from a given <see cref="PropertyModel"/>.
        /// </summary>
        /// <param name="other">The <see cref="PropertyModel"/> which needs to be copied.</param>
        public PropertyModel(PropertyModel other)
        {
            if (other == null)
            {
                throw new ArgumentNullException(nameof(other));
            }

            Controller = other.Controller;
            Attributes = new List<object>(other.Attributes);
            BindingInfo = BindingInfo == null ? null : new BindingInfo(other.BindingInfo);
            PropertyInfo = other.PropertyInfo;
            PropertyName = other.PropertyName;
            Properties = new Dictionary<object, object>(other.Properties);
        }
        public void CopyConstructor_CopiesAllProperties()
        {
            // Arrange
            var propertyModel = new PropertyModel(typeof(TestController).GetProperty("Property"),
                                               new List<object>() { new FromBodyAttribute() });

            propertyModel.Controller = new ControllerModel(typeof(TestController).GetTypeInfo(), new List<object>());
            propertyModel.BindingInfo = BindingInfo.GetBindingInfo(propertyModel.Attributes);
            propertyModel.PropertyName = "Property";

            // Act
            var propertyModel2 = new PropertyModel(propertyModel);

            // Assert
            foreach (var property in typeof(PropertyModel).GetProperties())
            {
                var value1 = property.GetValue(propertyModel);
                var value2 = property.GetValue(propertyModel2);

                if (typeof(IEnumerable<object>).IsAssignableFrom(property.PropertyType))
                {
                    Assert.Equal<object>((IEnumerable<object>)value1, (IEnumerable<object>)value2);

                    // Ensure non-default value
                    Assert.NotEmpty((IEnumerable<object>)value1);
                }
                else if (property.PropertyType.IsValueType ||
                    Nullable.GetUnderlyingType(property.PropertyType) != null)
                {
                    Assert.Equal(value1, value2);

                    // Ensure non-default value
                    Assert.NotEqual(value1, Activator.CreateInstance(property.PropertyType));
                }
                else
                {
                    Assert.Same(value1, value2);

                    // Ensure non-default value
                    Assert.NotNull(value1);
                }
            }
        }