Inheritance: CustomTypeSource
        public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClass_WhenInheritanceAndHasRelationship_ShouldCreateCorrectRelPropDefs()
        {
            //---------------Set up test pack-------------------
            var superClass           = typeof(FakeBOSuperClass);
            var subClass             = typeof(FakeBOSubClassWithRelationships);
            var source               = new FakeTypeSource(new[] { subClass, superClass });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef   = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);

            subClassDef.PropDefcol.ShouldHaveCount(1, "Should have FK for MultipleRel Created");
            superClassDef.PropDefcol.ShouldHaveCount(2, "Should have PK and Discriminator Created");

            subClassDef.RelationshipDefCol.ShouldHaveCount(2, "Should have Multiple and single Rel");
            var multipleRelDef     = subClassDef.RelationshipDefCol.First(relationshipDef => relationshipDef.IsOneToMany);
            var multipleRelPropDef = multipleRelDef.RelKeyDef.First();

            Assert.AreEqual("FakeBOSuperClassID", multipleRelPropDef.OwnerPropertyName);
            Assert.AreEqual("FakeBOSuperClassID", multipleRelPropDef.RelatedClassPropName);

            var singleRelDef     = subClassDef.RelationshipDefCol.First(relationshipDef => relationshipDef.IsManyToOne);
            var singleRelPropDef = singleRelDef.RelKeyDef.First();

            Assert.AreEqual("SingleRelID", singleRelPropDef.OwnerPropertyName);
            Assert.AreEqual("FakeBoNoPropsID", singleRelPropDef.RelatedClassPropName);
        }
        public void Test_Map_When2LayersOfInheritance_AndHasDiscriminatorProp_ShouldNotCreateDiscriminator()
        {
            //---------------Set up test pack-------------------
            var superSuperClass = typeof(FakeBOSuperClassWithDesc);
            var superClass      = typeof(FakeBOSubClassSuperHasDesc);
            var subClass        = typeof(FakeBOSubSubClassSuperHasDesc);
            var source          = new FakeTypeSource(new[] { superSuperClass, superClass, subClass });

            //---------------Assert Precondition----------------
            Assert.AreEqual(3, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            var classDefCol          = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var subClassDef             = classDefCol.First(def => def.ClassName == "FakeBOSubSubClassSuperHasDesc");
            var inheritanceDef          = subClassDef.SuperClassDef;
            var superClassClassDef      = inheritanceDef.SuperClassClassDef;
            var superSuperClassClassDef = superClassClassDef.SuperClassDef.SuperClassClassDef;

            superClassClassDef.PropDefcol.ShouldHaveCount(0,
                                                          "No Properties Should be created for SuperClass since ID and Discriminator will be on SuperSuperClass");
            var superSuperClassProps = superSuperClassClassDef.PropDefcol;

            superSuperClassProps.ShouldHaveCount(2, "Discriminator and ID Prop should be created");

            superSuperClassProps.ShouldContain(def => def.PropertyName == "FakeBOSuperClassWithDescType");
        }
        public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClasses_When2LayersOfInheritance_ShouldMapInheritanceRelationships()
        {
            //---------------Set up test pack-------------------
            var superSuperClass      = typeof(FakeBOSuperClassWithDesc);
            var superClass           = typeof(FakeBOSubClassSuperHasDesc);
            var subClass             = typeof(FakeBOSubSubClassSuperHasDesc);
            var source               = new FakeTypeSource(new[] { subClass, superSuperClass, superClass });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(3, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(3);
            var subClassDef        = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef      = classDefCol.First(def => def.ClassType == superClass);
            var superSuperClassDef = classDefCol.First(def => def.ClassType == superSuperClass);

            Assert.AreEqual(superClassDef.ClassType, subClassDef.SuperClassDef.SuperClassClassDef.ClassType);
            Assert.AreSame(superClassDef, subClassDef.SuperClassDef.SuperClassClassDef);
            Assert.AreEqual(superSuperClassDef.ClassType, superClassDef.SuperClassDef.SuperClassClassDef.ClassType);
            Assert.AreSame(superSuperClassDef, superClassDef.SuperClassDef.SuperClassClassDef);
        }
        public void Test_Map_WhenNotHasRevRelDefined_AndIsOneToOne_ShouldCreateSingleRevRel()
        {
            //---------------Set up test pack-------------------
            Type           boWith12M          = typeof(FakeBOWithOneToOneRel);
            Type           boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source             = new FakeTypeSource(
                new[] { boWith12M, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWith12M = classDefCol[boWith12M];

            cDefWith12M.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWith12M.RelationshipDefCol.First();

            Assert.IsInstanceOf(typeof(SingleRelationshipDef), relationshipDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];

            Assert.AreEqual(relationshipDef.ReverseRelationshipName, reverseRelDef.RelationshipName);
            Assert.AreEqual(relationshipDef.RelationshipName, reverseRelDef.ReverseRelationshipName);
            Assert.IsInstanceOf(typeof(SingleRelationshipDef), reverseRelDef);
            Assert.AreEqual(RelationshipType.Association, reverseRelDef.RelationshipType);
            Assert.AreEqual(DeleteParentAction.DoNothing, reverseRelDef.DeleteParentAction);
            Assert.IsTrue(reverseRelDef.OwningBOHasForeignKey);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenIDPropDeclaredInClassDefXml_ShouldSetRelatedPropToNonStandardID_FixBug1355()
        {
            //---------------Set up test pack-------------------


            var superClassDef = SuperClassWithPKFromClassDef.LoadClassDef();//Loaded from XML
            var defCol        = new ClassDefCol {
                superClassDef
            };


            var subClassWithPKFromClassDef = typeof(SubClassWithPKFromClassDef);
            var relatedToSubClassWithPKFromClassDefType = typeof(RelatedToSubClassWithPKFromClassDef);

            var source = new FakeTypeSource(new[] { subClassWithPKFromClassDef, relatedToSubClassWithPKFromClassDefType });

            AllClassesAutoMapper.ClassDefCol = defCol;
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithPKFromClassDef = classDefCol.FindByClassName(relatedToSubClassWithPKFromClassDefType.Name);

            Assert.AreEqual(1, relatedToSubClassWithPKFromClassDef.RelationshipDefCol.Count);
            var subClassWithPKFromClassDefRelDef = relatedToSubClassWithPKFromClassDef.RelationshipDefCol["SubClassWithPKFromClassDefSingleRel"];

            Assert.AreEqual(1, subClassWithPKFromClassDefRelDef.RelKeyDef.Count, "Should have a non composite Key");
            var relPropDef = subClassWithPKFromClassDefRelDef.RelKeyDef.FirstOrDefault();

            Assert.AreEqual("SubClassWithPKFromClassDefSingleRelID", relPropDef.OwnerPropertyName);
            Assert.AreEqual("MYPKID", relPropDef.RelatedClassPropName);
        }
        public void Test_Map_WhenNotHasFKPropDefined_AndIsOneToMany_ShouldFKProp()
        {
            //---------------Set up test pack-------------------
            Type           boWith12M          = typeof(FakeBOWithMultipleRel);
            Type           boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source             = new FakeTypeSource(
                new[] { boWith12M, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWith12M = classDefCol[boWith12M];

            cDefWith12M.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWith12M.RelationshipDefCol.First();

            Assert.IsInstanceOf(typeof(MultipleRelationshipDef), relationshipDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef     = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];
            IRelPropDef      reverseRelPropDef = reverseRelDef.RelKeyDef.First();

            cDefNoDefinedRel.PropDefcol.ShouldContain(propDef => propDef.PropertyName == reverseRelPropDef.OwnerPropertyName);
        }
        public void Test_Map_WhenInheritanceWithNonStandardIDProp_ShouldMapWithCorrectNonStandardIDProp()
        {
            //---------------Set up test pack-------------------
            var subClassWithNonStdID   = typeof(SubClassWithNonStandardID);
            var superClassWithNonStdID = typeof(SuperClassWithNonStandardID);
            var source = new FakeTypeSource(new[] { subClassWithNonStdID, superClassWithNonStdID });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreSame(superClassWithNonStdID, subClassWithNonStdID.BaseType);
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            Assert.AreEqual(2, classDefCol.Count);
            classDefCol.ShouldContain(def => def.ClassName == subClassWithNonStdID.Name, "Should contain SubClass");
            classDefCol.ShouldContain(def => def.ClassName == superClassWithNonStdID.Name, "Should Contain SuperClass");

            var subClassDef = classDefCol.FindByClassName(subClassWithNonStdID.Name);

            Assert.IsNull(subClassDef.PrimaryKeyDef);
            var superClassDef = classDefCol.FindByClassName(superClassWithNonStdID.Name);

            Assert.IsNotNull(superClassDef.PrimaryKeyDef);
            Assert.AreEqual(1, superClassDef.PrimaryKeyDef.Count, "The PrimaryKey (ObjectID) Should not be composite");
            var propDef = superClassDef.PrimaryKeyDef[0];

            Assert.AreEqual("NonStandardID", propDef.PropertyName);
        }
        public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClass_WhenInheritance_ShouldCreateDiscriminatorPropInSuperClass()
        {
            //---------------Set up test pack-------------------
            var superClass           = typeof(FakeBOSuperClass);
            var subClass             = typeof(FakeBOSubClass);
            var source               = new FakeTypeSource(new[] { subClass, superClass });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef   = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);

            var discriminatorPropName = subClassDef.SuperClassDef.Discriminator;

            var superClassProps = superClassDef.PropDefcol;

            superClassProps.ShouldHaveCount(2);
            superClassProps.ShouldContain(propDef => propDef.PropertyName == discriminatorPropName);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenNonStandardIDProp_ShouldSetRelatedPropToNonStandardID_FixBug1355()
        {
            //---------------Set up test pack-------------------
            var subClassWithNonStdID               = typeof(SubClassWithNonStandardID);
            var superClassWithNonStdID             = typeof(SuperClassWithNonStandardID);
            var relatedToSubClassWithNonStandardID = typeof(RelatedToSubClassWithNonStandardID);

            var source = new FakeTypeSource(new[] { subClassWithNonStdID, superClassWithNonStdID, relatedToSubClassWithNonStandardID });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------

            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithNonStandardIDClassDef = classDefCol.FindByClassName(relatedToSubClassWithNonStandardID.Name);

            Assert.AreEqual(1, relatedToSubClassWithNonStandardIDClassDef.RelationshipDefCol.Count);
            var subClassWithNonStandardIDRelDef = relatedToSubClassWithNonStandardIDClassDef.RelationshipDefCol["SubClassWithNonStandardIDSingleRel"];

            Assert.AreEqual(1, subClassWithNonStandardIDRelDef.RelKeyDef.Count, "Should have a non composite Key");
            var relPropDef = subClassWithNonStandardIDRelDef.RelKeyDef.FirstOrDefault();

            Assert.AreEqual("SubClassWithNonStandardIDSingleRelID", relPropDef.OwnerPropertyName);
            Assert.AreEqual("NonStandardID", relPropDef.RelatedClassPropName);
        }
        public void Test_MapWhenHasAbstract_ShouldNotMap()
        {
            //---------------Set up test pack-------------------
            FakeTypeSource       source = new FakeTypeSource(typeof(FakeAbstractBoShouldNotBeLoaded));
            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(1, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            Assert.AreEqual(0, classDefCol.Count);
        }
        public void Test_MapWhenHasInterface_ShouldNotMap()
        {
            //---------------Set up test pack-------------------
            FakeTypeSource source = new FakeTypeSource();

            source.Add <IFakeBoInterfaceShouldNotBeLoaded>();
            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(1, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            Assert.AreEqual(0, classDefCol.Count);
        }
        public void Test_Map_WhenRelatedClassNotInClassDefCol_ShouldNotRaiseError()
        {
            //---------------Set up test pack-------------------
            Type           boWith12M = typeof(FakeBOWithMultipleRel);
            FakeTypeSource source    = new FakeTypeSource(
                new[] { boWith12M });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(1, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(1);
        }
        public void Test_Map_WhenHaveTwoClassesShouldMapBoth()
        {
            //---------------Set up test pack-------------------
            Type type1 = typeof(FakeBOWithNoRelationship);
            Type type2 = typeof(FakeBoNoProps);
            FakeTypeSource source = new FakeTypeSource(
                    new[] { type1, type2 });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            Assert.IsNotNull(classDefCol);
            Assert.AreEqual(2, classDefCol.Count);
            classDefCol.ShouldContain(def => def.ClassName == type1.Name);
            classDefCol.ShouldContain(def => def.ClassName == type2.Name);
        }
        public void Test_Map_GivenTypeSourceProvidesSubClassesBeforeSuperClass_WhenInheritanceWithMultipleDerivatives_ShouldSameSuperClass()
        {
            //---------------Set up test pack-------------------
            var parentSuperClass     = typeof(FakeBOSuperClass);
            var parentSubClassA      = typeof(FakeBOSubClass);
            var parentSubClassB      = typeof(FakeBOSubClassA);
            var source               = new FakeTypeSource(new[] { parentSubClassA, parentSubClassB, parentSuperClass });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(3, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(3);
            Assert.AreSame(classDefCol[parentSubClassA].SuperClassClassDef, classDefCol[parentSuperClass]);
            Assert.AreSame(classDefCol[parentSubClassB].SuperClassClassDef, classDefCol[parentSuperClass]);
            Assert.AreSame(classDefCol[parentSubClassA].SuperClassClassDef, classDefCol[parentSubClassB].SuperClassClassDef);
        }
        public void Test_Map_WhenHaveTwoClassesShouldMapBoth()
        {
            //---------------Set up test pack-------------------
            Type           type1  = typeof(FakeBOWithNoRelationship);
            Type           type2  = typeof(FakeBoNoProps);
            FakeTypeSource source = new FakeTypeSource(
                new[] { type1, type2 });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            Assert.IsNotNull(classDefCol);
            Assert.AreEqual(2, classDefCol.Count);
            classDefCol.ShouldContain(def => def.ClassName == type1.Name);
            classDefCol.ShouldContain(def => def.ClassName == type2.Name);
        }
        public void Test_Map_WhenTypeInSourceTwice_ShouldAddSingleClassDef()
        {
            //---------------Set up test pack-------------------
            Type           typeFirstTime  = typeof(FakeBOWithOneToOneRel);
            Type           typeSecondTime = typeof(FakeBOWithOneToOneRel);
            FakeTypeSource source         = new FakeTypeSource(
                new[] { typeFirstTime, typeSecondTime });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            Assert.AreEqual(1, classDefCol.Count);
            var classDef = classDefCol.First();

            Assert.AreSame(typeSecondTime, classDef.ClassType);
        }
        public void Test_Map_WhenSubClassHasSuperClassWithUniqueConstraint_ShouldNotCreateDuplicate()
        {
            //---------------Set up test pack-------------------
            var superClass = typeof(FakeBOSuperClassWithUC);
            var subClass   = typeof(FakeBOSubClassWithSuperHasUC);
            var source     = new FakeTypeSource(new[] { superClass, subClass });

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            var classDefCol          = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var subClassDef        = classDefCol.First(def => def.ClassName == "FakeBOSubClassWithSuperHasUC");
            var inheritanceDef     = subClassDef.SuperClassDef;
            var superClassClassDef = inheritanceDef.SuperClassClassDef;

            Assert.AreEqual(0, subClassDef.KeysCol.Count);
            Assert.AreEqual(1, superClassClassDef.KeysCol.Count);
            Assert.AreEqual("UC_Fake", superClassClassDef.KeysCol["UC_Fake"].KeyName);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenNonStandardIDProp_ShouldSetRelatedPropToNonStandardID_FixBug1355()
        {
            //---------------Set up test pack-------------------
            var subClassWithNonStdID = typeof(SubClassWithNonStandardID);
            var superClassWithNonStdID = typeof(SuperClassWithNonStandardID);
            var relatedToSubClassWithNonStandardID = typeof(RelatedToSubClassWithNonStandardID);

            var source = new FakeTypeSource(new[] { subClassWithNonStdID, superClassWithNonStdID, relatedToSubClassWithNonStandardID });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------

            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithNonStandardIDClassDef = classDefCol.FindByClassName(relatedToSubClassWithNonStandardID.Name);
            Assert.AreEqual(1, relatedToSubClassWithNonStandardIDClassDef.RelationshipDefCol.Count);
            var subClassWithNonStandardIDRelDef = relatedToSubClassWithNonStandardIDClassDef.RelationshipDefCol["SubClassWithNonStandardIDSingleRel"];
            Assert.AreEqual(1, subClassWithNonStandardIDRelDef.RelKeyDef.Count, "Should have a non composite Key");
            var relPropDef = subClassWithNonStandardIDRelDef.RelKeyDef.FirstOrDefault();
            Assert.AreEqual("SubClassWithNonStandardIDSingleRelID", relPropDef.OwnerPropertyName);
            Assert.AreEqual("NonStandardID", relPropDef.RelatedClassPropName);
        }
        public void Test_Map_WhenNotHasReverseRelDefined_ShouldCreateReverseRel()
        {
            //---------------Set up test pack-------------------
            Type           boWithM21          = typeof(FakeManyToOneBoRelNoFK);
            Type           boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source             = new FakeTypeSource(
                new[] { boWithM21, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWithM21 = classDefCol[boWithM21];

            cDefWithM21.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWithM21.RelationshipDefCol.FirstOrDefault();

            Assert.IsNotNull(relationshipDef);

            Assert.IsNotNullOrEmpty(relationshipDef.ReverseRelationshipName);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            cDefNoDefinedRel.RelationshipDefCol.ShouldHaveCount(1);

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];

            Assert.AreEqual(relationshipDef.ReverseRelationshipName, reverseRelDef.RelationshipName);
            Assert.AreEqual(relationshipDef.RelationshipName, reverseRelDef.ReverseRelationshipName);
            Assert.IsInstanceOf(typeof(MultipleRelationshipDef), reverseRelDef);
            Assert.AreEqual(RelationshipType.Association, reverseRelDef.RelationshipType);
            Assert.AreEqual(DeleteParentAction.Prevent, reverseRelDef.DeleteParentAction);
            Assert.IsFalse(reverseRelDef.OwningBOHasForeignKey);
        }
        public void Test_Map_WhenNotHasReverseRelDefined_ShouldCreateRelProp()
        {
            //---------------Set up test pack-------------------
            Type           boWithM21          = typeof(FakeManyToOneBoRelNoFK);
            Type           boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source             = new FakeTypeSource(
                new[] { boWithM21, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWithM21 = classDefCol[boWithM21];

            cDefWithM21.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWithM21.RelationshipDefCol.FirstOrDefault();

            Assert.IsNotNull(relationshipDef);
            relationshipDef.RelKeyDef.ShouldHaveCount(1);
            IRelPropDef relPropDef = relationshipDef.RelKeyDef.FirstOrDefault();

            Assert.IsNotNull(relPropDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];

            reverseRelDef.RelKeyDef.ShouldHaveCount(1);
            IRelPropDef revereRelPropDef = reverseRelDef.RelKeyDef.FirstOrDefault();

            Assert.IsNotNull(revereRelPropDef, "ReverseRelationship ShouldHave Been Created");
            Assert.AreEqual(relPropDef.OwnerPropertyName, revereRelPropDef.RelatedClassPropName);
            Assert.AreEqual(relPropDef.RelatedClassPropName, revereRelPropDef.OwnerPropertyName);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenIDPropDeclaredInClassDefXml_ShouldNotCreatePropDefOnSubClass()
        {
            //---------------Set up test pack-------------------

            var superClassDef = SuperClassWithPKFromClassDef.LoadClassDef();//Loaded from XML
            var defCol        = new ClassDefCol {
                superClassDef
            };

            var subClassWithPKFromClassDef = typeof(SubClassWithPKFromClassDef);
            var relatedToSubClassWithPKFromClassDefType = typeof(RelatedToSubClassWithPKFromClassDef);

            var source = new FakeTypeSource(new[] { subClassWithPKFromClassDef, relatedToSubClassWithPKFromClassDefType });

            AllClassesAutoMapper.ClassDefCol = defCol;
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithPKFromClassDef = classDefCol.FindByClassName(subClassWithPKFromClassDef.Name);

            relatedToSubClassWithPKFromClassDef.PropDefcol.ShouldNotContain(def => def.PropertyName == "MYPKID");
        }
        public void Test_Map_WhenInheritanceWithNonStandardIDProp_ShouldMapWithCorrectNonStandardIDProp()
        {
            //---------------Set up test pack-------------------
            var subClassWithNonStdID = typeof (SubClassWithNonStandardID);
            var superClassWithNonStdID = typeof(SuperClassWithNonStandardID);
            var source = new FakeTypeSource(new[] { subClassWithNonStdID, superClassWithNonStdID });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreSame(superClassWithNonStdID, subClassWithNonStdID.BaseType);
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            Assert.AreEqual(2, classDefCol.Count);
            classDefCol.ShouldContain(def => def.ClassName == subClassWithNonStdID.Name, "Should contain SubClass");
            classDefCol.ShouldContain(def => def.ClassName == superClassWithNonStdID.Name, "Should Contain SuperClass");

            var subClassDef = classDefCol.FindByClassName(subClassWithNonStdID.Name);
            Assert.IsNull(subClassDef.PrimaryKeyDef);
            var superClassDef = classDefCol.FindByClassName(superClassWithNonStdID.Name);
            Assert.IsNotNull(superClassDef.PrimaryKeyDef);
            Assert.AreEqual(1, superClassDef.PrimaryKeyDef.Count, "The PrimaryKey (ObjectID) Should not be composite");
            var propDef = superClassDef.PrimaryKeyDef[0];
            Assert.AreEqual("NonStandardID", propDef.PropertyName);
        }
        public void Test_Map_WhenInheritance_ShouldNotCreatePKInSubClass()
        {
            //---------------Set up test pack-------------------
            var superClass           = typeof(FakeBOSuperClass);
            var subClass             = typeof(FakeBOSubClass);
            var source               = new FakeTypeSource(new[] { superClass, subClass });
            var allClassesAutoMapper = new AllClassesAutoMapper(source);

            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();

            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef   = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);

            Assert.IsNotNull(superClassDef.PrimaryKeyDef);
            Assert.IsNull(subClassDef.PrimaryKeyDef, "Should Not Create a PK since it will use the super classes PK");

            subClassDef.PropDefcol.ShouldBeEmpty();
            superClassDef.PropDefcol.ShouldNotBeEmpty();
        }
 public void Test_Map_GivenTypeSourceProvidesSubClassesBeforeSuperClass_WhenInheritanceWithMultipleDerivatives_ShouldSameSuperClass()
 {
     //---------------Set up test pack-------------------
     var parentSuperClass = typeof(FakeBOSuperClass);
     var parentSubClassA = typeof(FakeBOSubClass);
     var parentSubClassB = typeof(FakeBOSubClassA);
     var source = new FakeTypeSource(new[] {parentSubClassA, parentSubClassB, parentSuperClass});
     var allClassesAutoMapper = new AllClassesAutoMapper(source);
     //---------------Assert Precondition----------------
     Assert.AreEqual(3, source.GetTypes().Count());
     //---------------Execute Test ----------------------
     var classDefCol = allClassesAutoMapper.Map();
     //---------------Test Result -----------------------
     classDefCol.ShouldHaveCount(3);
     Assert.AreSame(classDefCol[parentSubClassA].SuperClassClassDef, classDefCol[parentSuperClass]);
     Assert.AreSame(classDefCol[parentSubClassB].SuperClassClassDef, classDefCol[parentSuperClass]);
     Assert.AreSame(classDefCol[parentSubClassA].SuperClassClassDef, classDefCol[parentSubClassB].SuperClassClassDef);
 }
        public void Test_Map_WhenInheritance_ShouldNotCreatePKInSubClass()
        {
            //---------------Set up test pack-------------------
            var superClass = typeof(FakeBOSuperClass);
            var subClass = typeof(FakeBOSubClass);
            var source = new FakeTypeSource(new[] {superClass, subClass});
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);
            Assert.IsNotNull(superClassDef.PrimaryKeyDef);
            Assert.IsNull(subClassDef.PrimaryKeyDef, "Should Not Create a PK since it will use the super classes PK");

            subClassDef.PropDefcol.ShouldBeEmpty();
            superClassDef.PropDefcol.ShouldNotBeEmpty();
        }
        public void Test_Map_WhenRelatedClassNotInClassDefCol_ShouldNotRaiseError()
        {
            //---------------Set up test pack-------------------
            Type boWith12M = typeof(FakeBOWithMultipleRel);
            FakeTypeSource source = new FakeTypeSource(
                new[] { boWith12M});

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(1, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(1);
        }
 public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClasses_When2LayersOfInheritance_ShouldMapInheritanceRelationships()
 {
     //---------------Set up test pack-------------------
     var superSuperClass = typeof(FakeBOSuperClassWithDesc);
     var superClass = typeof(FakeBOSubClassSuperHasDesc);
     var subClass = typeof(FakeBOSubSubClassSuperHasDesc);
     var source = new FakeTypeSource(new[] {subClass, superSuperClass, superClass});
     var allClassesAutoMapper = new AllClassesAutoMapper(source);
     //---------------Assert Precondition----------------
     Assert.AreEqual(3, source.GetTypes().Count());
     //---------------Execute Test ----------------------
     var classDefCol = allClassesAutoMapper.Map();
     //---------------Test Result -----------------------
     classDefCol.ShouldHaveCount(3);
     var subClassDef = classDefCol.First(def => def.ClassType == subClass);
     var superClassDef = classDefCol.First(def => def.ClassType == superClass);
     var superSuperClassDef = classDefCol.First(def => def.ClassType == superSuperClass);
     Assert.AreEqual(superClassDef.ClassType, subClassDef.SuperClassDef.SuperClassClassDef.ClassType);
     Assert.AreSame(superClassDef, subClassDef.SuperClassDef.SuperClassClassDef);
     Assert.AreEqual(superSuperClassDef.ClassType, superClassDef.SuperClassDef.SuperClassClassDef.ClassType);
     Assert.AreSame(superSuperClassDef, superClassDef.SuperClassDef.SuperClassClassDef);
 }
        public void Test_Map_WhenNotHasRevRelDefined_AndIsOneToOne_ShouldCreateSingleRevRel()
        {
            //---------------Set up test pack-------------------
            Type boWith12M = typeof(FakeBOWithOneToOneRel);
            Type boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source = new FakeTypeSource(
                new[] { boWith12M, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWith12M = classDefCol[boWith12M];
            cDefWith12M.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWith12M.RelationshipDefCol.First();
            Assert.IsInstanceOf(typeof(SingleRelationshipDef), relationshipDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];
            Assert.AreEqual(relationshipDef.ReverseRelationshipName, reverseRelDef.RelationshipName);
            Assert.AreEqual(relationshipDef.RelationshipName, reverseRelDef.ReverseRelationshipName);
            Assert.IsInstanceOf(typeof(SingleRelationshipDef), reverseRelDef);
            Assert.AreEqual(RelationshipType.Association, reverseRelDef.RelationshipType);
            Assert.AreEqual(DeleteParentAction.DoNothing, reverseRelDef.DeleteParentAction);
            Assert.IsTrue(reverseRelDef.OwningBOHasForeignKey);
        }
        public void Test_Map_WhenTypeInSourceTwice_ShouldAddSingleClassDef()
        {
            //---------------Set up test pack-------------------
            Type typeFirstTime = typeof(FakeBOWithOneToOneRel);
            Type typeSecondTime = typeof(FakeBOWithOneToOneRel);
            FakeTypeSource source = new FakeTypeSource(
                new[] { typeFirstTime, typeSecondTime });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            Assert.AreEqual(1, classDefCol.Count);
            var classDef = classDefCol.First();
            Assert.AreSame(typeSecondTime, classDef.ClassType);
        }
        public void Test_Map_WhenNotHasReverseRelDefined_ShouldCreateRelProp()
        {

            //---------------Set up test pack-------------------
            Type boWithM21 = typeof(FakeManyToOneBoRelNoFK);
            Type boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source = new FakeTypeSource(
                new[] { boWithM21, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWithM21 = classDefCol[boWithM21];
            cDefWithM21.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWithM21.RelationshipDefCol.FirstOrDefault();
            Assert.IsNotNull(relationshipDef);
            relationshipDef.RelKeyDef.ShouldHaveCount(1);
            IRelPropDef relPropDef = relationshipDef.RelKeyDef.FirstOrDefault();
            Assert.IsNotNull(relPropDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];
            reverseRelDef.RelKeyDef.ShouldHaveCount(1);
            IRelPropDef revereRelPropDef = reverseRelDef.RelKeyDef.FirstOrDefault();
            Assert.IsNotNull(revereRelPropDef, "ReverseRelationship ShouldHave Been Created");
            Assert.AreEqual(relPropDef.OwnerPropertyName, revereRelPropDef.RelatedClassPropName);
            Assert.AreEqual(relPropDef.RelatedClassPropName, revereRelPropDef.OwnerPropertyName);
        }
        public void Test_Map_WhenNotHasFKPropDefined_AndIsOneToMany_ShouldFKProp()
        {
            //---------------Set up test pack-------------------
            Type boWith12M = typeof(FakeBOWithMultipleRel);
            Type boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source = new FakeTypeSource(
                new[] { boWith12M, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWith12M = classDefCol[boWith12M];
            cDefWith12M.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWith12M.RelationshipDefCol.First();
            Assert.IsInstanceOf(typeof(MultipleRelationshipDef), relationshipDef);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];
            IRelPropDef reverseRelPropDef = reverseRelDef.RelKeyDef.First();
            cDefNoDefinedRel.PropDefcol.ShouldContain(propDef => propDef.PropertyName == reverseRelPropDef.OwnerPropertyName);
        }
        public void Test_Map_WhenNotHasReverseRelDefined_ShouldCreateReverseRel()
        {
            //---------------Set up test pack-------------------
            Type boWithM21 = typeof(FakeManyToOneBoRelNoFK);
            Type boWithNoDefinedRel = typeof(FakeBOWithNoRelationship);
            FakeTypeSource source = new FakeTypeSource(
                new[] { boWithM21, boWithNoDefinedRel });

            AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            ClassDefCol classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            IClassDef cDefWithM21 = classDefCol[boWithM21];
            cDefWithM21.RelationshipDefCol.ShouldHaveCount(1);
            IRelationshipDef relationshipDef = cDefWithM21.RelationshipDefCol.FirstOrDefault();
            Assert.IsNotNull(relationshipDef);

            Assert.IsNotNullOrEmpty(relationshipDef.ReverseRelationshipName);

            IClassDef cDefNoDefinedRel = classDefCol[boWithNoDefinedRel];
            cDefNoDefinedRel.RelationshipDefCol.ShouldHaveCount(1);

            IRelationshipDef reverseRelDef = cDefNoDefinedRel.RelationshipDefCol[relationshipDef.ReverseRelationshipName];
            Assert.AreEqual(relationshipDef.ReverseRelationshipName, reverseRelDef.RelationshipName);
            Assert.AreEqual(relationshipDef.RelationshipName, reverseRelDef.ReverseRelationshipName);
            Assert.IsInstanceOf(typeof(MultipleRelationshipDef), reverseRelDef);
            Assert.AreEqual(RelationshipType.Association, reverseRelDef.RelationshipType);
            Assert.AreEqual(DeleteParentAction.Prevent, reverseRelDef.DeleteParentAction);
            Assert.IsFalse(reverseRelDef.OwningBOHasForeignKey);
        }
 public void Test_MapWhenHasAbstract_ShouldNotMap()
 {
     //---------------Set up test pack-------------------
     FakeTypeSource source = new FakeTypeSource(typeof(FakeAbstractBoShouldNotBeLoaded));
     AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
     //---------------Assert Precondition----------------
     Assert.AreEqual(1, source.GetTypes().Count());
     //---------------Execute Test ----------------------
     ClassDefCol classDefCol = allClassesAutoMapper.Map();
     //---------------Test Result -----------------------
     Assert.AreEqual(0, classDefCol.Count);
 }
 public void Test_MapWhenHasInterface_ShouldNotMap()
 {
     //---------------Set up test pack-------------------
     FakeTypeSource source = new FakeTypeSource();
     source.Add<IFakeBoInterfaceShouldNotBeLoaded>();
     AllClassesAutoMapper allClassesAutoMapper = new AllClassesAutoMapper(source);
     //---------------Assert Precondition----------------
     Assert.AreEqual(1, source.GetTypes().Count());
     //---------------Execute Test ----------------------
     ClassDefCol classDefCol = allClassesAutoMapper.Map();
     //---------------Test Result -----------------------
     Assert.AreEqual(0, classDefCol.Count);
 }
        public void Test_Map_When2LayersOfInheritance_AndHasDiscriminatorProp_ShouldNotCreateDiscriminator()
        {
            //---------------Set up test pack-------------------
            var superSuperClass = typeof(FakeBOSuperClassWithDesc);
            var superClass = typeof(FakeBOSubClassSuperHasDesc);
            var subClass = typeof(FakeBOSubSubClassSuperHasDesc);
            var source = new FakeTypeSource(new[] {superSuperClass, superClass, subClass});
            //---------------Assert Precondition----------------
            Assert.AreEqual(3, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var subClassDef = classDefCol.First(def => def.ClassName == "FakeBOSubSubClassSuperHasDesc");
            var inheritanceDef = subClassDef.SuperClassDef;
            var superClassClassDef = inheritanceDef.SuperClassClassDef;
            var superSuperClassClassDef = superClassClassDef.SuperClassDef.SuperClassClassDef;

            superClassClassDef.PropDefcol.ShouldHaveCount(0,
                "No Properties Should be created for SuperClass since ID and Discriminator will be on SuperSuperClass");
            var superSuperClassProps = superSuperClassClassDef.PropDefcol;
            superSuperClassProps.ShouldHaveCount(2, "Discriminator and ID Prop should be created");

            superSuperClassProps.ShouldContain(def => def.PropertyName == "FakeBOSuperClassWithDescType");
        }
        public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClass_WhenInheritance_ShouldCreateDiscriminatorPropInSuperClass()
        {
            //---------------Set up test pack-------------------
            var superClass = typeof(FakeBOSuperClass);
            var subClass = typeof(FakeBOSubClass);
            var source = new FakeTypeSource(new[] {subClass, superClass});
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);

            var discriminatorPropName = subClassDef.SuperClassDef.Discriminator;

            var superClassProps = superClassDef.PropDefcol;
            superClassProps.ShouldHaveCount(2);
            superClassProps.ShouldContain(propDef => propDef.PropertyName == discriminatorPropName);
        }
        public void Test_Map_GivenTypeSourceProvidesSubClassBeforeSuperClass_WhenInheritanceAndHasRelationship_ShouldCreateCorrectRelPropDefs()
        {
            //---------------Set up test pack-------------------
            var superClass = typeof(FakeBOSuperClass);
            var subClass = typeof(FakeBOSubClassWithRelationships);
            var source = new FakeTypeSource(new[] {subClass, superClass});
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            classDefCol.ShouldHaveCount(2);
            var subClassDef = classDefCol.First(def => def.ClassType == subClass);
            var superClassDef = classDefCol.First(def => def.ClassType == superClass);

            subClassDef.PropDefcol.ShouldHaveCount(1, "Should have FK for MultipleRel Created");
            superClassDef.PropDefcol.ShouldHaveCount(2, "Should have PK and Discriminator Created");

            subClassDef.RelationshipDefCol.ShouldHaveCount(2, "Should have Multiple and single Rel");
            var multipleRelDef = subClassDef.RelationshipDefCol.First(relationshipDef => relationshipDef.IsOneToMany);
            var multipleRelPropDef = multipleRelDef.RelKeyDef.First();
            Assert.AreEqual("FakeBOSuperClassID", multipleRelPropDef.OwnerPropertyName);
            Assert.AreEqual("FakeBOSuperClassID", multipleRelPropDef.RelatedClassPropName);

            var singleRelDef = subClassDef.RelationshipDefCol.First(relationshipDef => relationshipDef.IsManyToOne);
            var singleRelPropDef = singleRelDef.RelKeyDef.First();
            Assert.AreEqual("SingleRelID", singleRelPropDef.OwnerPropertyName);
            Assert.AreEqual("FakeBoNoPropsID", singleRelPropDef.RelatedClassPropName);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenIDPropDeclaredInClassDefXml_ShouldSetRelatedPropToNonStandardID_FixBug1355()
        {
            //---------------Set up test pack-------------------


            var superClassDef = SuperClassWithPKFromClassDef.LoadClassDef();//Loaded from XML
            var defCol = new ClassDefCol {superClassDef};


            var subClassWithPKFromClassDef = typeof(SubClassWithPKFromClassDef);
            var relatedToSubClassWithPKFromClassDefType = typeof(RelatedToSubClassWithPKFromClassDef);

            var source = new FakeTypeSource(new[] {subClassWithPKFromClassDef, relatedToSubClassWithPKFromClassDefType });
            AllClassesAutoMapper.ClassDefCol = defCol;
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------

            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithPKFromClassDef = classDefCol.FindByClassName(relatedToSubClassWithPKFromClassDefType.Name);
            Assert.AreEqual(1, relatedToSubClassWithPKFromClassDef.RelationshipDefCol.Count);
            var subClassWithPKFromClassDefRelDef = relatedToSubClassWithPKFromClassDef.RelationshipDefCol["SubClassWithPKFromClassDefSingleRel"];
            Assert.AreEqual(1, subClassWithPKFromClassDefRelDef.RelKeyDef.Count, "Should have a non composite Key");
            var relPropDef = subClassWithPKFromClassDefRelDef.RelKeyDef.FirstOrDefault();
            Assert.AreEqual("SubClassWithPKFromClassDefSingleRelID", relPropDef.OwnerPropertyName);
            Assert.AreEqual("MYPKID", relPropDef.RelatedClassPropName);
    }
        public void Test_Map_WhenSubClassHasSuperClassWithUniqueConstraint_ShouldNotCreateDuplicate()
        {
            //---------------Set up test pack-------------------
            var superClass = typeof(FakeBOSuperClassWithUC);
            var subClass = typeof(FakeBOSubClassWithSuperHasUC);
            var source = new FakeTypeSource(new[] {superClass, subClass});
            //---------------Assert Precondition----------------
            Assert.AreEqual(2, source.GetTypes().Count());
            //---------------Execute Test ----------------------
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var subClassDef = classDefCol.First(def => def.ClassName == "FakeBOSubClassWithSuperHasUC");
            var inheritanceDef = subClassDef.SuperClassDef;
            var superClassClassDef = inheritanceDef.SuperClassClassDef;

            Assert.AreEqual(0, subClassDef.KeysCol.Count);
            Assert.AreEqual(1, superClassClassDef.KeysCol.Count);
            Assert.AreEqual("UC_Fake", superClassClassDef.KeysCol["UC_Fake"].KeyName);
        }
        public void Test_Map_WhenSingleRelationshipToSubClass_WhenIDPropDeclaredInClassDefXml_ShouldNotCreatePropDefOnSubClass()
        {
            //---------------Set up test pack-------------------

            var superClassDef = SuperClassWithPKFromClassDef.LoadClassDef();//Loaded from XML
            var defCol = new ClassDefCol {superClassDef};

            var subClassWithPKFromClassDef = typeof(SubClassWithPKFromClassDef);
            var relatedToSubClassWithPKFromClassDefType = typeof(RelatedToSubClassWithPKFromClassDef);

            var source = new FakeTypeSource(new[] {subClassWithPKFromClassDef, relatedToSubClassWithPKFromClassDefType });
            AllClassesAutoMapper.ClassDefCol = defCol;
            var allClassesAutoMapper = new AllClassesAutoMapper(source);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var classDefCol = allClassesAutoMapper.Map();
            //---------------Test Result -----------------------
            var relatedToSubClassWithPKFromClassDef = classDefCol.FindByClassName(subClassWithPKFromClassDef.Name);
            relatedToSubClassWithPKFromClassDef.PropDefcol.ShouldNotContain(def => def.PropertyName == "MYPKID");
        }