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