1 import operator 2 import unittest 3 4 from test import test_support 5 6 class Seq1: 7 def __init__(self, lst): 8 self.lst = lst 9 def __len__(self): 10 return len(self.lst) 11 def __getitem__(self, i): 12 return self.lst[i] 13 def __add__(self, other): 14 return self.lst + other.lst 15 def __mul__(self, other): 16 return self.lst * other 17 def __rmul__(self, other): 18 return other * self.lst 19 20 class Seq2(object): 21 def __init__(self, lst): 22 self.lst = lst 23 def __len__(self): 24 return len(self.lst) 25 def __getitem__(self, i): 26 return self.lst[i] 27 def __add__(self, other): 28 return self.lst + other.lst 29 def __mul__(self, other): 30 return self.lst * other 31 def __rmul__(self, other): 32 return other * self.lst 33 34 35 class OperatorTestCase(unittest.TestCase): 36 def test_lt(self): 37 self.assertRaises(TypeError, operator.lt) 38 self.assertRaises(TypeError, operator.lt, 1j, 2j) 39 self.assertFalse(operator.lt(1, 0)) 40 self.assertFalse(operator.lt(1, 0.0)) 41 self.assertFalse(operator.lt(1, 1)) 42 self.assertFalse(operator.lt(1, 1.0)) 43 self.assertTrue(operator.lt(1, 2)) 44 self.assertTrue(operator.lt(1, 2.0)) 45 46 def test_le(self): 47 self.assertRaises(TypeError, operator.le) 48 self.assertRaises(TypeError, operator.le, 1j, 2j) 49 self.assertFalse(operator.le(1, 0)) 50 self.assertFalse(operator.le(1, 0.0)) 51 self.assertTrue(operator.le(1, 1)) 52 self.assertTrue(operator.le(1, 1.0)) 53 self.assertTrue(operator.le(1, 2)) 54 self.assertTrue(operator.le(1, 2.0)) 55 56 def test_eq(self): 57 class C(object): 58 def __eq__(self, other): 59 raise SyntaxError 60 __hash__ = None # Silence Py3k warning 61 self.assertRaises(TypeError, operator.eq) 62 self.assertRaises(SyntaxError, operator.eq, C(), C()) 63 self.assertFalse(operator.eq(1, 0)) 64 self.assertFalse(operator.eq(1, 0.0)) 65 self.assertTrue(operator.eq(1, 1)) 66 self.assertTrue(operator.eq(1, 1.0)) 67 self.assertFalse(operator.eq(1, 2)) 68 self.assertFalse(operator.eq(1, 2.0)) 69 70 def test_ne(self): 71 class C(object): 72 def __ne__(self, other): 73 raise SyntaxError 74 self.assertRaises(TypeError, operator.ne) 75 self.assertRaises(SyntaxError, operator.ne, C(), C()) 76 self.assertTrue(operator.ne(1, 0)) 77 self.assertTrue(operator.ne(1, 0.0)) 78 self.assertFalse(operator.ne(1, 1)) 79 self.assertFalse(operator.ne(1, 1.0)) 80 self.assertTrue(operator.ne(1, 2)) 81 self.assertTrue(operator.ne(1, 2.0)) 82 83 def test_ge(self): 84 self.assertRaises(TypeError, operator.ge) 85 self.assertRaises(TypeError, operator.ge, 1j, 2j) 86 self.assertTrue(operator.ge(1, 0)) 87 self.assertTrue(operator.ge(1, 0.0)) 88 self.assertTrue(operator.ge(1, 1)) 89 self.assertTrue(operator.ge(1, 1.0)) 90 self.assertFalse(operator.ge(1, 2)) 91 self.assertFalse(operator.ge(1, 2.0)) 92 93 def test_gt(self): 94 self.assertRaises(TypeError, operator.gt) 95 self.assertRaises(TypeError, operator.gt, 1j, 2j) 96 self.assertTrue(operator.gt(1, 0)) 97 self.assertTrue(operator.gt(1, 0.0)) 98 self.assertFalse(operator.gt(1, 1)) 99 self.assertFalse(operator.gt(1, 1.0)) 100 self.assertFalse(operator.gt(1, 2)) 101 self.assertFalse(operator.gt(1, 2.0)) 102 103 def test_abs(self): 104 self.assertRaises(TypeError, operator.abs) 105 self.assertRaises(TypeError, operator.abs, None) 106 self.assertTrue(operator.abs(-1) == 1) 107 self.assertTrue(operator.abs(1) == 1) 108 109 def test_add(self): 110 self.assertRaises(TypeError, operator.add) 111 self.assertRaises(TypeError, operator.add, None, None) 112 self.assertTrue(operator.add(3, 4) == 7) 113 114 def test_bitwise_and(self): 115 self.assertRaises(TypeError, operator.and_) 116 self.assertRaises(TypeError, operator.and_, None, None) 117 self.assertTrue(operator.and_(0xf, 0xa) == 0xa) 118 119 def test_concat(self): 120 self.assertRaises(TypeError, operator.concat) 121 self.assertRaises(TypeError, operator.concat, None, None) 122 self.assertTrue(operator.concat('py', 'thon') == 'python') 123 self.assertTrue(operator.concat([1, 2], [3, 4]) == [1, 2, 3, 4]) 124 self.assertTrue(operator.concat(Seq1([5, 6]), Seq1([7])) == [5, 6, 7]) 125 self.assertTrue(operator.concat(Seq2([5, 6]), Seq2([7])) == [5, 6, 7]) 126 self.assertRaises(TypeError, operator.concat, 13, 29) 127 128 def test_countOf(self): 129 self.assertRaises(TypeError, operator.countOf) 130 self.assertRaises(TypeError, operator.countOf, None, None) 131 self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 3) == 1) 132 self.assertTrue(operator.countOf([1, 2, 1, 3, 1, 4], 5) == 0) 133 134 def test_delitem(self): 135 a = [4, 3, 2, 1] 136 self.assertRaises(TypeError, operator.delitem, a) 137 self.assertRaises(TypeError, operator.delitem, a, None) 138 self.assertTrue(operator.delitem(a, 1) is None) 139 self.assertTrue(a == [4, 2, 1]) 140 141 def test_delslice(self): 142 a = range(10) 143 self.assertRaises(TypeError, operator.delslice, a) 144 self.assertRaises(TypeError, operator.delslice, a, None, None) 145 self.assertTrue(operator.delslice(a, 2, 8) is None) 146 self.assertTrue(a == [0, 1, 8, 9]) 147 operator.delslice(a, 0, test_support.MAX_Py_ssize_t) 148 self.assertTrue(a == []) 149 150 def test_div(self): 151 self.assertRaises(TypeError, operator.div, 5) 152 self.assertRaises(TypeError, operator.div, None, None) 153 self.assertTrue(operator.floordiv(5, 2) == 2) 154 155 def test_floordiv(self): 156 self.assertRaises(TypeError, operator.floordiv, 5) 157 self.assertRaises(TypeError, operator.floordiv, None, None) 158 self.assertTrue(operator.floordiv(5, 2) == 2) 159 160 def test_truediv(self): 161 self.assertRaises(TypeError, operator.truediv, 5) 162 self.assertRaises(TypeError, operator.truediv, None, None) 163 self.assertTrue(operator.truediv(5, 2) == 2.5) 164 165 def test_getitem(self): 166 a = range(10) 167 self.assertRaises(TypeError, operator.getitem) 168 self.assertRaises(TypeError, operator.getitem, a, None) 169 self.assertTrue(operator.getitem(a, 2) == 2) 170 171 def test_getslice(self): 172 a = range(10) 173 self.assertRaises(TypeError, operator.getslice) 174 self.assertRaises(TypeError, operator.getslice, a, None, None) 175 self.assertTrue(operator.getslice(a, 4, 6) == [4, 5]) 176 b = operator.getslice(a, 0, test_support.MAX_Py_ssize_t) 177 self.assertTrue(b == a) 178 179 def test_indexOf(self): 180 self.assertRaises(TypeError, operator.indexOf) 181 self.assertRaises(TypeError, operator.indexOf, None, None) 182 self.assertTrue(operator.indexOf([4, 3, 2, 1], 3) == 1) 183 self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0) 184 185 def test_invert(self): 186 self.assertRaises(TypeError, operator.invert) 187 self.assertRaises(TypeError, operator.invert, None) 188 self.assertTrue(operator.inv(4) == -5) 189 190 def test_isCallable(self): 191 self.assertRaises(TypeError, operator.isCallable) 192 class C: 193 pass 194 def check(self, o, v): 195 with test_support.check_py3k_warnings(): 196 self.assertEqual(operator.isCallable(o), v) 197 self.assertEqual(callable(o), v) 198 check(self, 4, 0) 199 check(self, operator.isCallable, 1) 200 check(self, C, 1) 201 check(self, C(), 0) 202 203 def test_isMappingType(self): 204 self.assertRaises(TypeError, operator.isMappingType) 205 self.assertFalse(operator.isMappingType(1)) 206 self.assertFalse(operator.isMappingType(operator.isMappingType)) 207 self.assertTrue(operator.isMappingType(operator.__dict__)) 208 self.assertTrue(operator.isMappingType({})) 209 210 def test_isNumberType(self): 211 self.assertRaises(TypeError, operator.isNumberType) 212 self.assertTrue(operator.isNumberType(8)) 213 self.assertTrue(operator.isNumberType(8j)) 214 self.assertTrue(operator.isNumberType(8L)) 215 self.assertTrue(operator.isNumberType(8.3)) 216 self.assertFalse(operator.isNumberType(dir())) 217 218 def test_isSequenceType(self): 219 self.assertRaises(TypeError, operator.isSequenceType) 220 self.assertTrue(operator.isSequenceType(dir())) 221 self.assertTrue(operator.isSequenceType(())) 222 self.assertTrue(operator.isSequenceType(xrange(10))) 223 self.assertTrue(operator.isSequenceType('yeahbuddy')) 224 self.assertFalse(operator.isSequenceType(3)) 225 class Dict(dict): pass 226 self.assertFalse(operator.isSequenceType(Dict())) 227 228 def test_lshift(self): 229 self.assertRaises(TypeError, operator.lshift) 230 self.assertRaises(TypeError, operator.lshift, None, 42) 231 self.assertTrue(operator.lshift(5, 1) == 10) 232 self.assertTrue(operator.lshift(5, 0) == 5) 233 self.assertRaises(ValueError, operator.lshift, 2, -1) 234 235 def test_mod(self): 236 self.assertRaises(TypeError, operator.mod) 237 self.assertRaises(TypeError, operator.mod, None, 42) 238 self.assertTrue(operator.mod(5, 2) == 1) 239 240 def test_mul(self): 241 self.assertRaises(TypeError, operator.mul) 242 self.assertRaises(TypeError, operator.mul, None, None) 243 self.assertTrue(operator.mul(5, 2) == 10) 244 245 def test_neg(self): 246 self.assertRaises(TypeError, operator.neg) 247 self.assertRaises(TypeError, operator.neg, None) 248 self.assertTrue(operator.neg(5) == -5) 249 self.assertTrue(operator.neg(-5) == 5) 250 self.assertTrue(operator.neg(0) == 0) 251 self.assertTrue(operator.neg(-0) == 0) 252 253 def test_bitwise_or(self): 254 self.assertRaises(TypeError, operator.or_) 255 self.assertRaises(TypeError, operator.or_, None, None) 256 self.assertTrue(operator.or_(0xa, 0x5) == 0xf) 257 258 def test_pos(self): 259 self.assertRaises(TypeError, operator.pos) 260 self.assertRaises(TypeError, operator.pos, None) 261 self.assertTrue(operator.pos(5) == 5) 262 self.assertTrue(operator.pos(-5) == -5) 263 self.assertTrue(operator.pos(0) == 0) 264 self.assertTrue(operator.pos(-0) == 0) 265 266 def test_pow(self): 267 self.assertRaises(TypeError, operator.pow) 268 self.assertRaises(TypeError, operator.pow, None, None) 269 self.assertTrue(operator.pow(3,5) == 3**5) 270 self.assertTrue(operator.__pow__(3,5) == 3**5) 271 self.assertRaises(TypeError, operator.pow, 1) 272 self.assertRaises(TypeError, operator.pow, 1, 2, 3) 273 274 def test_repeat(self): 275 a = range(3) 276 self.assertRaises(TypeError, operator.repeat) 277 self.assertRaises(TypeError, operator.repeat, a, None) 278 self.assertTrue(operator.repeat(a, 2) == a+a) 279 self.assertTrue(operator.repeat(a, 1) == a) 280 self.assertTrue(operator.repeat(a, 0) == []) 281 a = (1, 2, 3) 282 self.assertTrue(operator.repeat(a, 2) == a+a) 283 self.assertTrue(operator.repeat(a, 1) == a) 284 self.assertTrue(operator.repeat(a, 0) == ()) 285 a = '123' 286 self.assertTrue(operator.repeat(a, 2) == a+a) 287 self.assertTrue(operator.repeat(a, 1) == a) 288 self.assertTrue(operator.repeat(a, 0) == '') 289 a = Seq1([4, 5, 6]) 290 self.assertTrue(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6]) 291 self.assertTrue(operator.repeat(a, 1) == [4, 5, 6]) 292 self.assertTrue(operator.repeat(a, 0) == []) 293 a = Seq2([4, 5, 6]) 294 self.assertTrue(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6]) 295 self.assertTrue(operator.repeat(a, 1) == [4, 5, 6]) 296 self.assertTrue(operator.repeat(a, 0) == []) 297 self.assertRaises(TypeError, operator.repeat, 6, 7) 298 299 def test_rshift(self): 300 self.assertRaises(TypeError, operator.rshift) 301 self.assertRaises(TypeError, operator.rshift, None, 42) 302 self.assertTrue(operator.rshift(5, 1) == 2) 303 self.assertTrue(operator.rshift(5, 0) == 5) 304 self.assertRaises(ValueError, operator.rshift, 2, -1) 305 306 def test_contains(self): 307 self.assertRaises(TypeError, operator.contains) 308 self.assertRaises(TypeError, operator.contains, None, None) 309 self.assertTrue(operator.contains(range(4), 2)) 310 self.assertFalse(operator.contains(range(4), 5)) 311 with test_support.check_py3k_warnings(): 312 self.assertTrue(operator.sequenceIncludes(range(4), 2)) 313 self.assertFalse(operator.sequenceIncludes(range(4), 5)) 314 315 def test_setitem(self): 316 a = range(3) 317 self.assertRaises(TypeError, operator.setitem, a) 318 self.assertRaises(TypeError, operator.setitem, a, None, None) 319 self.assertTrue(operator.setitem(a, 0, 2) is None) 320 self.assertTrue(a == [2, 1, 2]) 321 self.assertRaises(IndexError, operator.setitem, a, 4, 2) 322 323 def test_setslice(self): 324 a = range(4) 325 self.assertRaises(TypeError, operator.setslice, a) 326 self.assertRaises(TypeError, operator.setslice, a, None, None, None) 327 self.assertTrue(operator.setslice(a, 1, 3, [2, 1]) is None) 328 self.assertTrue(a == [0, 2, 1, 3]) 329 operator.setslice(a, 0, test_support.MAX_Py_ssize_t, []) 330 self.assertTrue(a == []) 331 332 def test_sub(self): 333 self.assertRaises(TypeError, operator.sub) 334 self.assertRaises(TypeError, operator.sub, None, None) 335 self.assertTrue(operator.sub(5, 2) == 3) 336 337 def test_truth(self): 338 class C(object): 339 def __nonzero__(self): 340 raise SyntaxError 341 self.assertRaises(TypeError, operator.truth) 342 self.assertRaises(SyntaxError, operator.truth, C()) 343 self.assertTrue(operator.truth(5)) 344 self.assertTrue(operator.truth([0])) 345 self.assertFalse(operator.truth(0)) 346 self.assertFalse(operator.truth([])) 347 348 def test_bitwise_xor(self): 349 self.assertRaises(TypeError, operator.xor) 350 self.assertRaises(TypeError, operator.xor, None, None) 351 self.assertTrue(operator.xor(0xb, 0xc) == 0x7) 352 353 def test_is(self): 354 a = b = 'xyzpdq' 355 c = a[:3] + b[3:] 356 self.assertRaises(TypeError, operator.is_) 357 self.assertTrue(operator.is_(a, b)) 358 self.assertFalse(operator.is_(a,c)) 359 360 def test_is_not(self): 361 a = b = 'xyzpdq' 362 c = a[:3] + b[3:] 363 self.assertRaises(TypeError, operator.is_not) 364 self.assertFalse(operator.is_not(a, b)) 365 self.assertTrue(operator.is_not(a,c)) 366 367 def test_attrgetter(self): 368 class A: 369 pass 370 a = A() 371 a.name = 'arthur' 372 f = operator.attrgetter('name') 373 self.assertEqual(f(a), 'arthur') 374 self.assertRaises(TypeError, f) 375 self.assertRaises(TypeError, f, a, 'dent') 376 self.assertRaises(TypeError, f, a, surname='dent') 377 f = operator.attrgetter('rank') 378 self.assertRaises(AttributeError, f, a) 379 f = operator.attrgetter(2) 380 self.assertRaises(TypeError, f, a) 381 self.assertRaises(TypeError, operator.attrgetter) 382 383 # multiple gets 384 record = A() 385 record.x = 'X' 386 record.y = 'Y' 387 record.z = 'Z' 388 self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y')) 389 self.assertRaises(TypeError, operator.attrgetter('x', (), 'y'), record) 390 391 class C(object): 392 def __getattr__(self, name): 393 raise SyntaxError 394 self.assertRaises(SyntaxError, operator.attrgetter('foo'), C()) 395 396 # recursive gets 397 a = A() 398 a.name = 'arthur' 399 a.child = A() 400 a.child.name = 'thomas' 401 f = operator.attrgetter('child.name') 402 self.assertEqual(f(a), 'thomas') 403 self.assertRaises(AttributeError, f, a.child) 404 f = operator.attrgetter('name', 'child.name') 405 self.assertEqual(f(a), ('arthur', 'thomas')) 406 f = operator.attrgetter('name', 'child.name', 'child.child.name') 407 self.assertRaises(AttributeError, f, a) 408 409 a.child.child = A() 410 a.child.child.name = 'johnson' 411 f = operator.attrgetter('child.child.name') 412 self.assertEqual(f(a), 'johnson') 413 f = operator.attrgetter('name', 'child.name', 'child.child.name') 414 self.assertEqual(f(a), ('arthur', 'thomas', 'johnson')) 415 416 def test_itemgetter(self): 417 a = 'ABCDE' 418 f = operator.itemgetter(2) 419 self.assertEqual(f(a), 'C') 420 self.assertRaises(TypeError, f) 421 self.assertRaises(TypeError, f, a, 3) 422 self.assertRaises(TypeError, f, a, size=3) 423 f = operator.itemgetter(10) 424 self.assertRaises(IndexError, f, a) 425 426 class C(object): 427 def __getitem__(self, name): 428 raise SyntaxError 429 self.assertRaises(SyntaxError, operator.itemgetter(42), C()) 430 431 f = operator.itemgetter('name') 432 self.assertRaises(TypeError, f, a) 433 self.assertRaises(TypeError, operator.itemgetter) 434 435 d = dict(key='val') 436 f = operator.itemgetter('key') 437 self.assertEqual(f(d), 'val') 438 f = operator.itemgetter('nonkey') 439 self.assertRaises(KeyError, f, d) 440 441 # example used in the docs 442 inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] 443 getcount = operator.itemgetter(1) 444 self.assertEqual(map(getcount, inventory), [3, 2, 5, 1]) 445 self.assertEqual(sorted(inventory, key=getcount), 446 [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]) 447 448 # multiple gets 449 data = map(str, range(20)) 450 self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5')) 451 self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data) 452 453 def test_methodcaller(self): 454 self.assertRaises(TypeError, operator.methodcaller) 455 class A: 456 def foo(self, *args, **kwds): 457 return args[0] + args[1] 458 def bar(self, f=42): 459 return f 460 a = A() 461 f = operator.methodcaller('foo') 462 self.assertRaises(IndexError, f, a) 463 f = operator.methodcaller('foo', 1, 2) 464 self.assertEqual(f(a), 3) 465 self.assertRaises(TypeError, f) 466 self.assertRaises(TypeError, f, a, 3) 467 self.assertRaises(TypeError, f, a, spam=3) 468 f = operator.methodcaller('bar') 469 self.assertEqual(f(a), 42) 470 self.assertRaises(TypeError, f, a, a) 471 f = operator.methodcaller('bar', f=5) 472 self.assertEqual(f(a), 5) 473 474 def test_inplace(self): 475 class C(object): 476 def __iadd__ (self, other): return "iadd" 477 def __iand__ (self, other): return "iand" 478 def __idiv__ (self, other): return "idiv" 479 def __ifloordiv__(self, other): return "ifloordiv" 480 def __ilshift__ (self, other): return "ilshift" 481 def __imod__ (self, other): return "imod" 482 def __imul__ (self, other): return "imul" 483 def __ior__ (self, other): return "ior" 484 def __ipow__ (self, other): return "ipow" 485 def __irshift__ (self, other): return "irshift" 486 def __isub__ (self, other): return "isub" 487 def __itruediv__ (self, other): return "itruediv" 488 def __ixor__ (self, other): return "ixor" 489 def __getitem__(self, other): return 5 # so that C is a sequence 490 c = C() 491 self.assertEqual(operator.iadd (c, 5), "iadd") 492 self.assertEqual(operator.iand (c, 5), "iand") 493 self.assertEqual(operator.idiv (c, 5), "idiv") 494 self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv") 495 self.assertEqual(operator.ilshift (c, 5), "ilshift") 496 self.assertEqual(operator.imod (c, 5), "imod") 497 self.assertEqual(operator.imul (c, 5), "imul") 498 self.assertEqual(operator.ior (c, 5), "ior") 499 self.assertEqual(operator.ipow (c, 5), "ipow") 500 self.assertEqual(operator.irshift (c, 5), "irshift") 501 self.assertEqual(operator.isub (c, 5), "isub") 502 self.assertEqual(operator.itruediv (c, 5), "itruediv") 503 self.assertEqual(operator.ixor (c, 5), "ixor") 504 self.assertEqual(operator.iconcat (c, c), "iadd") 505 self.assertEqual(operator.irepeat (c, 5), "imul") 506 self.assertEqual(operator.__iadd__ (c, 5), "iadd") 507 self.assertEqual(operator.__iand__ (c, 5), "iand") 508 self.assertEqual(operator.__idiv__ (c, 5), "idiv") 509 self.assertEqual(operator.__ifloordiv__(c, 5), "ifloordiv") 510 self.assertEqual(operator.__ilshift__ (c, 5), "ilshift") 511 self.assertEqual(operator.__imod__ (c, 5), "imod") 512 self.assertEqual(operator.__imul__ (c, 5), "imul") 513 self.assertEqual(operator.__ior__ (c, 5), "ior") 514 self.assertEqual(operator.__ipow__ (c, 5), "ipow") 515 self.assertEqual(operator.__irshift__ (c, 5), "irshift") 516 self.assertEqual(operator.__isub__ (c, 5), "isub") 517 self.assertEqual(operator.__itruediv__ (c, 5), "itruediv") 518 self.assertEqual(operator.__ixor__ (c, 5), "ixor") 519 self.assertEqual(operator.__iconcat__ (c, c), "iadd") 520 self.assertEqual(operator.__irepeat__ (c, 5), "imul") 521 522 def test_main(verbose=None): 523 import sys 524 test_classes = ( 525 OperatorTestCase, 526 ) 527 528 test_support.run_unittest(*test_classes) 529 530 # verify reference counting 531 if verbose and hasattr(sys, "gettotalrefcount"): 532 import gc 533 counts = [None] * 5 534 for i in xrange(len(counts)): 535 test_support.run_unittest(*test_classes) 536 gc.collect() 537 counts[i] = sys.gettotalrefcount() 538 print counts 539 540 if __name__ == "__main__": 541 test_main(verbose=True) 542