17db96d56Sopenharmony_ci"""Test equality and order comparisons.""" 27db96d56Sopenharmony_ciimport unittest 37db96d56Sopenharmony_cifrom test.support import ALWAYS_EQ 47db96d56Sopenharmony_cifrom fractions import Fraction 57db96d56Sopenharmony_cifrom decimal import Decimal 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ciclass ComparisonSimpleTest(unittest.TestCase): 97db96d56Sopenharmony_ci """Test equality and order comparisons for some simple cases.""" 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci class Empty: 127db96d56Sopenharmony_ci def __repr__(self): 137db96d56Sopenharmony_ci return '<Empty>' 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci class Cmp: 167db96d56Sopenharmony_ci def __init__(self, arg): 177db96d56Sopenharmony_ci self.arg = arg 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci def __repr__(self): 207db96d56Sopenharmony_ci return '<Cmp %s>' % self.arg 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci def __eq__(self, other): 237db96d56Sopenharmony_ci return self.arg == other 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)] 267db96d56Sopenharmony_ci set2 = [[1], (3,), None, Empty()] 277db96d56Sopenharmony_ci candidates = set1 + set2 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci def test_comparisons(self): 307db96d56Sopenharmony_ci for a in self.candidates: 317db96d56Sopenharmony_ci for b in self.candidates: 327db96d56Sopenharmony_ci if ((a in self.set1) and (b in self.set1)) or a is b: 337db96d56Sopenharmony_ci self.assertEqual(a, b) 347db96d56Sopenharmony_ci else: 357db96d56Sopenharmony_ci self.assertNotEqual(a, b) 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci def test_id_comparisons(self): 387db96d56Sopenharmony_ci # Ensure default comparison compares id() of args 397db96d56Sopenharmony_ci L = [] 407db96d56Sopenharmony_ci for i in range(10): 417db96d56Sopenharmony_ci L.insert(len(L)//2, self.Empty()) 427db96d56Sopenharmony_ci for a in L: 437db96d56Sopenharmony_ci for b in L: 447db96d56Sopenharmony_ci self.assertEqual(a == b, a is b, 'a=%r, b=%r' % (a, b)) 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci def test_ne_defaults_to_not_eq(self): 477db96d56Sopenharmony_ci a = self.Cmp(1) 487db96d56Sopenharmony_ci b = self.Cmp(1) 497db96d56Sopenharmony_ci c = self.Cmp(2) 507db96d56Sopenharmony_ci self.assertIs(a == b, True) 517db96d56Sopenharmony_ci self.assertIs(a != b, False) 527db96d56Sopenharmony_ci self.assertIs(a != c, True) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def test_ne_high_priority(self): 557db96d56Sopenharmony_ci """object.__ne__() should allow reflected __ne__() to be tried""" 567db96d56Sopenharmony_ci calls = [] 577db96d56Sopenharmony_ci class Left: 587db96d56Sopenharmony_ci # Inherits object.__ne__() 597db96d56Sopenharmony_ci def __eq__(*args): 607db96d56Sopenharmony_ci calls.append('Left.__eq__') 617db96d56Sopenharmony_ci return NotImplemented 627db96d56Sopenharmony_ci class Right: 637db96d56Sopenharmony_ci def __eq__(*args): 647db96d56Sopenharmony_ci calls.append('Right.__eq__') 657db96d56Sopenharmony_ci return NotImplemented 667db96d56Sopenharmony_ci def __ne__(*args): 677db96d56Sopenharmony_ci calls.append('Right.__ne__') 687db96d56Sopenharmony_ci return NotImplemented 697db96d56Sopenharmony_ci Left() != Right() 707db96d56Sopenharmony_ci self.assertSequenceEqual(calls, ['Left.__eq__', 'Right.__ne__']) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def test_ne_low_priority(self): 737db96d56Sopenharmony_ci """object.__ne__() should not invoke reflected __eq__()""" 747db96d56Sopenharmony_ci calls = [] 757db96d56Sopenharmony_ci class Base: 767db96d56Sopenharmony_ci # Inherits object.__ne__() 777db96d56Sopenharmony_ci def __eq__(*args): 787db96d56Sopenharmony_ci calls.append('Base.__eq__') 797db96d56Sopenharmony_ci return NotImplemented 807db96d56Sopenharmony_ci class Derived(Base): # Subclassing forces higher priority 817db96d56Sopenharmony_ci def __eq__(*args): 827db96d56Sopenharmony_ci calls.append('Derived.__eq__') 837db96d56Sopenharmony_ci return NotImplemented 847db96d56Sopenharmony_ci def __ne__(*args): 857db96d56Sopenharmony_ci calls.append('Derived.__ne__') 867db96d56Sopenharmony_ci return NotImplemented 877db96d56Sopenharmony_ci Base() != Derived() 887db96d56Sopenharmony_ci self.assertSequenceEqual(calls, ['Derived.__ne__', 'Base.__eq__']) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci def test_other_delegation(self): 917db96d56Sopenharmony_ci """No default delegation between operations except __ne__()""" 927db96d56Sopenharmony_ci ops = ( 937db96d56Sopenharmony_ci ('__eq__', lambda a, b: a == b), 947db96d56Sopenharmony_ci ('__lt__', lambda a, b: a < b), 957db96d56Sopenharmony_ci ('__le__', lambda a, b: a <= b), 967db96d56Sopenharmony_ci ('__gt__', lambda a, b: a > b), 977db96d56Sopenharmony_ci ('__ge__', lambda a, b: a >= b), 987db96d56Sopenharmony_ci ) 997db96d56Sopenharmony_ci for name, func in ops: 1007db96d56Sopenharmony_ci with self.subTest(name): 1017db96d56Sopenharmony_ci def unexpected(*args): 1027db96d56Sopenharmony_ci self.fail('Unexpected operator method called') 1037db96d56Sopenharmony_ci class C: 1047db96d56Sopenharmony_ci __ne__ = unexpected 1057db96d56Sopenharmony_ci for other, _ in ops: 1067db96d56Sopenharmony_ci if other != name: 1077db96d56Sopenharmony_ci setattr(C, other, unexpected) 1087db96d56Sopenharmony_ci if name == '__eq__': 1097db96d56Sopenharmony_ci self.assertIs(func(C(), object()), False) 1107db96d56Sopenharmony_ci else: 1117db96d56Sopenharmony_ci self.assertRaises(TypeError, func, C(), object()) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci def test_issue_1393(self): 1147db96d56Sopenharmony_ci x = lambda: None 1157db96d56Sopenharmony_ci self.assertEqual(x, ALWAYS_EQ) 1167db96d56Sopenharmony_ci self.assertEqual(ALWAYS_EQ, x) 1177db96d56Sopenharmony_ci y = object() 1187db96d56Sopenharmony_ci self.assertEqual(y, ALWAYS_EQ) 1197db96d56Sopenharmony_ci self.assertEqual(ALWAYS_EQ, y) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ciclass ComparisonFullTest(unittest.TestCase): 1237db96d56Sopenharmony_ci """Test equality and ordering comparisons for built-in types and 1247db96d56Sopenharmony_ci user-defined classes that implement relevant combinations of rich 1257db96d56Sopenharmony_ci comparison methods. 1267db96d56Sopenharmony_ci """ 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci class CompBase: 1297db96d56Sopenharmony_ci """Base class for classes with rich comparison methods. 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci The "x" attribute should be set to an underlying value to compare. 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci Derived classes have a "meth" tuple attribute listing names of 1347db96d56Sopenharmony_ci comparison methods implemented. See assert_total_order(). 1357db96d56Sopenharmony_ci """ 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci # Class without any rich comparison methods. 1387db96d56Sopenharmony_ci class CompNone(CompBase): 1397db96d56Sopenharmony_ci meth = () 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci # Classes with all combinations of value-based equality comparison methods. 1427db96d56Sopenharmony_ci class CompEq(CompBase): 1437db96d56Sopenharmony_ci meth = ("eq",) 1447db96d56Sopenharmony_ci def __eq__(self, other): 1457db96d56Sopenharmony_ci return self.x == other.x 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci class CompNe(CompBase): 1487db96d56Sopenharmony_ci meth = ("ne",) 1497db96d56Sopenharmony_ci def __ne__(self, other): 1507db96d56Sopenharmony_ci return self.x != other.x 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci class CompEqNe(CompBase): 1537db96d56Sopenharmony_ci meth = ("eq", "ne") 1547db96d56Sopenharmony_ci def __eq__(self, other): 1557db96d56Sopenharmony_ci return self.x == other.x 1567db96d56Sopenharmony_ci def __ne__(self, other): 1577db96d56Sopenharmony_ci return self.x != other.x 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci # Classes with all combinations of value-based less/greater-than order 1607db96d56Sopenharmony_ci # comparison methods. 1617db96d56Sopenharmony_ci class CompLt(CompBase): 1627db96d56Sopenharmony_ci meth = ("lt",) 1637db96d56Sopenharmony_ci def __lt__(self, other): 1647db96d56Sopenharmony_ci return self.x < other.x 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci class CompGt(CompBase): 1677db96d56Sopenharmony_ci meth = ("gt",) 1687db96d56Sopenharmony_ci def __gt__(self, other): 1697db96d56Sopenharmony_ci return self.x > other.x 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci class CompLtGt(CompBase): 1727db96d56Sopenharmony_ci meth = ("lt", "gt") 1737db96d56Sopenharmony_ci def __lt__(self, other): 1747db96d56Sopenharmony_ci return self.x < other.x 1757db96d56Sopenharmony_ci def __gt__(self, other): 1767db96d56Sopenharmony_ci return self.x > other.x 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci # Classes with all combinations of value-based less/greater-or-equal-than 1797db96d56Sopenharmony_ci # order comparison methods 1807db96d56Sopenharmony_ci class CompLe(CompBase): 1817db96d56Sopenharmony_ci meth = ("le",) 1827db96d56Sopenharmony_ci def __le__(self, other): 1837db96d56Sopenharmony_ci return self.x <= other.x 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci class CompGe(CompBase): 1867db96d56Sopenharmony_ci meth = ("ge",) 1877db96d56Sopenharmony_ci def __ge__(self, other): 1887db96d56Sopenharmony_ci return self.x >= other.x 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci class CompLeGe(CompBase): 1917db96d56Sopenharmony_ci meth = ("le", "ge") 1927db96d56Sopenharmony_ci def __le__(self, other): 1937db96d56Sopenharmony_ci return self.x <= other.x 1947db96d56Sopenharmony_ci def __ge__(self, other): 1957db96d56Sopenharmony_ci return self.x >= other.x 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci # It should be sufficient to combine the comparison methods only within 1987db96d56Sopenharmony_ci # each group. 1997db96d56Sopenharmony_ci all_comp_classes = ( 2007db96d56Sopenharmony_ci CompNone, 2017db96d56Sopenharmony_ci CompEq, CompNe, CompEqNe, # equal group 2027db96d56Sopenharmony_ci CompLt, CompGt, CompLtGt, # less/greater-than group 2037db96d56Sopenharmony_ci CompLe, CompGe, CompLeGe) # less/greater-or-equal group 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci def create_sorted_instances(self, class_, values): 2067db96d56Sopenharmony_ci """Create objects of type `class_` and return them in a list. 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci `values` is a list of values that determines the value of data 2097db96d56Sopenharmony_ci attribute `x` of each object. 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci Objects in the returned list are sorted by their identity. They 2127db96d56Sopenharmony_ci assigned values in `values` list order. By assign decreasing 2137db96d56Sopenharmony_ci values to objects with increasing identities, testcases can assert 2147db96d56Sopenharmony_ci that order comparison is performed by value and not by identity. 2157db96d56Sopenharmony_ci """ 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci instances = [class_() for __ in range(len(values))] 2187db96d56Sopenharmony_ci instances.sort(key=id) 2197db96d56Sopenharmony_ci # Assign the provided values to the instances. 2207db96d56Sopenharmony_ci for inst, value in zip(instances, values): 2217db96d56Sopenharmony_ci inst.x = value 2227db96d56Sopenharmony_ci return instances 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci def assert_equality_only(self, a, b, equal): 2257db96d56Sopenharmony_ci """Assert equality result and that ordering is not implemented. 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci a, b: Instances to be tested (of same or different type). 2287db96d56Sopenharmony_ci equal: Boolean indicating the expected equality comparison results. 2297db96d56Sopenharmony_ci """ 2307db96d56Sopenharmony_ci self.assertEqual(a == b, equal) 2317db96d56Sopenharmony_ci self.assertEqual(b == a, equal) 2327db96d56Sopenharmony_ci self.assertEqual(a != b, not equal) 2337db96d56Sopenharmony_ci self.assertEqual(b != a, not equal) 2347db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2357db96d56Sopenharmony_ci a < b 2367db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2377db96d56Sopenharmony_ci a <= b 2387db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2397db96d56Sopenharmony_ci a > b 2407db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2417db96d56Sopenharmony_ci a >= b 2427db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2437db96d56Sopenharmony_ci b < a 2447db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2457db96d56Sopenharmony_ci b <= a 2467db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2477db96d56Sopenharmony_ci b > a 2487db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 2497db96d56Sopenharmony_ci b >= a 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci def assert_total_order(self, a, b, comp, a_meth=None, b_meth=None): 2527db96d56Sopenharmony_ci """Test total ordering comparison of two instances. 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci a, b: Instances to be tested (of same or different type). 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci comp: -1, 0, or 1 indicates that the expected order comparison 2577db96d56Sopenharmony_ci result for operations that are supported by the classes is 2587db96d56Sopenharmony_ci a <, ==, or > b. 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci a_meth, b_meth: Either None, indicating that all rich comparison 2617db96d56Sopenharmony_ci methods are available, aa for builtins, or the tuple (subset) 2627db96d56Sopenharmony_ci of "eq", "ne", "lt", "le", "gt", and "ge" that are available 2637db96d56Sopenharmony_ci for the corresponding instance (of a user-defined class). 2647db96d56Sopenharmony_ci """ 2657db96d56Sopenharmony_ci self.assert_eq_subtest(a, b, comp, a_meth, b_meth) 2667db96d56Sopenharmony_ci self.assert_ne_subtest(a, b, comp, a_meth, b_meth) 2677db96d56Sopenharmony_ci self.assert_lt_subtest(a, b, comp, a_meth, b_meth) 2687db96d56Sopenharmony_ci self.assert_le_subtest(a, b, comp, a_meth, b_meth) 2697db96d56Sopenharmony_ci self.assert_gt_subtest(a, b, comp, a_meth, b_meth) 2707db96d56Sopenharmony_ci self.assert_ge_subtest(a, b, comp, a_meth, b_meth) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci # The body of each subtest has form: 2737db96d56Sopenharmony_ci # 2747db96d56Sopenharmony_ci # if value-based comparison methods: 2757db96d56Sopenharmony_ci # expect what the testcase defined for a op b and b rop a; 2767db96d56Sopenharmony_ci # else: no value-based comparison 2777db96d56Sopenharmony_ci # expect default behavior of object for a op b and b rop a. 2787db96d56Sopenharmony_ci 2797db96d56Sopenharmony_ci def assert_eq_subtest(self, a, b, comp, a_meth, b_meth): 2807db96d56Sopenharmony_ci if a_meth is None or "eq" in a_meth or "eq" in b_meth: 2817db96d56Sopenharmony_ci self.assertEqual(a == b, comp == 0) 2827db96d56Sopenharmony_ci self.assertEqual(b == a, comp == 0) 2837db96d56Sopenharmony_ci else: 2847db96d56Sopenharmony_ci self.assertEqual(a == b, a is b) 2857db96d56Sopenharmony_ci self.assertEqual(b == a, a is b) 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci def assert_ne_subtest(self, a, b, comp, a_meth, b_meth): 2887db96d56Sopenharmony_ci if a_meth is None or not {"ne", "eq"}.isdisjoint(a_meth + b_meth): 2897db96d56Sopenharmony_ci self.assertEqual(a != b, comp != 0) 2907db96d56Sopenharmony_ci self.assertEqual(b != a, comp != 0) 2917db96d56Sopenharmony_ci else: 2927db96d56Sopenharmony_ci self.assertEqual(a != b, a is not b) 2937db96d56Sopenharmony_ci self.assertEqual(b != a, a is not b) 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci def assert_lt_subtest(self, a, b, comp, a_meth, b_meth): 2967db96d56Sopenharmony_ci if a_meth is None or "lt" in a_meth or "gt" in b_meth: 2977db96d56Sopenharmony_ci self.assertEqual(a < b, comp < 0) 2987db96d56Sopenharmony_ci self.assertEqual(b > a, comp < 0) 2997db96d56Sopenharmony_ci else: 3007db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3017db96d56Sopenharmony_ci a < b 3027db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3037db96d56Sopenharmony_ci b > a 3047db96d56Sopenharmony_ci 3057db96d56Sopenharmony_ci def assert_le_subtest(self, a, b, comp, a_meth, b_meth): 3067db96d56Sopenharmony_ci if a_meth is None or "le" in a_meth or "ge" in b_meth: 3077db96d56Sopenharmony_ci self.assertEqual(a <= b, comp <= 0) 3087db96d56Sopenharmony_ci self.assertEqual(b >= a, comp <= 0) 3097db96d56Sopenharmony_ci else: 3107db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3117db96d56Sopenharmony_ci a <= b 3127db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3137db96d56Sopenharmony_ci b >= a 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci def assert_gt_subtest(self, a, b, comp, a_meth, b_meth): 3167db96d56Sopenharmony_ci if a_meth is None or "gt" in a_meth or "lt" in b_meth: 3177db96d56Sopenharmony_ci self.assertEqual(a > b, comp > 0) 3187db96d56Sopenharmony_ci self.assertEqual(b < a, comp > 0) 3197db96d56Sopenharmony_ci else: 3207db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3217db96d56Sopenharmony_ci a > b 3227db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3237db96d56Sopenharmony_ci b < a 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci def assert_ge_subtest(self, a, b, comp, a_meth, b_meth): 3267db96d56Sopenharmony_ci if a_meth is None or "ge" in a_meth or "le" in b_meth: 3277db96d56Sopenharmony_ci self.assertEqual(a >= b, comp >= 0) 3287db96d56Sopenharmony_ci self.assertEqual(b <= a, comp >= 0) 3297db96d56Sopenharmony_ci else: 3307db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3317db96d56Sopenharmony_ci a >= b 3327db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "not supported"): 3337db96d56Sopenharmony_ci b <= a 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci def test_objects(self): 3367db96d56Sopenharmony_ci """Compare instances of type 'object'.""" 3377db96d56Sopenharmony_ci a = object() 3387db96d56Sopenharmony_ci b = object() 3397db96d56Sopenharmony_ci self.assert_equality_only(a, a, True) 3407db96d56Sopenharmony_ci self.assert_equality_only(a, b, False) 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci def test_comp_classes_same(self): 3437db96d56Sopenharmony_ci """Compare same-class instances with comparison methods.""" 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci for cls in self.all_comp_classes: 3467db96d56Sopenharmony_ci with self.subTest(cls): 3477db96d56Sopenharmony_ci instances = self.create_sorted_instances(cls, (1, 2, 1)) 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci # Same object. 3507db96d56Sopenharmony_ci self.assert_total_order(instances[0], instances[0], 0, 3517db96d56Sopenharmony_ci cls.meth, cls.meth) 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci # Different objects, same value. 3547db96d56Sopenharmony_ci self.assert_total_order(instances[0], instances[2], 0, 3557db96d56Sopenharmony_ci cls.meth, cls.meth) 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci # Different objects, value ascending for ascending identities. 3587db96d56Sopenharmony_ci self.assert_total_order(instances[0], instances[1], -1, 3597db96d56Sopenharmony_ci cls.meth, cls.meth) 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci # different objects, value descending for ascending identities. 3627db96d56Sopenharmony_ci # This is the interesting case to assert that order comparison 3637db96d56Sopenharmony_ci # is performed based on the value and not based on the identity. 3647db96d56Sopenharmony_ci self.assert_total_order(instances[1], instances[2], +1, 3657db96d56Sopenharmony_ci cls.meth, cls.meth) 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci def test_comp_classes_different(self): 3687db96d56Sopenharmony_ci """Compare different-class instances with comparison methods.""" 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci for cls_a in self.all_comp_classes: 3717db96d56Sopenharmony_ci for cls_b in self.all_comp_classes: 3727db96d56Sopenharmony_ci with self.subTest(a=cls_a, b=cls_b): 3737db96d56Sopenharmony_ci a1 = cls_a() 3747db96d56Sopenharmony_ci a1.x = 1 3757db96d56Sopenharmony_ci b1 = cls_b() 3767db96d56Sopenharmony_ci b1.x = 1 3777db96d56Sopenharmony_ci b2 = cls_b() 3787db96d56Sopenharmony_ci b2.x = 2 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci self.assert_total_order( 3817db96d56Sopenharmony_ci a1, b1, 0, cls_a.meth, cls_b.meth) 3827db96d56Sopenharmony_ci self.assert_total_order( 3837db96d56Sopenharmony_ci a1, b2, -1, cls_a.meth, cls_b.meth) 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci def test_str_subclass(self): 3867db96d56Sopenharmony_ci """Compare instances of str and a subclass.""" 3877db96d56Sopenharmony_ci class StrSubclass(str): 3887db96d56Sopenharmony_ci pass 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci s1 = str("a") 3917db96d56Sopenharmony_ci s2 = str("b") 3927db96d56Sopenharmony_ci c1 = StrSubclass("a") 3937db96d56Sopenharmony_ci c2 = StrSubclass("b") 3947db96d56Sopenharmony_ci c3 = StrSubclass("b") 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci self.assert_total_order(s1, s1, 0) 3977db96d56Sopenharmony_ci self.assert_total_order(s1, s2, -1) 3987db96d56Sopenharmony_ci self.assert_total_order(c1, c1, 0) 3997db96d56Sopenharmony_ci self.assert_total_order(c1, c2, -1) 4007db96d56Sopenharmony_ci self.assert_total_order(c2, c3, 0) 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci self.assert_total_order(s1, c2, -1) 4037db96d56Sopenharmony_ci self.assert_total_order(s2, c3, 0) 4047db96d56Sopenharmony_ci self.assert_total_order(c1, s2, -1) 4057db96d56Sopenharmony_ci self.assert_total_order(c2, s2, 0) 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci def test_numbers(self): 4087db96d56Sopenharmony_ci """Compare number types.""" 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci # Same types. 4117db96d56Sopenharmony_ci i1 = 1001 4127db96d56Sopenharmony_ci i2 = 1002 4137db96d56Sopenharmony_ci self.assert_total_order(i1, i1, 0) 4147db96d56Sopenharmony_ci self.assert_total_order(i1, i2, -1) 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci f1 = 1001.0 4177db96d56Sopenharmony_ci f2 = 1001.1 4187db96d56Sopenharmony_ci self.assert_total_order(f1, f1, 0) 4197db96d56Sopenharmony_ci self.assert_total_order(f1, f2, -1) 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci q1 = Fraction(2002, 2) 4227db96d56Sopenharmony_ci q2 = Fraction(2003, 2) 4237db96d56Sopenharmony_ci self.assert_total_order(q1, q1, 0) 4247db96d56Sopenharmony_ci self.assert_total_order(q1, q2, -1) 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci d1 = Decimal('1001.0') 4277db96d56Sopenharmony_ci d2 = Decimal('1001.1') 4287db96d56Sopenharmony_ci self.assert_total_order(d1, d1, 0) 4297db96d56Sopenharmony_ci self.assert_total_order(d1, d2, -1) 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci c1 = 1001+0j 4327db96d56Sopenharmony_ci c2 = 1001+1j 4337db96d56Sopenharmony_ci self.assert_equality_only(c1, c1, True) 4347db96d56Sopenharmony_ci self.assert_equality_only(c1, c2, False) 4357db96d56Sopenharmony_ci 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci # Mixing types. 4387db96d56Sopenharmony_ci for n1, n2 in ((i1,f1), (i1,q1), (i1,d1), (f1,q1), (f1,d1), (q1,d1)): 4397db96d56Sopenharmony_ci self.assert_total_order(n1, n2, 0) 4407db96d56Sopenharmony_ci for n1 in (i1, f1, q1, d1): 4417db96d56Sopenharmony_ci self.assert_equality_only(n1, c1, True) 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci def test_sequences(self): 4447db96d56Sopenharmony_ci """Compare list, tuple, and range.""" 4457db96d56Sopenharmony_ci l1 = [1, 2] 4467db96d56Sopenharmony_ci l2 = [2, 3] 4477db96d56Sopenharmony_ci self.assert_total_order(l1, l1, 0) 4487db96d56Sopenharmony_ci self.assert_total_order(l1, l2, -1) 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci t1 = (1, 2) 4517db96d56Sopenharmony_ci t2 = (2, 3) 4527db96d56Sopenharmony_ci self.assert_total_order(t1, t1, 0) 4537db96d56Sopenharmony_ci self.assert_total_order(t1, t2, -1) 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci r1 = range(1, 2) 4567db96d56Sopenharmony_ci r2 = range(2, 2) 4577db96d56Sopenharmony_ci self.assert_equality_only(r1, r1, True) 4587db96d56Sopenharmony_ci self.assert_equality_only(r1, r2, False) 4597db96d56Sopenharmony_ci 4607db96d56Sopenharmony_ci self.assert_equality_only(t1, l1, False) 4617db96d56Sopenharmony_ci self.assert_equality_only(l1, r1, False) 4627db96d56Sopenharmony_ci self.assert_equality_only(r1, t1, False) 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci def test_bytes(self): 4657db96d56Sopenharmony_ci """Compare bytes and bytearray.""" 4667db96d56Sopenharmony_ci bs1 = b'a1' 4677db96d56Sopenharmony_ci bs2 = b'b2' 4687db96d56Sopenharmony_ci self.assert_total_order(bs1, bs1, 0) 4697db96d56Sopenharmony_ci self.assert_total_order(bs1, bs2, -1) 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci ba1 = bytearray(b'a1') 4727db96d56Sopenharmony_ci ba2 = bytearray(b'b2') 4737db96d56Sopenharmony_ci self.assert_total_order(ba1, ba1, 0) 4747db96d56Sopenharmony_ci self.assert_total_order(ba1, ba2, -1) 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ci self.assert_total_order(bs1, ba1, 0) 4777db96d56Sopenharmony_ci self.assert_total_order(bs1, ba2, -1) 4787db96d56Sopenharmony_ci self.assert_total_order(ba1, bs1, 0) 4797db96d56Sopenharmony_ci self.assert_total_order(ba1, bs2, -1) 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ci def test_sets(self): 4827db96d56Sopenharmony_ci """Compare set and frozenset.""" 4837db96d56Sopenharmony_ci s1 = {1, 2} 4847db96d56Sopenharmony_ci s2 = {1, 2, 3} 4857db96d56Sopenharmony_ci self.assert_total_order(s1, s1, 0) 4867db96d56Sopenharmony_ci self.assert_total_order(s1, s2, -1) 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci f1 = frozenset(s1) 4897db96d56Sopenharmony_ci f2 = frozenset(s2) 4907db96d56Sopenharmony_ci self.assert_total_order(f1, f1, 0) 4917db96d56Sopenharmony_ci self.assert_total_order(f1, f2, -1) 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ci self.assert_total_order(s1, f1, 0) 4947db96d56Sopenharmony_ci self.assert_total_order(s1, f2, -1) 4957db96d56Sopenharmony_ci self.assert_total_order(f1, s1, 0) 4967db96d56Sopenharmony_ci self.assert_total_order(f1, s2, -1) 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci def test_mappings(self): 4997db96d56Sopenharmony_ci """ Compare dict. 5007db96d56Sopenharmony_ci """ 5017db96d56Sopenharmony_ci d1 = {1: "a", 2: "b"} 5027db96d56Sopenharmony_ci d2 = {2: "b", 3: "c"} 5037db96d56Sopenharmony_ci d3 = {3: "c", 2: "b"} 5047db96d56Sopenharmony_ci self.assert_equality_only(d1, d1, True) 5057db96d56Sopenharmony_ci self.assert_equality_only(d1, d2, False) 5067db96d56Sopenharmony_ci self.assert_equality_only(d2, d3, True) 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci 5097db96d56Sopenharmony_ciif __name__ == '__main__': 5107db96d56Sopenharmony_ci unittest.main() 511