public new void GetHashCode()
        {
            var obj1 = new Testing(5, "ABC");
            var obj2 = new Testing(3, "NA");
            var obj3 = new Testing(2, "ABCDE");
            var obj4 = new Testing(5, "NA");
            var obj5 = new Testing(7, null);

            var comparer = new EqualityComparerStateful <int>((lhs, rhs) => lhs == rhs, obj => obj.GetHashCode());

            Assert.Equal(comparer.GetHashCode(5), 5.GetHashCode());
            Assert.Equal(comparer.GetHashCode(3), 3.GetHashCode());
            Assert.Equal(comparer.GetHashCode(67), 67.GetHashCode());

            var stringComparer = new EqualityComparerStateful <string>((lhs, rhs) => lhs == rhs);

            Assert.Equal(stringComparer.GetHashCode("ABC"), "ABC".GetHashCode());
            Assert.Equal(stringComparer.GetHashCode("CBA"), "CBA".GetHashCode());
            Assert.Equal(stringComparer.GetHashCode("abcd"), "abcd".GetHashCode());
            Assert.Equal(stringComparer.GetHashCode(null), 0);

            var objComparer = new EqualityComparerStateful <Testing>((lhs, rhs) => lhs.A == rhs.A, obj => obj.A.GetHashCode() * 2);

            Assert.Equal(objComparer.GetHashCode(obj1), obj1.A.GetHashCode() * 2);
            Assert.Equal(objComparer.GetHashCode(obj2), obj2.A.GetHashCode() * 2);
            Assert.Equal(objComparer.GetHashCode(obj3), obj3.A.GetHashCode() * 2);
            Assert.Equal(objComparer.GetHashCode(obj4), obj4.A.GetHashCode() * 2);
            Assert.Equal(objComparer.GetHashCode(obj5), obj5.A.GetHashCode() * 2);
        }
        public void Equals()
        {
            var comparer = new EqualityComparerStateful <int>((lhs, rhs) => lhs == rhs);

            Assert.True(comparer.Equals(1, 1));
            Assert.True(comparer.Equals(-1, -1));
            Assert.False(comparer.Equals(-1, 1));
            Assert.False(comparer.Equals(1, -1));

            Assert.False(comparer.Equals(2, 1));
            Assert.False(comparer.Equals(-2, -1));
            Assert.False(comparer.Equals(1, 2));
            Assert.False(comparer.Equals(-1, -2));
            Assert.False(comparer.Equals(2, -1));
            Assert.False(comparer.Equals(-2, 1));
            Assert.False(comparer.Equals(1, -2));
            Assert.False(comparer.Equals(-1, 2));

            var stringComparer = new EqualityComparerStateful <string>((lhs, rhs) => lhs == rhs);

            Assert.True(stringComparer.Equals("ABC", "ABC"));
            Assert.True(stringComparer.Equals(null, null));
            Assert.False(stringComparer.Equals("ABC", "abc"));
            Assert.False(stringComparer.Equals("abc", "ABC"));
            Assert.False(stringComparer.Equals("ABC", "CBA"));
            Assert.False(stringComparer.Equals("ABCD", "ABC"));
            Assert.False(stringComparer.Equals("ABC", "ABCD"));
            Assert.False(stringComparer.Equals("ABC", null));
            Assert.False(stringComparer.Equals(null, "ABC"));

            var objComparer = new EqualityComparerStateful <Testing>((lhs, rhs) => lhs.B.Length == rhs.A);
            var obj1        = new Testing(5, "ABC");
            var obj2        = new Testing(3, "NA");
            var obj3        = new Testing(2, "ABCDE");

            Assert.True(objComparer.Equals(obj1, obj2));
            Assert.False(objComparer.Equals(obj1, obj3));

            Assert.False(objComparer.Equals(obj2, obj1));
            Assert.True(objComparer.Equals(obj2, obj3));

            Assert.True(objComparer.Equals(obj3, obj1));
            Assert.False(objComparer.Equals(obj3, obj2));
        }