public void Verify_BrokenObjectEquals_ShouldThrow()
        {
            var verifier = new ComparableVerifier <BrokenObjectEquals>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new BrokenObjectEquals(1),
                    new BrokenObjectEquals(2),
                    new BrokenObjectEquals(3),
                },
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("Object.Equals failed with values expected to be equal at index 0. "
                                       + "Expected: <1>. Actual: <1>.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_BrokenOpInequalityTrue_ShouldThrow()
        {
            var verifier = new ComparableVerifier <BrokenOpInequality>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new BrokenOpInequality(1, true),
                    new BrokenOpInequality(2, true),
                    new BrokenOpInequality(3, true),
                },
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("op_Inequality failed with values expected to be equal at index 0. "
                                       + "Expected: <1>. Actual: <1>.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_UnstableGetHashCode_ShouldThrow()
        {
            var verifier = new ComparableVerifier <UnstableGetHashCode>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new UnstableGetHashCode(1),
                    new UnstableGetHashCode(2),
                    new UnstableGetHashCode(3),
                },
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("GetHashCode is not stable.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_NoComparisonOperators_ShouldThrow()
        {
            var verifier = new ComparableVerifier <NoComparisonOperators>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new NoComparisonOperators(1),
                    new NoComparisonOperators(2),
                    new NoComparisonOperators(3),
                },
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("Comparison operators must be defined.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_NoGetHashCodeOverride_ShouldThrow()
        {
            var verifier = new ComparableVerifier <NoGetHashCodeOverride>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new NoGetHashCodeOverride(1),
                    new NoGetHashCodeOverride(2),
                    new NoGetHashCodeOverride(3),
                },
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("Object.GetHashCode must be overridden.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_BrokenEqualsTrue_ShouldThrow()
        {
            var verifier = new ComparableVerifier <BrokenEquals>()
            {
                OrderedItemsFactory = () => new[]
                {
                    new BrokenEquals(1, true),
                    new BrokenEquals(2, true),
                    new BrokenEquals(3, true)
                }
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed.");
                e.ExpectInnerAssertion("IEquatable<BrokenEquals>.Equals failed with values expected to not be equal at index 0. Expected: <2>. Actual: <1>.");
                return;
            }

            Fail("ComparableVerifier did not throw.");
        }
        public void Verify_Correct_ShouldNotThrow()
        {
            var verifier = new ComparableVerifier <Correct>
            {
                OrderedItemsFactory = () => new[] { new Correct(1), new Correct(2), new Correct(3) }
            };

            verifier.Verify();
        }
        public void Verify_String_ShouldNotThrow()
        {
            var verifier = new ComparableVerifier <string>
            {
                OrderedItemsFactory = () => new[] { "foo", "bar", "baz" }
            };

            verifier.Verify();
        }
        public void Verify_Int32_ShouldNotThrow()
        {
            var verifier = new ComparableVerifier <int>
            {
                OrderedItemsFactory = () => new[] { 1, 2, 3, 4 }
            };

            verifier.Verify();
        }
        public void Verify_NoOrderedItemsFactory_ShouldThrow()
        {
            var verifier = new ComparableVerifier <int>();

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed. OrderedItemsFactory is not set. IsNotNull failed.");
                return;
            }

            Fail("EquatableVerify did not throw.");
        }
        public void Verify_FewerThan3UniqueItems_ShouldThrow()
        {
            var verifier = new ComparableVerifier <int>
            {
                OrderedItemsFactory = () => new[] { 1, 2 }
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed. OrderedItemsFactory did not produce 3 or more items. IsTrue failed.");
                return;
            }

            Fail("EquatableVerify did not throw.");
        }
        public void Verify_NullUniqueItems_ShouldThrow()
        {
            var verifier = new ComparableVerifier <int>
            {
                OrderedItemsFactory = () => null
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed. OrderedItemsFactory did not produce any items. IsNotNull failed.");
                return;
            }

            Fail("EquatableVerify did not throw.");
        }
        public void Verify_NullUniqueItem_ShouldThrow()
        {
            var verifier = new ComparableVerifier <string>
            {
                OrderedItemsFactory = () => new[] { "foo", null, "bar" }
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed. OrderedItemsFactory should not produce null values. AllItemsAreNotNull failed.");
                return;
            }

            Fail("EquatableVerify did not throw.");
        }
        public void Verify_UnstableOrderedItemsFactory_ShouldThrow()
        {
            var items    = new[] { 1, 2, 3 };
            var verifier = new ComparableVerifier <int>
            {
                OrderedItemsFactory = () => items = items.Concat(new[] { 1 }).ToArray(),
            };

            try
            {
                verifier.Verify();
            }
            catch (AssertionException e)
            {
                e.ExpectMessage("ComparableVerifier failed. OrderedItemsFactory is not stable. IsEqualTo failed. "
                                + "Expected: <4>. Actual: <5>.");
                return;
            }

            Fail("EquatableVerify did not throw.");
        }