public void Create_WhenDoubleAndSinglePropertiesAreSpecified_TheAssignmentIsCorrect(double doubleValue, float singleValue)
        {
            // arrange
            var doubleProperty = typeof(PropertyExpressionTestClass).GetProperty(Utils.GetPropertyName<PropertyExpressionTestClass, double>(p => p.PropDouble));
            var mergeResultDouble = new MemberMergeResult<PropertyInfo>(doubleProperty);

            var floatProperty = typeof(PropertyExpressionTestClass).GetProperty(Utils.GetPropertyName<PropertyExpressionTestClass, float>(p => p.PropFloat));
            var mergeResultFloat = new MemberMergeResult<PropertyInfo>(floatProperty);

            var propertyExpressionBuilder = new PropertyExpressionBuilder(this.SourceParameterExpression, this.DestinationParameterExpression);

            var properties = new[] { mergeResultDouble, mergeResultFloat };

            // act
            var propertyBlockExpressionBuilder = new MemberBlockExpressionBuilder<PropertyInfo>(propertyExpressionBuilder);
            var blockExpression = propertyBlockExpressionBuilder.Create<PropertyExpressionTestClass, PropertyExpressionTestClass>(properties);

            // assert
            var action = Expression.Lambda<Action<PropertyExpressionTestClass, PropertyExpressionTestClass>>(blockExpression, this.SourceParameterExpression, this.DestinationParameterExpression).Compile();
            PropertyExpressionTestClass sourceObject = new PropertyExpressionTestClass { PropDouble = doubleValue, PropFloat = singleValue };
            var destinationObject = new PropertyExpressionTestClass();
            action.Invoke(sourceObject, destinationObject);

            Assert.Equal(doubleValue, destinationObject.PropDouble);
            Assert.Equal(singleValue, destinationObject.PropFloat);
        }
        public void Create_WhenThePropertiesAreSpecified_TheAssignmentIsCorrect()
        {
            // arrange
            var stringProperty = typeof (PropertyExpressionTestClass).GetProperty(Utils.GetPropertyName<PropertyExpressionTestClass, string>(p => p.PropString));
            var mergeResultString = new MemberMergeResult<PropertyInfo>(stringProperty);

            var intProperty = typeof(PropertyExpressionTestClass).GetProperty(Utils.GetPropertyName<PropertyExpressionTestClass, int>(p => p.PropInt));
            var mergeResultInt = new MemberMergeResult<PropertyInfo>(intProperty);

            var propertyExpressionBuilder = new PropertyExpressionBuilder(this.SourceParameterExpression, this.DestinationParameterExpression);

            var properties = new[] {mergeResultString, mergeResultInt};

            // act
            var propertyBlockExpressionBuilder = new MemberBlockExpressionBuilder<PropertyInfo>(propertyExpressionBuilder);
            var blockExpression = propertyBlockExpressionBuilder.Create<PropertyExpressionTestClass, PropertyExpressionTestClass>(properties);

            // assert
            string propStringValue = "Odin";
            int propIntValue = int.MinValue;
            var action = Expression.Lambda<Action<PropertyExpressionTestClass, PropertyExpressionTestClass>>(blockExpression, this.SourceParameterExpression, this.DestinationParameterExpression).Compile();
            PropertyExpressionTestClass sourceObject = new PropertyExpressionTestClass {PropString = propStringValue, PropInt = propIntValue};
            var destinationObject = new PropertyExpressionTestClass();
            action.Invoke(sourceObject, destinationObject);

            Assert.Equal(propStringValue, destinationObject.PropString);
            Assert.Equal(propIntValue, destinationObject.PropInt);
        }