public void Compare_Two_Different_Transient_Enitites_As_NotEqual_Only_By_Theirs_BusinessKey_Properties()
        {
            // Arrange
            Entity entity1 = new EntityFakeWithBusinessKey("mila", "*****@*****.**") { Age = 32 };

            Entity entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };

            // Act

            // Assert
            Assert.AreNotEqual(entity1, entity2, "Two entites are equal.");
            Assert.AreNotEqual(entity1.GetHashCode(), entity2.GetHashCode(), "Two hashcodes are equal.");
        }
        public void Compare_Two_Equal_Entites_As_Equal_By_Operator()
        {
            // Arrange
            Entity entity1 = new EntityFakeWithBusinessKey("mica", "*****@*****.**") { Age = 32 };
            entity1.SetIdTo(32);

            Entity entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 6 };
            entity2.SetIdTo(32);

            // Act
            var areEqual = entity1 == entity2;

            // Assert
            Assert.IsTrue(areEqual, "Operator == isn't working.");
            Assert.AreEqual(entity1, entity2, "Two entites aren't equal.");
            Assert.AreEqual(entity1.GetHashCode(), entity2.GetHashCode(), "Two entites have different hashcodes.");
        }
        public void Compare_Two_Entites_Of_Diffrent_Type_Of_Hierarchy_As_NotEqual()
        {
            // Arrange
            EntityFake entity1 = new EntityFake("mica", "*****@*****.**") { Age = 32 };
            entity1.SetIdTo(32);

            EntityFakeWithBusinessKey entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };
            entity2.SetIdTo(32);

            // Act

            // Assert
            Assert.AreNotEqual(entity1, entity2, "Two entites aren't equal.");
            Assert.AreNotEqual(entity1.GetHashCode(), entity2.GetHashCode(), "Two entites have different hashcodes.");
        }
        public void Two_Entity_Objects_Which_Have_The_Same_Reference_Are_Always_Equal()
        {
            // Arrange
            Entity entity1 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };
            entity1.SetIdTo(32);
            Entity entity12 = entity1;

            Entity entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 6 };
            Entity entity22 = entity2;

            Entity entity3 = new EntityFake("mile", "*****@*****.**") { Age = 32 };
            entity1.SetIdTo(32);
            Entity entity32 = entity3;

            Entity entity4 = new EntityFake("mile", "*****@*****.**") { Age = 6 };
            Entity entity42 = entity4;

            // Act

            // Assert
            Assert.AreEqual(entity1, entity12, "Two entites aren't equal.");
            Assert.AreEqual(entity1.GetHashCode(), entity12.GetHashCode(), "Two hashcodes aren't equal.");
            Assert.AreSame(entity1, entity12, "Two entites haven't the same reference.");

            Assert.AreEqual(entity2, entity22, "Two entites aren't equal.");
            Assert.AreEqual(entity2.GetHashCode(), entity22.GetHashCode(), "Two hashcodes aren't equal.");
            Assert.AreSame(entity2, entity22, "Two entites haven't the same reference.");

            Assert.AreEqual(entity3, entity32, "Two entites aren't equal.");
            Assert.AreEqual(entity3.GetHashCode(), entity32.GetHashCode(), "Two hashcodes aren't equal.");
            Assert.AreSame(entity3, entity32, "Two entites haven't the same reference.");

            Assert.AreEqual(entity4, entity42, "Two entites aren't equal.");
            Assert.AreEqual(entity4.GetHashCode(), entity42.GetHashCode(), "Two hashcodes aren't equal.");
            Assert.AreSame(entity4, entity42, "Two entites haven't the same reference.");
        }
        public void One_Entity_Is_Transient_One_Persistent__With_The_Same_Properties_They_Are_NotEqual()
        {
            // Arrange
            Entity entity1 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };
            entity1.SetIdTo(32);
            Entity entity12 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };

            Entity entity2 = new EntityFake("mile", "*****@*****.**") {Age = 6};
            entity2.SetIdTo(6);
            Entity entity22 = new EntityFake("mile", "*****@*****.**") { Age = 6 };

            // Act

            // Assert
            Assert.AreNotEqual(entity1, entity12, "Two entites are equal.");
            Assert.AreNotEqual(entity1.GetHashCode(), entity12.GetHashCode(), "Two hashcodes are equal.");

            Assert.AreNotEqual(entity2, entity22, "Two entites are equal.");
            Assert.AreNotEqual(entity2.GetHashCode(), entity22.GetHashCode(), "Two hashcodes are equal.");
        }
        public void Entity_Properties_Which_Arent_Decorated_Havent_Influance_In_Comparison()
        {
            // Arrange
            EntityFakeWithBusinessKey entity1 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };

            EntityFakeWithBusinessKey entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 6 };

            // Act

            // Assert
            Assert.AreEqual(entity1, entity2, "Two entites aren't equal.");
            Assert.AreEqual(entity1.GetHashCode(), entity2.GetHashCode(), "Two entites have different haschodes.");
            Assert.AreNotEqual(entity1.Age, entity2.Age);
        }
        public void Compare_Two_Equal_Persisted_Enitites_With_BusinessKey_Properties_As_Equal_Only_By_Ids()
        {
            // Arrange
            Entity entity1 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") {Age = 32};
            entity1.SetIdTo(32);

            Entity entity2 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") {Age = 6};
            entity2.SetIdTo(32);

            // Act

            // Assert
            Assert.AreEqual(entity1, entity2, "Two entites aren't equal.");
            Assert.AreEqual(entity1.GetHashCode(), entity2.GetHashCode(), "Two entites have different haschodes.");
        }
        public void Compare_Two_Equal_Entites_One_As_SubClass_One_Cast_As_BaseClass_As_Equal()
        {
            // Arrange
            EntityFakeWithBusinessKey2 entity1 = new EntityFakeWithBusinessKey2("mile", "*****@*****.**") { Age = 32, Address = "Ulica"};
            entity1.SetIdTo(32);

            EntityFakeWithBusinessKey2 entity2 = new EntityFakeWithBusinessKey2("mile", "*****@*****.**") { Age = 32, Address = "Ulica" };
            entity2.SetIdTo(32);

            EntityFakeWithBusinessKey entity22 = entity2 as EntityFakeWithBusinessKey;

            EntityFakeWithBusinessKey entity3 = new EntityFakeWithBusinessKey("mile", "*****@*****.**") { Age = 32 };
            entity3.SetIdTo(32);

            // Act

            // Assert
            Assert.AreEqual(entity1, entity22, "Two entites aren't equal.");
            Assert.AreEqual(entity1.GetHashCode(), entity22.GetHashCode(), "Two entites haven't the same hashcodes.");
            Assert.AreEqual(typeof(EntityFakeWithBusinessKey2), entity1.GetUnproxiedType(), "Types are not equal.");
            Assert.AreEqual(typeof(EntityFakeWithBusinessKey2), entity22.GetUnproxiedType(), "Types are not equal.");

            Assert.AreNotEqual(entity1, entity3, "Two entites are equal.");
            Assert.AreNotEqual(entity1.GetHashCode(), entity3.GetHashCode(), "Two entites have the same hashcodes.");
            Assert.AreEqual(typeof(EntityFakeWithBusinessKey2), entity1.GetUnproxiedType(), "Types are not equal.");
            Assert.AreEqual(typeof(EntityFakeWithBusinessKey), entity3.GetUnproxiedType(), "Types are not equal.");
        }