public void ConvertRecursiveComplexClassToSubClass_ConvertsDeep(bool isStrict)
        {
            // Arrange
            var parentClass = new RecursiveComplexTestClassParent()
            {
                RecursiveComplexTestClassProperty = new RecursiveComplexTestClass()
                {
                    Property1 = "testProp1",
                    RecursiveComplexTestClassProperty = new RecursiveComplexTestClass()
                    {
                        Property1 = "testPropRecursive"
                    }
                },
                Property1 = "qqq"
            };

            var castrClass = new CastrClass <RecursiveComplexTestClassParent>(
                parentClass, new Options.ClassOptions()
            {
                IsStrict = isStrict
            });

            // Act
            var childClass = castrClass.CastAsClass <RecursiveComplexTestClass>();

            // Assert
            Assert.Equal("qqq", childClass.Property1);
            Assert.True(string.IsNullOrWhiteSpace(childClass.NewProperty));
            Assert.Equal("testProp1", childClass.RecursiveComplexTestClassProperty.Property1);
            Assert.Equal("testPropRecursive", childClass.RecursiveComplexTestClassProperty.RecursiveComplexTestClassProperty.Property1);
        }
        public void ConvertComplexClassToSubClass_DisposeOriginal_ConvertsDeep(bool isStrict)
        {
            // Arrange
            var parentClass = new ComplexTestClassParent()
            {
                SimpleTestClass = new SimpleTestClass()
                {
                    Property1 = "test",
                    Property2 = "test2",
                    Property3 = "test3"
                }
            };

            parentClass.Property1 = "test";
            var castrClass = new CastrClass <ComplexTestClassParent>(
                parentClass, new Options.ClassOptions()
            {
                IsStrict = isStrict
            });

            var childClass = castrClass.CastAsClass <ComplexTestClass>();

            // Act
            parentClass = null;

            // Assert
            Assert.Equal("test", childClass.Property1);
            Assert.True(string.IsNullOrWhiteSpace(childClass.NewProperty));
            Assert.Equal("test", childClass.SimpleTestClass.Property1);
            Assert.Equal("test2", childClass.SimpleTestClass.Property2);
            Assert.Equal("test3", childClass.SimpleTestClass.Property3);
        }
        public void CopyClassToClass_ContainsEmptyList()
        {
            // Arrange
            var sourceClass = new ClassContainsListOfClasses();

            sourceClass.SimpleTestClasses = new List <SimpleTestClass>();

            var castrClass = new CastrClass <ClassContainsListOfClasses>(
                sourceClass, new Options.ClassOptions()
            {
            });

            // Act
            var newClass = castrClass.CastAsClass <ClassContainsListOfClasses>();

            /// Assert
            Assert.Empty(newClass.SimpleTestClasses);
        }
        public void ConvertClassToOtherClass_NotStrict_Converts()
        {
            // Arrange
            var parentClass = new SimpleTestClass2();

            parentClass.Property1 = "test";
            var castrClass = new CastrClass <SimpleTestClass2>(
                parentClass, new ClassOptions()
            {
                IsStrict = false
            });

            // Act
            var childClass = castrClass.CastAsClass <SimpleTestSubClass>();

            // Assert
            Assert.Equal("test", childClass.Property1);
            Assert.True(string.IsNullOrWhiteSpace(childClass.NewProperty));
        }
        public void ConvertClassToOtherClass_Strict_Throws()
        {
            // Arrange
            var parentClass = new SimpleTestClass2();

            parentClass.Property1 = "test";
            var castrClass = new CastrClass <SimpleTestClass2>(
                parentClass, new ClassOptions()
            {
                IsStrict = true
            });

            // Act
            void PerformCast()
            {
                var childClass = castrClass.CastAsClass <SimpleTestSubClass>();
            }

            // Assert
            Assert.Throws <CastingException>((Action)PerformCast);
        }
        public void CopyClassToClass_ContainsList()
        {
            // Arrange
            var sourceClass = new ClassContainsListOfClasses();

            sourceClass.SimpleTestClasses = new List <SimpleTestClass>()
            {
                new SimpleTestClass()
                {
                    Property1 = "test"
                }
            };

            var castrClass = new CastrClass <ClassContainsListOfClasses>(
                sourceClass, new Options.ClassOptions()
            {
            });

            // Act
            var newClass = castrClass.CastAsClass <ClassContainsListOfClasses>();

            /// Assert
            Assert.Equal("test", newClass.SimpleTestClasses.First().Property1);
        }