public AssertionResult Assert(TP actualPropertyValue)
        {
            var notEqualMessage = FailingMessageFactory.CreateNotEqualMessage(_expectedValue, actualPropertyValue);

            var actualIsNull   = actualPropertyValue == null;
            var expectedIsNull = _expectedValue == null;

            // Both Null = fine
            if (actualIsNull && expectedIsNull)
            {
                return(AssertionResult.CreateSuccess());
            }

            // One Null = Not fine
            if (!actualIsNull ^ !expectedIsNull)
            {
                return(AssertionResult.CreateFail(notEqualMessage));
            }

            if (actualPropertyValue.Equals(_expectedValue))
            {
                return(AssertionResult.CreateSuccess());
            }

            return(AssertionResult.CreateFail(notEqualMessage));
        }
        public AssertionResult Assert(TP actualPropertyValue)
        {
            var notEqualMessage = FailingMessageFactory.CreateNotEqualMessage(_expectedValues, actualPropertyValue);

            var actualIsNull   = actualPropertyValue == null;
            var expectedIsNull = _expectedValues == null;

            // Both Null = fine
            if (actualIsNull && expectedIsNull)
            {
                return(AssertionResult.CreateSuccess());
            }

            // One Null = Not fine
            if (!actualIsNull ^ !expectedIsNull)
            {
                return(AssertionResult.CreateFail(notEqualMessage));
            }

            // Compare enumerables
            if (!(actualPropertyValue is IEnumerable <object> actualCollection))
            {
                var notEnumerableMessage = $"Actual '{ObjectInterpreter.GetStringRepresentation(actualPropertyValue)}' is not an IEnumerable.";
                return(AssertionResult.CreateFail(notEnumerableMessage));
            }

            if (actualCollection.HasSameElementsAs(_expectedValues))
            {
                return(AssertionResult.CreateSuccess());
            }

            return(AssertionResult.CreateFail(notEqualMessage));
        }
        public void ComparingConstructorNull_ToNotNullValueCollection_DoesThrow()
        {
            var expectedList           = new List <string>();
            var expexctedMessageEnding = FailingMessageFactory.CreateNotEqualMessage(expectedList, null);

            Assert.That(
                () =>
            {
                ConstructorTestBuilderFactory.Constructing <Organisation>()
                .UsingDefaultConstructor()
                .WithArgumentValues(null)
                .Maps()
                .ToProperty(f => f.Addresses).WithValues(expectedList)
                .BuildMaps()
                .Assert();
            },
                Throws.TypeOf <AssertionException>()
                .And.Message.EndsWith(expexctedMessageEnding));
        }
        public void ComparingConstructorNull_ToNotNullValue_DoesThrow()
        {
            var expectedDate          = new DateTime(1986, 12, 29);
            var expectedMessageEnding = FailingMessageFactory.CreateNotEqualMessage(expectedDate, null);

            Assert.That(
                () =>
            {
                ConstructorTestBuilderFactory.Constructing <Individual>()
                .UsingConstructorWithParameters(typeof(string), typeof(string), typeof(DateTime?))
                .WithArgumentValues("Matthias", "Müller", null)
                .Maps()
                .ToProperty(f => f.BirthDate).WithValue(expectedDate)
                .ToProperty(f => f.FirstName).WithValue("Matthias")
                .ToProperty(f => f.LastName).WithValue("Müller")
                .BuildMaps()
                .Assert();
            },
                Throws.TypeOf <AssertionException>()
                .And.Message.EndsWith(expectedMessageEnding));
        }
        public void WithMappingToProperty_MappingBeingIncorrect_Throws()
        {
            const string FirstName = "Steve";
            const string LastName  = "Austin";
            var          birthdate = new DateTime(1964, 12, 18);
            const string ExpectedFullNameBeingWrong = "Other String";
            const string ActualCorrectFullName      = "Steve Austin";

            var expexctedMessageEnding = FailingMessageFactory.CreateNotEqualMessage(ExpectedFullNameBeingWrong, ActualCorrectFullName);

            Assert.That(
                () =>
            {
                ConstructorTestBuilderFactory.Constructing <Individual>()
                .UsingConstructorWithParameters(typeof(string), typeof(string), typeof(DateTime?))
                .WithArgumentValues(FirstName, LastName, birthdate)
                .Maps()
                .ToProperty(f => f.FullName).WithValue(ExpectedFullNameBeingWrong)
                .BuildMaps()
                .Assert();
            },
                Throws.TypeOf <AssertionException>()
                .And.Message.EndsWith(expexctedMessageEnding));
        }
        public void PassingCollectionValues_MappingPropertyToCollectionWithDifferentValues_Throws()
        {
            var actualList = new List <string> {
                "Test1", "Test2"
            };
            var expectedList = new List <string> {
                "Other1", "Test2"
            };
            var expexctedMessageEnding = FailingMessageFactory.CreateNotEqualMessage(expectedList, actualList);

            Assert.That(
                () =>
            {
                ConstructorTestBuilderFactory.Constructing <Organisation>()
                .UsingDefaultConstructor()
                .WithArgumentValues(actualList)
                .Maps()
                .ToProperty(f => f.Addresses).WithValues(expectedList)
                .BuildMaps()
                .Assert();
            },
                Throws.TypeOf <AssertionException>()
                .And.Message.EndsWith(expexctedMessageEnding));
        }