1c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum# Tests for rich comparisons
2c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
3721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldimport unittest
4721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldfrom test import test_support
5721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
6721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldimport operator
7c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
8c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossumclass Number:
9c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
10c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __init__(self, x):
11c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        self.x = x
12c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
13c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __lt__(self, other):
14c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x < other
15c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
16c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __le__(self, other):
17c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x <= other
18c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
19c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __eq__(self, other):
20c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x == other
21c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
22c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __ne__(self, other):
23c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x != other
24c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
25c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __gt__(self, other):
26c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x > other
27c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
28c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __ge__(self, other):
29c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.x >= other
30c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
31c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __cmp__(self, other):
32721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        raise test_support.TestFailed, "Number.__cmp__() should not be called"
33c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
34c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __repr__(self):
35721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        return "Number(%r)" % (self.x, )
36c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
37c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossumclass Vector:
38c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
39c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __init__(self, data):
40c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        self.data = data
41c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
42c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __len__(self):
43c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return len(self.data)
44c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
45c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __getitem__(self, i):
46c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return self.data[i]
47c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
48c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __setitem__(self, i, v):
49c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        self.data[i] = v
50c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
5153663a695ef2bb96ac0252cd4cc4aa40d4f953beNick Coghlan    __hash__ = None # Vectors cannot be hashed
52c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
53c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __nonzero__(self):
54c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        raise TypeError, "Vectors cannot be used in Boolean contexts"
55c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
56c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __cmp__(self, other):
57721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        raise test_support.TestFailed, "Vector.__cmp__() should not be called"
58c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
59c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __repr__(self):
60721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        return "Vector(%r)" % (self.data, )
61c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
62c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __lt__(self, other):
63c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a < b for a, b in zip(self.data, self.__cast(other))])
64c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
65c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __le__(self, other):
66c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a <= b for a, b in zip(self.data, self.__cast(other))])
67c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
68c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __eq__(self, other):
69c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a == b for a, b in zip(self.data, self.__cast(other))])
70c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
71c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __ne__(self, other):
72c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a != b for a, b in zip(self.data, self.__cast(other))])
73c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
74c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __gt__(self, other):
75c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a > b for a, b in zip(self.data, self.__cast(other))])
76c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
77c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __ge__(self, other):
78c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return Vector([a >= b for a, b in zip(self.data, self.__cast(other))])
79c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
80c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum    def __cast(self, other):
81c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        if isinstance(other, Vector):
82c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum            other = other.data
83c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        if len(self.data) != len(other):
84c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum            raise ValueError, "Cannot compare vectors of different length"
85c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum        return other
86c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
87721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldopmap = {
88721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "lt": (lambda a,b: a< b, operator.lt, operator.__lt__),
89721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "le": (lambda a,b: a<=b, operator.le, operator.__le__),
90721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "eq": (lambda a,b: a==b, operator.eq, operator.__eq__),
91721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "ne": (lambda a,b: a!=b, operator.ne, operator.__ne__),
92721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "gt": (lambda a,b: a> b, operator.gt, operator.__gt__),
93721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    "ge": (lambda a,b: a>=b, operator.ge, operator.__ge__)
94721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald}
95721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
96721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldclass VectorTest(unittest.TestCase):
97721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
98721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def checkfail(self, error, opname, *args):
99721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for op in opmap[opname]:
100721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.assertRaises(error, op, *args)
101721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
102721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def checkequal(self, opname, a, b, expres):
103721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for op in opmap[opname]:
104721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            realres = op(a, b)
105721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            # can't use assertEqual(realres, expres) here
106721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.assertEqual(len(realres), len(expres))
107721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            for i in xrange(len(realres)):
108721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                # results are bool, so we can use "is" here
1095c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson                self.assertTrue(realres[i] is expres[i])
110721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
111721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_mixed(self):
112721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # check that comparisons involving Vector objects
113721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # which return rich results (i.e. Vectors with itemwise
114721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # comparison results) work
115721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a = Vector(range(2))
116721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b = Vector(range(3))
117721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # all comparisons should fail for different length
118721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for opname in opmap:
119721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkfail(ValueError, opname, a, b)
120721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
121721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a = range(5)
122721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b = 5 * [2]
123721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # try mixed arguments (but not (a, b) as that won't return a bool vector)
124721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        args = [(a, Vector(b)), (Vector(a), b), (Vector(a), Vector(b))]
125721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for (a, b) in args:
126721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("lt", a, b, [True,  True,  False, False, False])
127721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("le", a, b, [True,  True,  True,  False, False])
128721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("eq", a, b, [False, False, True,  False, False])
129721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("ne", a, b, [True,  True,  False, True,  True ])
130721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("gt", a, b, [False, False, False, True,  True ])
131721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.checkequal("ge", a, b, [False, False, True,  True,  True ])
132721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
133721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            for ops in opmap.itervalues():
134721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                for op in ops:
135721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                    # calls __nonzero__, which should fail
136721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                    self.assertRaises(TypeError, bool, op(a, b))
137721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
138721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldclass NumberTest(unittest.TestCase):
139721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
140721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_basic(self):
141721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # Check that comparisons involving Number objects
142721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # give the same results give as comparing the
143721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # corresponding ints
144721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for a in xrange(3):
145721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            for b in xrange(3):
146721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                for typea in (int, Number):
147721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                    for typeb in (int, Number):
148721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                        if typea==typeb==int:
149721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                            continue # the combination int, int is useless
150721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                        ta = typea(a)
151721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                        tb = typeb(b)
152721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                        for ops in opmap.itervalues():
153721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                            for op in ops:
154721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                                realoutcome = op(a, b)
155721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                                testoutcome = op(ta, tb)
156721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                                self.assertEqual(realoutcome, testoutcome)
157721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
158721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def checkvalue(self, opname, a, b, expres):
159721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for typea in (int, Number):
160721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            for typeb in (int, Number):
161721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                ta = typea(a)
162721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                tb = typeb(b)
163721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                for op in opmap[opname]:
164721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                    realres = op(ta, tb)
165721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                    realres = getattr(realres, "x", realres)
1665c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson                    self.assertTrue(realres is expres)
167721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
168721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_values(self):
169721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # check all operators and all comparison results
170721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("lt", 0, 0, False)
171721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("le", 0, 0, True )
172721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("eq", 0, 0, True )
173721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ne", 0, 0, False)
174721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("gt", 0, 0, False)
175721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ge", 0, 0, True )
176721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
177721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("lt", 0, 1, True )
178721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("le", 0, 1, True )
179721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("eq", 0, 1, False)
180721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ne", 0, 1, True )
181721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("gt", 0, 1, False)
182721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ge", 0, 1, False)
183721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
184721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("lt", 1, 0, False)
185721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("le", 1, 0, False)
186721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("eq", 1, 0, False)
187721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ne", 1, 0, True )
188721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("gt", 1, 0, True )
189721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.checkvalue("ge", 1, 0, True )
190721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
191721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldclass MiscTest(unittest.TestCase):
192721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
193721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_misbehavin(self):
194721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        class Misb:
195d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __lt__(self_, other): return 0
196d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __gt__(self_, other): return 0
197d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __eq__(self_, other): return 0
198d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __le__(self_, other): self.fail("This shouldn't happen")
199d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __ge__(self_, other): self.fail("This shouldn't happen")
200d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __ne__(self_, other): self.fail("This shouldn't happen")
201d10d8ee2a1f0e4fd01816b5717eb5cc92684fb37Georg Brandl            def __cmp__(self_, other): raise RuntimeError, "expected"
202721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a = Misb()
203721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b = Misb()
204721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertEqual(a<b, 0)
205721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertEqual(a==b, 0)
206721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertEqual(a>b, 0)
207721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertRaises(RuntimeError, cmp, a, b)
208721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
209721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_not(self):
210721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # Check that exceptions in __nonzero__ are properly
211721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # propagated by the not operator
212721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        import operator
2135a822fb7202e57803b8dc0e6cbed8a2b102993ebNeal Norwitz        class Exc(Exception):
214c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum            pass
215721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        class Bad:
216721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            def __nonzero__(self):
217721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                raise Exc
218721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
219721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        def do(bad):
220721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            not bad
221721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
222721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for func in (do, operator.not_):
223721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.assertRaises(Exc, func, Bad())
224721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
225721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_recursion(self):
2262b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        # Check that comparison for recursive objects fails gracefully
227721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        from UserList import UserList
228721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a = UserList()
229721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b = UserList()
230721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a.append(b)
231721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b.append(a)
2322b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.eq, a, b)
2332b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.ne, a, b)
2342b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.lt, a, b)
2352b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.le, a, b)
2362b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.gt, a, b)
2372b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.ge, a, b)
238721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
239721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        b.append(17)
2402b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        # Even recursive lists of different lengths are different,
2412b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        # but they cannot be ordered
2425c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(not (a == b))
2435c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a != b)
2442b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.lt, a, b)
2452b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.le, a, b)
2462b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.gt, a, b)
2472b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.ge, a, b)
248721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        a.append(17)
2492b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.eq, a, b)
2502b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        self.assertRaises(RuntimeError, operator.ne, a, b)
2512b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        a.insert(0, 11)
2522b3eb4062c5e50abf854f7e68038243ca7c07217Armin Rigo        b.insert(0, 12)
2535c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(not (a == b))
2545c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a != b)
2555c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a < b)
256721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
257721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldclass DictTest(unittest.TestCase):
258721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
259721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_dicts(self):
260721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # Verify that __eq__ and __ne__ work for dicts even if the keys and
261be3856dcd41b444642a77c93e1f94367741692e7Georg Brandl        # values don't support anything other than __eq__ and __ne__ (and
262be3856dcd41b444642a77c93e1f94367741692e7Georg Brandl        # __hash__).  Complex numbers are a fine example of that.
263721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        import random
264721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        imag1a = {}
265721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for i in range(50):
266721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            imag1a[random.randrange(100)*1j] = random.randrange(100)*1j
267721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        items = imag1a.items()
268721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        random.shuffle(items)
269721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        imag1b = {}
270721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for k, v in items:
271721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            imag1b[k] = v
272721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        imag2 = imag1b.copy()
273721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        imag2[k] = v + 1.0
2745c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(imag1a == imag1a)
2755c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(imag1a == imag1b)
2765c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(imag2 == imag2)
2775c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(imag1a != imag2)
278721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for opname in ("lt", "le", "gt", "ge"):
279721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            for op in opmap[opname]:
280721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                self.assertRaises(TypeError, op, imag1a, imag2)
281721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
282721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldclass ListTest(unittest.TestCase):
283721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
284721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_coverage(self):
285721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # exercise all comparisons for lists
286721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        x = [42]
287721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x<x, False)
288721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x<=x, True)
289721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x==x, True)
290721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x!=x, False)
291721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x>x, False)
292721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x>=x, True)
293721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        y = [42, 42]
294721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x<y, True)
295721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x<=y, True)
296721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x==y, False)
297721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x!=y, True)
298721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x>y, False)
299721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        self.assertIs(x>=y, False)
300721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
301721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_badentry(self):
302721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # make sure that exceptions for item comparison are properly
303721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # propagated in list comparisons
3045a822fb7202e57803b8dc0e6cbed8a2b102993ebNeal Norwitz        class Exc(Exception):
305c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum            pass
306721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        class Bad:
307721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            def __eq__(self, other):
308721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                raise Exc
309c4a6e8b65a9c55b41c4aee2c542e5dda5ae96e57Guido van Rossum
310721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        x = [Bad()]
311721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        y = [Bad()]
312721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
313721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for op in opmap["eq"]:
314721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.assertRaises(Exc, op, x, y)
315721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
316721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    def test_goodentry(self):
317721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # This test exercises the final call to PyObject_RichCompare()
318721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        # in Objects/listobject.c::list_richcompare()
319721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        class Good:
320721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            def __lt__(self, other):
321721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald                return True
322721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
323721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        x = [Good()]
324721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        y = [Good()]
325721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
326721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald        for op in opmap["lt"]:
327721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald            self.assertIs(op(x, y), True)
328721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
329721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwalddef test_main():
33007627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    test_support.run_unittest(VectorTest, NumberTest, MiscTest, ListTest)
33107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    with test_support.check_py3k_warnings(("dict inequality comparisons "
33207627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna                                             "not supported in 3.x",
33307627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna                                             DeprecationWarning)):
33407627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna        test_support.run_unittest(DictTest)
33507627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna
336721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald
337721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwaldif __name__ == "__main__":
338721adf99529a5565edfbdbb6678f00e7ac9bd155Walter Dörwald    test_main()
339