private void TestEq <T>(bool eq, Comparable <T> id1, Comparable <T> id2) { int h1 = id1.GetHashCode(); int h2 = id2.GetHashCode(); // eq reflectivity: NUnit.Framework.Assert.IsTrue(id1.Equals(id1)); NUnit.Framework.Assert.IsTrue(id2.Equals(id2)); NUnit.Framework.Assert.AreEqual(0, id1.CompareTo((T)id1)); NUnit.Framework.Assert.AreEqual(0, id2.CompareTo((T)id2)); // eq symmetry: NUnit.Framework.Assert.AreEqual(eq, id1.Equals(id2)); NUnit.Framework.Assert.AreEqual(eq, id2.Equals(id1)); // null comparison: NUnit.Framework.Assert.IsFalse(id1.Equals(null)); NUnit.Framework.Assert.IsFalse(id2.Equals(null)); // compareTo: NUnit.Framework.Assert.AreEqual(eq, 0 == id1.CompareTo((T)id2)); NUnit.Framework.Assert.AreEqual(eq, 0 == id2.CompareTo((T)id1)); // compareTo must be antisymmetric: NUnit.Framework.Assert.AreEqual(Sign(id1.CompareTo((T)id2)), -Sign(id2.CompareTo( (T)id1))); // compare with null should never return 0 to be consistent with #equals(): NUnit.Framework.Assert.IsTrue(id1.CompareTo(null) != 0); NUnit.Framework.Assert.IsTrue(id2.CompareTo(null) != 0); // check that hash codes did not change: NUnit.Framework.Assert.AreEqual(h1, id1.GetHashCode()); NUnit.Framework.Assert.AreEqual(h2, id2.GetHashCode()); if (eq) { // in this case the hash codes must be the same: NUnit.Framework.Assert.AreEqual(h1, h2); } }