public void WriteMessageTo_WithCollectionMemberWithLessMembers_ContainsIndexedDiscrepancy()
        {
            var withAddresses = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new[]
                {
                    new Address {
                        AddressLineOne = "1_1", AddressLineTwo = "1_2", City = "city_1", State = "state_1", Zipcode = "zip_1"
                    },
                    new Address {
                        AddressLineOne = "2_1", AddressLineTwo = "2_2", City = "city_2", State = "state_2", Zipcode = "zip_2"
                    }
                }
            };

            var lessAddresses = new
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new object[] { new { AddressLineOne = "1_1" } }
            };

            var subject = new MatchingConstraint(lessAddresses);

            Assert.That(getMessage(subject, withAddresses),
                        memberContainer("Addresses") &
                        indexOfOffendingCollectionItem(1) &
                        missingExpectedMember() &
                        actualValue(Does.Contain("Address")));
        }
        public void UsingCustomEqualityComparer_Works_ButFeedbackWhenFailingIsPoor()
        {
            CustomerWithCollection actual   = someComplicatedOperation();
            CustomerWithCollection expected = new CustomerWithCollection
            {
                Name      = "someName",
                Addresses = new[]
                {
                    new Address {
                        Zipcode = "zip_1"
                    },
                    new Address {
                        Zipcode = "wrong"
                    }
                }
            };

            // when fails only the class name is reported, nothing else
            string typeName = $"<{typeof(CustomerWithCollection).FullName}>";

            Assert.That(() => Assert.That(actual, Is.EqualTo(expected).Using(new CustomComparer())),
                        Throws.InstanceOf <AssertionException>().With.Message.Contains(
                            TextMessageWriter.Pfx_Expected + typeName + Environment.NewLine +
                            TextMessageWriter.Pfx_Actual + typeName
                            ));
        }
        public void WriteMessageTo_WithCollectionMemberAgainstSameTypeWithoutCollection_ContainsMemberDiscrepancy()
        {
            var withAddresses = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new[]
                {
                    new Address {
                        AddressLineOne = "1_1", AddressLineTwo = "1_2", City = "city_1", State = "state_1", Zipcode = "zip_1"
                    },
                    new Address {
                        AddressLineOne = "2_1", AddressLineTwo = "2_2", City = "city_2", State = "state_2", Zipcode = "zip_2"
                    }
                }
            };

            var withoutAddresses = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
            };

            var subject = new MatchingConstraint(withoutAddresses);

            Assert.That(getMessage(subject, withAddresses),
                        memberContainer("Addresses") &
                        expectedValue(null) &
                        actualValue(Does.Contain("<")));
        }
        public void ApplyTo_WithCollectionMemberAgainstSameTypeWithoutCollection_False()
        {
            var withAddresses = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new[]
                {
                    new Address {
                        AddressLineOne = "1_1", AddressLineTwo = "1_2", City = "city_1", State = "state_1", Zipcode = "zip_1"
                    },
                    new Address {
                        AddressLineOne = "2_1", AddressLineTwo = "2_2", City = "city_2", State = "state_2", Zipcode = "zip_2"
                    }
                }
            };

            var withoutAddresses = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
            };

            var subject = new MatchingConstraint(withoutAddresses);

            Assert.That(matches(subject, withAddresses), Is.False);
        }
        public void ApplyTo_WithCollectionMemberWithSameShapeAndDifferentValues_False()
        {
            var complex = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new[]
                {
                    new Address {
                        AddressLineOne = "1_1", AddressLineTwo = "1_2", City = "city_1", State = "state_1", Zipcode = "zip_1"
                    },
                    new Address {
                        AddressLineOne = "2_1", AddressLineTwo = "2_2", City = "city_2", State = "state_2", Zipcode = "zip_2"
                    }
                }
            };

            var expected = new
            {
                Name      = "name",
                Addresses = new object[]
                {
                    new { State = "state_1" },
                    new { Zipcode = "notSameValue" }
                }
            };

            var subject = new MatchingConstraint(expected);

            Assert.That(matches(subject, complex), Is.False);
        }
        public void MultipleAssertions_AmongstOtherThings_DoNotCommunicateIntentVeryWell()
        {
            CustomerWithCollection actual = someComplicatedOperation();

            //only interested on name and the zip code of the addresses
            Assert.That(actual.Name, Is.EqualTo("someName"));
            var addresses = actual.Addresses.ToArray();

            Assert.That(addresses[0].Zipcode, Is.EqualTo("zip_1"));
            Assert.That(addresses[1].Zipcode, Is.EqualTo("zip_2"));
        }
        public void BetterAssertions_MakeThingsSlightlyBetter()
        {
            CustomerWithCollection actual = someComplicatedOperation();

            //only interested on name and the zip code of the addresses
            Assert.That(actual.Name, Is.EqualTo("someName"));
            Assert.That(actual.Addresses, Has.Some.Matches <Address>(a => a.Zipcode == "zip_1"));
            Assert.That(actual.Addresses, Has.Some.Matches(addressWithZipCode("zip_2")));

            // fails but and give nice feedback about was expected but nothing about the actual object, but the type name
            Assert.That(() => Assert.That(actual.Addresses, Has.Some.Matches(addressWithZipCode("wrong"))),
                        Throws.InstanceOf <AssertionException>());
        }
        public void WriteMessageTo_WithCollectionMemberWithSameShapeAndDifferentValues_ContainsIndexedDiscrepancy()
        {
            var complex = new CustomerWithCollection
            {
                Name        = "name",
                PhoneNumber = "number",
                Addresses   = new[]
                {
                    new Address {
                        AddressLineOne = "1_1", AddressLineTwo = "1_2", City = "city_1", State = "state_1", Zipcode = "zip_1"
                    },
                    new Address {
                        AddressLineOne = "2_1", AddressLineTwo = "2_2", City = "city_2", State = "state_2", Zipcode = "zip_2"
                    }
                }
            };

            var expected = new
            {
                Name      = "name",
                Addresses = new object[]
                {
                    new { State = "state_1" },
                    new { Zipcode = "notSameValue" }
                }
            };

            var subject = new MatchingConstraint(expected);

            Assert.That(getMessage(subject, complex),
                        memberContainer("CustomerWithCollection.Addresses") &
                        indexOfOffendingCollectionItem(1) &
                        offendingMember("Zipcode") &
                        expectedValue("notSameValue") &
                        actualValue("zip_2")
                        );
        }