1import unittest
2from test import test_support
3
4class Empty:
5    def __repr__(self):
6        return '<Empty>'
7
8class Coerce:
9    def __init__(self, arg):
10        self.arg = arg
11
12    def __repr__(self):
13        return '<Coerce %s>' % self.arg
14
15    def __coerce__(self, other):
16        if isinstance(other, Coerce):
17            return self.arg, other.arg
18        else:
19            return self.arg, other
20
21class Cmp:
22    def __init__(self,arg):
23        self.arg = arg
24
25    def __repr__(self):
26        return '<Cmp %s>' % self.arg
27
28    def __cmp__(self, other):
29        return cmp(self.arg, other)
30
31class ComparisonTest(unittest.TestCase):
32    set1 = [2, 2.0, 2L, 2+0j, Coerce(2), Cmp(2.0)]
33    set2 = [[1], (3,), None, Empty()]
34    candidates = set1 + set2
35
36    def test_comparisons(self):
37        for a in self.candidates:
38            for b in self.candidates:
39                if ((a in self.set1) and (b in self.set1)) or a is b:
40                    self.assertEqual(a, b)
41                else:
42                    self.assertNotEqual(a, b)
43
44    def test_id_comparisons(self):
45        # Ensure default comparison compares id() of args
46        L = []
47        for i in range(10):
48            L.insert(len(L)//2, Empty())
49        for a in L:
50            for b in L:
51                self.assertEqual(cmp(a, b), cmp(id(a), id(b)),
52                                 'a=%r, b=%r' % (a, b))
53
54def test_main():
55    test_support.run_unittest(ComparisonTest)
56
57if __name__ == '__main__':
58    test_main()
59