public void TestCopyValue()
        {
            var m1 = new Model1
            {
                P1 = "P1",
                P2 = "P2",
                P3 = "P3",
                P4 = "P4",
                P5 = "P5",
                P6 = 6,
                PP = "P7",
                P8 = new Model3
                {
                    P1 = "P3-P1"
                },
                P9 = new List <Model4> {
                    new Model4 {
                        P1 = "1-P4-P1"
                    },
                    new Model4 {
                        P1 = "2-P4-P1"
                    }
                },
                P10 = 10
            };

            // Verifies that pass a null object
            Assert.Throws <ArgumentNullException>(() =>
            {
                m1.CopyValueTo(null);
            });

            // Verifies that set value between different type
            var m2 = new Model2
            {
                P1 = -10
            };

            Assert.Throws <InvalidTypeConvertedException>(() =>
            {
                m1.CopyValueTo(m2);
            });

            // Verifies that successful
            var m3 = new Model3
            {
                p5 = "-p5"
            };

            m1.CopyValueTo(m3);
            Assert.Equal("P1", m3.P1);
            Assert.Equal("P2", m3.P2);
            Assert.Equal("P3", m3.P3);
            Assert.Equal("-p5", m3.p5);
            Assert.Equal(6, m3.P6);
            Assert.Null(m3.P7);

            // Verifies that ignore case
            m1.CopyValueTo(target: m3, stringComparison: StringComparison.CurrentCultureIgnoreCase);
            Assert.Equal("P5", m3.p5);

            // Verifies that ignore property
            m3 = new Model3();
            m1.CopyValueTo(target: m3, ignorePropertyNames: new string[] { "P1", "P2" });
            Assert.Null(m3.P1);
            Assert.Null(m3.P2);

            // Verifies that ignore property
            m3 = new Model3();
            var map = new Dictionary <string, string>();

            map.Add("PP", "P7");
            m1.CopyValueTo(target: m3, propertyMap: map);
            Assert.Equal("P7", m3.P7);

            // Verifies that throw MultipleResultException if ignore case
            var m4 = new Model4();

            Assert.Throws <MultipleResultException>(() =>
            {
                m1.CopyValueTo(target: m4, stringComparison: StringComparison.CurrentCultureIgnoreCase);
            });

            // Verifies that copy value type and ref type
            var m5 = new Model5();

            m1.CopyValueTo(m5, ignoreRefType: false);
            Assert.True(m1.P8 == m5.P8);
            Assert.True(m1.P9 == m5.P9);
            Assert.True(m1.P10.ToString() == m5.P10.ToString());

            // Verifies that ignore ref type
            m5 = new Model5();
            m1.CopyValueTo(m5);
            Assert.Null(m5.P8);
            Assert.Null(m5.P9);
            Assert.Equal(0, m5.P10);

            // Verifies that force property names
            m5 = new Model5();
            m1.CopyValueTo(m5, forcePropertyNames: new string[] { "P10" });
            Assert.Null(m5.P8);
            Assert.Null(m5.P9);
            Assert.Equal(10, m5.P10);
        }