private void TestObjectWithIsNull() { var obj1 = new object(); var obj2 = new object(); var obj3 = obj1; var comparer = new ClassEqualityComparer <object>(equals: ReferenceEquals, getHashCode: obj => obj.GetHashCode(), isNull: obj => ReferenceEquals(obj, obj2)); TestInternal(expected: true, v1: null, v2: null, comparer: comparer); TestInternal(expected: false, v1: null, v2: obj1, comparer: comparer); TestInternal(expected: true, v1: null, v2: obj2, comparer: comparer); TestInternal(expected: false, v1: null, v2: obj3, comparer: comparer); TestInternal(expected: false, v1: obj1, v2: null, comparer: comparer); TestInternal(expected: true, v1: obj1, v2: obj1, comparer: comparer); TestInternal(expected: false, v1: obj1, v2: obj2, comparer: comparer); TestInternal(expected: true, v1: obj1, v2: obj3, comparer: comparer); TestInternal(expected: true, v1: obj2, v2: null, comparer: comparer); TestInternal(expected: false, v1: obj2, v2: obj1, comparer: comparer); TestInternal(expected: true, v1: obj2, v2: obj2, comparer: comparer); TestInternal(expected: false, v1: obj2, v2: obj3, comparer: comparer); TestInternal(expected: false, v1: obj3, v2: null, comparer: comparer); TestInternal(expected: true, v1: obj3, v2: obj1, comparer: comparer); TestInternal(expected: false, v1: obj3, v2: obj2, comparer: comparer); TestInternal(expected: true, v1: obj3, v2: obj3, comparer: comparer); }
public void CompareClasses() { var comparerUnderTest = new ClassEqualityComparer(); var c1d1 = new DummyClass1(); var c1d2 = new DummyClass1(); var c2d1 = new DummyClass2(); var c2d2 = new DummyClass2(); var c3d1 = new DummyClass3(); Assert.IsTrue(comparerUnderTest.Equals(c1d1, c1d2)); Assert.IsTrue(comparerUnderTest.Equals(c2d1, c2d2)); Assert.IsFalse(comparerUnderTest.Equals(c1d1, c2d2)); Assert.IsFalse(comparerUnderTest.Equals(c1d1, c2d1)); Assert.IsFalse(comparerUnderTest.Equals(c1d1, c3d1)); Assert.IsFalse(comparerUnderTest.Equals(c2d1, c3d1)); Assert.IsFalse(comparerUnderTest.Equals(c2d2, c3d1)); }
private void TestInternal <T>(bool expected, T v1, T v2, ClassEqualityComparer <T> comparer) where T : class { if ((expected) && (comparer.GetHashCode(obj: v1) != comparer.GetHashCode(obj: v2))) { var xStr = (v1 is null) ? "null" : $@"""{v1}"""; var yStr = (v2 is null) ? "null" : $@"""{v2}"""; Assert.Fail($@"{nameof(StructEqualityComparer.GetHashCode)}(obj: {xStr}) != {nameof(StructEqualityComparer.GetHashCode)}(obj: {yStr})"); } if (comparer.Equals(x: v1, y: v2) != expected) { var xStr = (v1 is null) ? "null" : $@"""{v1}"""; var yStr = (v2 is null) ? "null" : $@"""{v2}"""; Assert.Fail($@"{nameof(StructEqualityComparer.Equals)}(x: {xStr}, y: {yStr}) != {expected}"); } }
private void TestStringTrimIgnoreCaseWithBlankIsNull() { var empty = string.Empty; var blank = @" "; var lower = @"test"; var upper = @"TEST"; var comparer = new ClassEqualityComparer <string>((v1, v2) => string.Equals(v1.Trim(), v2.Trim(), StringComparison.OrdinalIgnoreCase), getHashCode: (obj) => obj.Trim().ToUpper().GetHashCode(), isNull: (obj) => string.IsNullOrWhiteSpace(obj)); TestInternal(expected: true, v1: null, v2: null, comparer: comparer); TestInternal(expected: true, v1: null, v2: empty, comparer: comparer); TestInternal(expected: true, v1: null, v2: blank, comparer: comparer); TestInternal(expected: false, v1: null, v2: lower, comparer: comparer); TestInternal(expected: false, v1: null, v2: upper, comparer: comparer); TestInternal(expected: true, v1: empty, v2: null, comparer: comparer); TestInternal(expected: true, v1: empty, v2: empty, comparer: comparer); TestInternal(expected: true, v1: empty, v2: blank, comparer: comparer); TestInternal(expected: false, v1: empty, v2: lower, comparer: comparer); TestInternal(expected: false, v1: empty, v2: upper, comparer: comparer); TestInternal(expected: true, v1: blank, v2: null, comparer: comparer); TestInternal(expected: true, v1: blank, v2: empty, comparer: comparer); TestInternal(expected: true, v1: blank, v2: blank, comparer: comparer); TestInternal(expected: false, v1: blank, v2: lower, comparer: comparer); TestInternal(expected: false, v1: blank, v2: upper, comparer: comparer); TestInternal(expected: false, v1: lower, v2: null, comparer: comparer); TestInternal(expected: false, v1: lower, v2: empty, comparer: comparer); TestInternal(expected: false, v1: lower, v2: blank, comparer: comparer); TestInternal(expected: true, v1: lower, v2: lower, comparer: comparer); TestInternal(expected: true, v1: lower, v2: upper, comparer: comparer); TestInternal(expected: false, v1: upper, v2: null, comparer: comparer); TestInternal(expected: false, v1: upper, v2: empty, comparer: comparer); TestInternal(expected: false, v1: upper, v2: blank, comparer: comparer); TestInternal(expected: true, v1: upper, v2: lower, comparer: comparer); TestInternal(expected: true, v1: upper, v2: upper, comparer: comparer); }
private void TestStringReferenceEqualsWithBlankIsNull() { var empty = string.Empty; var blank = @" "; var lower = @"test"; var upper = @"TEST"; var comparer = new ClassEqualityComparer <string>(ReferenceEquals, getHashCode: (obj) => RuntimeHelpers.GetHashCode(obj), isNull: (obj) => string.IsNullOrWhiteSpace(obj)); TestInternal(expected: true, v1: null, v2: null, comparer: comparer); TestInternal(expected: true, v1: null, v2: empty, comparer: comparer); TestInternal(expected: true, v1: null, v2: blank, comparer: comparer); TestInternal(expected: false, v1: null, v2: lower, comparer: comparer); TestInternal(expected: false, v1: null, v2: upper, comparer: comparer); TestInternal(expected: true, v1: empty, v2: null, comparer: comparer); TestInternal(expected: true, v1: empty, v2: empty, comparer: comparer); TestInternal(expected: true, v1: empty, v2: blank, comparer: comparer); TestInternal(expected: false, v1: empty, v2: lower, comparer: comparer); TestInternal(expected: false, v1: empty, v2: upper, comparer: comparer); TestInternal(expected: true, v1: blank, v2: null, comparer: comparer); TestInternal(expected: true, v1: blank, v2: empty, comparer: comparer); TestInternal(expected: true, v1: blank, v2: blank, comparer: comparer); TestInternal(expected: false, v1: blank, v2: lower, comparer: comparer); TestInternal(expected: false, v1: blank, v2: upper, comparer: comparer); TestInternal(expected: false, v1: lower, v2: null, comparer: comparer); TestInternal(expected: false, v1: lower, v2: empty, comparer: comparer); TestInternal(expected: false, v1: lower, v2: blank, comparer: comparer); TestInternal(expected: true, v1: lower, v2: lower, comparer: comparer); TestInternal(expected: false, v1: lower, v2: upper, comparer: comparer); TestInternal(expected: false, v1: upper, v2: null, comparer: comparer); TestInternal(expected: false, v1: upper, v2: empty, comparer: comparer); TestInternal(expected: false, v1: upper, v2: blank, comparer: comparer); TestInternal(expected: false, v1: upper, v2: lower, comparer: comparer); TestInternal(expected: true, v1: upper, v2: upper, comparer: comparer); }
public void CompareHashes() { var comparerUnderTest = new ClassEqualityComparer(); var c1d1 = new DummyClass1(); var c1d2 = new DummyClass1(); var c2d1 = new DummyClass2(); var c2d2 = new DummyClass2(); var c3d1 = new DummyClass3(); var c1d1Hash = comparerUnderTest.GetHashCode(c1d1); var c1d2Hash = comparerUnderTest.GetHashCode(c1d2); var c2d1Hash = comparerUnderTest.GetHashCode(c2d1); var c2d2Hash = comparerUnderTest.GetHashCode(c2d2); var c3d1Hash = comparerUnderTest.GetHashCode(c3d1); Assert.AreEqual(c1d1Hash, c1d2Hash); Assert.AreEqual(c2d1Hash, c2d2Hash); Assert.AreNotEqual(c1d1Hash, c2d1Hash); Assert.AreNotEqual(c1d2Hash, c2d1Hash); Assert.AreNotEqual(c1d1Hash, c3d1Hash); Assert.AreNotEqual(c2d1Hash, c3d1Hash); }