xref: /third_party/python/Lib/test/test_compare.py (revision 7db96d56)
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