1import __builtin__ 2import gc 3import sys 4import types 5import unittest 6import weakref 7 8from copy import deepcopy 9from test import test_support 10 11 12class OperatorsTest(unittest.TestCase): 13 14 def __init__(self, *args, **kwargs): 15 unittest.TestCase.__init__(self, *args, **kwargs) 16 self.binops = { 17 'add': '+', 18 'sub': '-', 19 'mul': '*', 20 'div': '/', 21 'divmod': 'divmod', 22 'pow': '**', 23 'lshift': '<<', 24 'rshift': '>>', 25 'and': '&', 26 'xor': '^', 27 'or': '|', 28 'cmp': 'cmp', 29 'lt': '<', 30 'le': '<=', 31 'eq': '==', 32 'ne': '!=', 33 'gt': '>', 34 'ge': '>=', 35 } 36 37 for name, expr in self.binops.items(): 38 if expr.islower(): 39 expr = expr + "(a, b)" 40 else: 41 expr = 'a %s b' % expr 42 self.binops[name] = expr 43 44 self.unops = { 45 'pos': '+', 46 'neg': '-', 47 'abs': 'abs', 48 'invert': '~', 49 'int': 'int', 50 'long': 'long', 51 'float': 'float', 52 'oct': 'oct', 53 'hex': 'hex', 54 } 55 56 for name, expr in self.unops.items(): 57 if expr.islower(): 58 expr = expr + "(a)" 59 else: 60 expr = '%s a' % expr 61 self.unops[name] = expr 62 63 def unop_test(self, a, res, expr="len(a)", meth="__len__"): 64 d = {'a': a} 65 self.assertEqual(eval(expr, d), res) 66 t = type(a) 67 m = getattr(t, meth) 68 69 # Find method in parent class 70 while meth not in t.__dict__: 71 t = t.__bases__[0] 72 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 73 # method object; the getattr() below obtains its underlying function. 74 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 75 self.assertEqual(m(a), res) 76 bm = getattr(a, meth) 77 self.assertEqual(bm(), res) 78 79 def binop_test(self, a, b, res, expr="a+b", meth="__add__"): 80 d = {'a': a, 'b': b} 81 82 # XXX Hack so this passes before 2.3 when -Qnew is specified. 83 if meth == "__div__" and 1/2 == 0.5: 84 meth = "__truediv__" 85 86 if meth == '__divmod__': pass 87 88 self.assertEqual(eval(expr, d), res) 89 t = type(a) 90 m = getattr(t, meth) 91 while meth not in t.__dict__: 92 t = t.__bases__[0] 93 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 94 # method object; the getattr() below obtains its underlying function. 95 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 96 self.assertEqual(m(a, b), res) 97 bm = getattr(a, meth) 98 self.assertEqual(bm(b), res) 99 100 def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"): 101 d = {'a': a, 'b': b, 'c': c} 102 self.assertEqual(eval(expr, d), res) 103 t = type(a) 104 m = getattr(t, meth) 105 while meth not in t.__dict__: 106 t = t.__bases__[0] 107 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 108 # method object; the getattr() below obtains its underlying function. 109 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 110 self.assertEqual(m(a, b, c), res) 111 bm = getattr(a, meth) 112 self.assertEqual(bm(b, c), res) 113 114 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"): 115 d = {'a': deepcopy(a), 'b': b} 116 exec stmt in d 117 self.assertEqual(d['a'], res) 118 t = type(a) 119 m = getattr(t, meth) 120 while meth not in t.__dict__: 121 t = t.__bases__[0] 122 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 123 # method object; the getattr() below obtains its underlying function. 124 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 125 d['a'] = deepcopy(a) 126 m(d['a'], b) 127 self.assertEqual(d['a'], res) 128 d['a'] = deepcopy(a) 129 bm = getattr(d['a'], meth) 130 bm(b) 131 self.assertEqual(d['a'], res) 132 133 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"): 134 d = {'a': deepcopy(a), 'b': b, 'c': c} 135 exec stmt in d 136 self.assertEqual(d['a'], res) 137 t = type(a) 138 m = getattr(t, meth) 139 while meth not in t.__dict__: 140 t = t.__bases__[0] 141 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 142 # method object; the getattr() below obtains its underlying function. 143 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 144 d['a'] = deepcopy(a) 145 m(d['a'], b, c) 146 self.assertEqual(d['a'], res) 147 d['a'] = deepcopy(a) 148 bm = getattr(d['a'], meth) 149 bm(b, c) 150 self.assertEqual(d['a'], res) 151 152 def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"): 153 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d} 154 exec stmt in dictionary 155 self.assertEqual(dictionary['a'], res) 156 t = type(a) 157 while meth not in t.__dict__: 158 t = t.__bases__[0] 159 m = getattr(t, meth) 160 # in some implementations (e.g. PyPy), 'm' can be a regular unbound 161 # method object; the getattr() below obtains its underlying function. 162 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 163 dictionary['a'] = deepcopy(a) 164 m(dictionary['a'], b, c, d) 165 self.assertEqual(dictionary['a'], res) 166 dictionary['a'] = deepcopy(a) 167 bm = getattr(dictionary['a'], meth) 168 bm(b, c, d) 169 self.assertEqual(dictionary['a'], res) 170 171 def test_lists(self): 172 # Testing list operations... 173 # Asserts are within individual test methods 174 self.binop_test([1], [2], [1,2], "a+b", "__add__") 175 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__") 176 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__") 177 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__") 178 self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__") 179 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__") 180 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__") 181 self.unop_test([1,2,3], 3, "len(a)", "__len__") 182 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__") 183 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__") 184 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__") 185 self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", 186 "__setslice__") 187 188 def test_dicts(self): 189 # Testing dict operations... 190 if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts 191 self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__") 192 else: 193 self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__") 194 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__") 195 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__") 196 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__") 197 198 d = {1:2, 3:4} 199 l1 = [] 200 for i in d.keys(): 201 l1.append(i) 202 l = [] 203 for i in iter(d): 204 l.append(i) 205 self.assertEqual(l, l1) 206 l = [] 207 for i in d.__iter__(): 208 l.append(i) 209 self.assertEqual(l, l1) 210 l = [] 211 for i in dict.__iter__(d): 212 l.append(i) 213 self.assertEqual(l, l1) 214 d = {1:2, 3:4} 215 self.unop_test(d, 2, "len(a)", "__len__") 216 self.assertEqual(eval(repr(d), {}), d) 217 self.assertEqual(eval(d.__repr__(), {}), d) 218 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", 219 "__setitem__") 220 221 # Tests for unary and binary operators 222 def number_operators(self, a, b, skip=[]): 223 dict = {'a': a, 'b': b} 224 225 for name, expr in self.binops.items(): 226 if name not in skip: 227 name = "__%s__" % name 228 if hasattr(a, name): 229 res = eval(expr, dict) 230 self.binop_test(a, b, res, expr, name) 231 232 for name, expr in self.unops.items(): 233 if name not in skip: 234 name = "__%s__" % name 235 if hasattr(a, name): 236 res = eval(expr, dict) 237 self.unop_test(a, res, expr, name) 238 239 def test_ints(self): 240 # Testing int operations... 241 self.number_operators(100, 3) 242 # The following crashes in Python 2.2 243 self.assertEqual((1).__nonzero__(), 1) 244 self.assertEqual((0).__nonzero__(), 0) 245 # This returns 'NotImplemented' in Python 2.2 246 class C(int): 247 def __add__(self, other): 248 return NotImplemented 249 self.assertEqual(C(5L), 5) 250 try: 251 C() + "" 252 except TypeError: 253 pass 254 else: 255 self.fail("NotImplemented should have caused TypeError") 256 try: 257 C(sys.maxint+1) 258 except OverflowError: 259 pass 260 else: 261 self.fail("should have raised OverflowError") 262 263 def test_longs(self): 264 # Testing long operations... 265 self.number_operators(100L, 3L) 266 267 def test_floats(self): 268 # Testing float operations... 269 self.number_operators(100.0, 3.0) 270 271 def test_complexes(self): 272 # Testing complex operations... 273 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 274 'int', 'long', 'float']) 275 276 class Number(complex): 277 __slots__ = ['prec'] 278 def __new__(cls, *args, **kwds): 279 result = complex.__new__(cls, *args) 280 result.prec = kwds.get('prec', 12) 281 return result 282 def __repr__(self): 283 prec = self.prec 284 if self.imag == 0.0: 285 return "%.*g" % (prec, self.real) 286 if self.real == 0.0: 287 return "%.*gj" % (prec, self.imag) 288 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) 289 __str__ = __repr__ 290 291 a = Number(3.14, prec=6) 292 self.assertEqual(repr(a), "3.14") 293 self.assertEqual(a.prec, 6) 294 295 a = Number(a, prec=2) 296 self.assertEqual(repr(a), "3.1") 297 self.assertEqual(a.prec, 2) 298 299 a = Number(234.5) 300 self.assertEqual(repr(a), "234.5") 301 self.assertEqual(a.prec, 12) 302 303 @test_support.impl_detail("the module 'xxsubtype' is internal") 304 def test_spam_lists(self): 305 # Testing spamlist operations... 306 import copy, xxsubtype as spam 307 308 def spamlist(l, memo=None): 309 import xxsubtype as spam 310 return spam.spamlist(l) 311 312 # This is an ugly hack: 313 copy._deepcopy_dispatch[spam.spamlist] = spamlist 314 315 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", 316 "__add__") 317 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__") 318 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__") 319 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__") 320 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]", 321 "__getslice__") 322 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b", 323 "__iadd__") 324 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", 325 "__imul__") 326 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__") 327 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", 328 "__mul__") 329 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", 330 "__rmul__") 331 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", 332 "__setitem__") 333 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]), 334 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__") 335 # Test subclassing 336 class C(spam.spamlist): 337 def foo(self): return 1 338 a = C() 339 self.assertEqual(a, []) 340 self.assertEqual(a.foo(), 1) 341 a.append(100) 342 self.assertEqual(a, [100]) 343 self.assertEqual(a.getstate(), 0) 344 a.setstate(42) 345 self.assertEqual(a.getstate(), 42) 346 347 @test_support.impl_detail("the module 'xxsubtype' is internal") 348 def test_spam_dicts(self): 349 # Testing spamdict operations... 350 import copy, xxsubtype as spam 351 def spamdict(d, memo=None): 352 import xxsubtype as spam 353 sd = spam.spamdict() 354 for k, v in d.items(): 355 sd[k] = v 356 return sd 357 # This is an ugly hack: 358 copy._deepcopy_dispatch[spam.spamdict] = spamdict 359 360 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", 361 "__cmp__") 362 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__") 363 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__") 364 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__") 365 d = spamdict({1:2,3:4}) 366 l1 = [] 367 for i in d.keys(): 368 l1.append(i) 369 l = [] 370 for i in iter(d): 371 l.append(i) 372 self.assertEqual(l, l1) 373 l = [] 374 for i in d.__iter__(): 375 l.append(i) 376 self.assertEqual(l, l1) 377 l = [] 378 for i in type(spamdict({})).__iter__(d): 379 l.append(i) 380 self.assertEqual(l, l1) 381 straightd = {1:2, 3:4} 382 spamd = spamdict(straightd) 383 self.unop_test(spamd, 2, "len(a)", "__len__") 384 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__") 385 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}), 386 "a[b]=c", "__setitem__") 387 # Test subclassing 388 class C(spam.spamdict): 389 def foo(self): return 1 390 a = C() 391 self.assertEqual(a.items(), []) 392 self.assertEqual(a.foo(), 1) 393 a['foo'] = 'bar' 394 self.assertEqual(a.items(), [('foo', 'bar')]) 395 self.assertEqual(a.getstate(), 0) 396 a.setstate(100) 397 self.assertEqual(a.getstate(), 100) 398 399class ClassPropertiesAndMethods(unittest.TestCase): 400 401 def assertHasAttr(self, obj, name): 402 self.assertTrue(hasattr(obj, name), 403 '%r has no attribute %r' % (obj, name)) 404 405 def assertNotHasAttr(self, obj, name): 406 self.assertFalse(hasattr(obj, name), 407 '%r has unexpected attribute %r' % (obj, name)) 408 409 def test_python_dicts(self): 410 # Testing Python subclass of dict... 411 self.assertTrue(issubclass(dict, dict)) 412 self.assertIsInstance({}, dict) 413 d = dict() 414 self.assertEqual(d, {}) 415 self.assertIs(d.__class__, dict) 416 self.assertIsInstance(d, dict) 417 class C(dict): 418 state = -1 419 def __init__(self_local, *a, **kw): 420 if a: 421 self.assertEqual(len(a), 1) 422 self_local.state = a[0] 423 if kw: 424 for k, v in kw.items(): 425 self_local[v] = k 426 def __getitem__(self, key): 427 return self.get(key, 0) 428 def __setitem__(self_local, key, value): 429 self.assertIsInstance(key, type(0)) 430 dict.__setitem__(self_local, key, value) 431 def setstate(self, state): 432 self.state = state 433 def getstate(self): 434 return self.state 435 self.assertTrue(issubclass(C, dict)) 436 a1 = C(12) 437 self.assertEqual(a1.state, 12) 438 a2 = C(foo=1, bar=2) 439 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar') 440 a = C() 441 self.assertEqual(a.state, -1) 442 self.assertEqual(a.getstate(), -1) 443 a.setstate(0) 444 self.assertEqual(a.state, 0) 445 self.assertEqual(a.getstate(), 0) 446 a.setstate(10) 447 self.assertEqual(a.state, 10) 448 self.assertEqual(a.getstate(), 10) 449 self.assertEqual(a[42], 0) 450 a[42] = 24 451 self.assertEqual(a[42], 24) 452 N = 50 453 for i in range(N): 454 a[i] = C() 455 for j in range(N): 456 a[i][j] = i*j 457 for i in range(N): 458 for j in range(N): 459 self.assertEqual(a[i][j], i*j) 460 461 def test_python_lists(self): 462 # Testing Python subclass of list... 463 class C(list): 464 def __getitem__(self, i): 465 return list.__getitem__(self, i) + 100 466 def __getslice__(self, i, j): 467 return (i, j) 468 a = C() 469 a.extend([0,1,2]) 470 self.assertEqual(a[0], 100) 471 self.assertEqual(a[1], 101) 472 self.assertEqual(a[2], 102) 473 self.assertEqual(a[100:200], (100,200)) 474 475 def test_metaclass(self): 476 # Testing __metaclass__... 477 class C: 478 __metaclass__ = type 479 def __init__(self): 480 self.__state = 0 481 def getstate(self): 482 return self.__state 483 def setstate(self, state): 484 self.__state = state 485 a = C() 486 self.assertEqual(a.getstate(), 0) 487 a.setstate(10) 488 self.assertEqual(a.getstate(), 10) 489 class D: 490 class __metaclass__(type): 491 def myself(cls): return cls 492 self.assertEqual(D.myself(), D) 493 d = D() 494 self.assertEqual(d.__class__, D) 495 class M1(type): 496 def __new__(cls, name, bases, dict): 497 dict['__spam__'] = 1 498 return type.__new__(cls, name, bases, dict) 499 class C: 500 __metaclass__ = M1 501 self.assertEqual(C.__spam__, 1) 502 c = C() 503 self.assertEqual(c.__spam__, 1) 504 505 class _instance(object): 506 pass 507 class M2(object): 508 @staticmethod 509 def __new__(cls, name, bases, dict): 510 self = object.__new__(cls) 511 self.name = name 512 self.bases = bases 513 self.dict = dict 514 return self 515 def __call__(self): 516 it = _instance() 517 # Early binding of methods 518 for key in self.dict: 519 if key.startswith("__"): 520 continue 521 setattr(it, key, self.dict[key].__get__(it, self)) 522 return it 523 class C: 524 __metaclass__ = M2 525 def spam(self): 526 return 42 527 self.assertEqual(C.name, 'C') 528 self.assertEqual(C.bases, ()) 529 self.assertIn('spam', C.dict) 530 c = C() 531 self.assertEqual(c.spam(), 42) 532 533 # More metaclass examples 534 535 class autosuper(type): 536 # Automatically add __super to the class 537 # This trick only works for dynamic classes 538 def __new__(metaclass, name, bases, dict): 539 cls = super(autosuper, metaclass).__new__(metaclass, 540 name, bases, dict) 541 # Name mangling for __super removes leading underscores 542 while name[:1] == "_": 543 name = name[1:] 544 if name: 545 name = "_%s__super" % name 546 else: 547 name = "__super" 548 setattr(cls, name, super(cls)) 549 return cls 550 class A: 551 __metaclass__ = autosuper 552 def meth(self): 553 return "A" 554 class B(A): 555 def meth(self): 556 return "B" + self.__super.meth() 557 class C(A): 558 def meth(self): 559 return "C" + self.__super.meth() 560 class D(C, B): 561 def meth(self): 562 return "D" + self.__super.meth() 563 self.assertEqual(D().meth(), "DCBA") 564 class E(B, C): 565 def meth(self): 566 return "E" + self.__super.meth() 567 self.assertEqual(E().meth(), "EBCA") 568 569 class autoproperty(type): 570 # Automatically create property attributes when methods 571 # named _get_x and/or _set_x are found 572 def __new__(metaclass, name, bases, dict): 573 hits = {} 574 for key, val in dict.iteritems(): 575 if key.startswith("_get_"): 576 key = key[5:] 577 get, set = hits.get(key, (None, None)) 578 get = val 579 hits[key] = get, set 580 elif key.startswith("_set_"): 581 key = key[5:] 582 get, set = hits.get(key, (None, None)) 583 set = val 584 hits[key] = get, set 585 for key, (get, set) in hits.iteritems(): 586 dict[key] = property(get, set) 587 return super(autoproperty, metaclass).__new__(metaclass, 588 name, bases, dict) 589 class A: 590 __metaclass__ = autoproperty 591 def _get_x(self): 592 return -self.__x 593 def _set_x(self, x): 594 self.__x = -x 595 a = A() 596 self.assertNotHasAttr(a, "x") 597 a.x = 12 598 self.assertEqual(a.x, 12) 599 self.assertEqual(a._A__x, -12) 600 601 class multimetaclass(autoproperty, autosuper): 602 # Merge of multiple cooperating metaclasses 603 pass 604 class A: 605 __metaclass__ = multimetaclass 606 def _get_x(self): 607 return "A" 608 class B(A): 609 def _get_x(self): 610 return "B" + self.__super._get_x() 611 class C(A): 612 def _get_x(self): 613 return "C" + self.__super._get_x() 614 class D(C, B): 615 def _get_x(self): 616 return "D" + self.__super._get_x() 617 self.assertEqual(D().x, "DCBA") 618 619 # Make sure type(x) doesn't call x.__class__.__init__ 620 class T(type): 621 counter = 0 622 def __init__(self, *args): 623 T.counter += 1 624 class C: 625 __metaclass__ = T 626 self.assertEqual(T.counter, 1) 627 a = C() 628 self.assertEqual(type(a), C) 629 self.assertEqual(T.counter, 1) 630 631 class C(object): pass 632 c = C() 633 try: c() 634 except TypeError: pass 635 else: self.fail("calling object w/o call method should raise " 636 "TypeError") 637 638 # Testing code to find most derived baseclass 639 class A(type): 640 def __new__(*args, **kwargs): 641 return type.__new__(*args, **kwargs) 642 643 class B(object): 644 pass 645 646 class C(object): 647 __metaclass__ = A 648 649 # The most derived metaclass of D is A rather than type. 650 class D(B, C): 651 pass 652 653 def test_module_subclasses(self): 654 # Testing Python subclass of module... 655 log = [] 656 MT = type(sys) 657 class MM(MT): 658 def __init__(self, name): 659 MT.__init__(self, name) 660 def __getattribute__(self, name): 661 log.append(("getattr", name)) 662 return MT.__getattribute__(self, name) 663 def __setattr__(self, name, value): 664 log.append(("setattr", name, value)) 665 MT.__setattr__(self, name, value) 666 def __delattr__(self, name): 667 log.append(("delattr", name)) 668 MT.__delattr__(self, name) 669 a = MM("a") 670 a.foo = 12 671 x = a.foo 672 del a.foo 673 self.assertEqual(log, [("setattr", "foo", 12), 674 ("getattr", "foo"), 675 ("delattr", "foo")]) 676 677 # http://python.org/sf/1174712 678 try: 679 class Module(types.ModuleType, str): 680 pass 681 except TypeError: 682 pass 683 else: 684 self.fail("inheriting from ModuleType and str at the same time " 685 "should fail") 686 687 def test_multiple_inheritance(self): 688 # Testing multiple inheritance... 689 class C(object): 690 def __init__(self): 691 self.__state = 0 692 def getstate(self): 693 return self.__state 694 def setstate(self, state): 695 self.__state = state 696 a = C() 697 self.assertEqual(a.getstate(), 0) 698 a.setstate(10) 699 self.assertEqual(a.getstate(), 10) 700 class D(dict, C): 701 def __init__(self): 702 type({}).__init__(self) 703 C.__init__(self) 704 d = D() 705 self.assertEqual(d.keys(), []) 706 d["hello"] = "world" 707 self.assertEqual(d.items(), [("hello", "world")]) 708 self.assertEqual(d["hello"], "world") 709 self.assertEqual(d.getstate(), 0) 710 d.setstate(10) 711 self.assertEqual(d.getstate(), 10) 712 self.assertEqual(D.__mro__, (D, dict, C, object)) 713 714 # SF bug #442833 715 class Node(object): 716 def __int__(self): 717 return int(self.foo()) 718 def foo(self): 719 return "23" 720 class Frag(Node, list): 721 def foo(self): 722 return "42" 723 self.assertEqual(Node().__int__(), 23) 724 self.assertEqual(int(Node()), 23) 725 self.assertEqual(Frag().__int__(), 42) 726 self.assertEqual(int(Frag()), 42) 727 728 # MI mixing classic and new-style classes. 729 730 class A: 731 x = 1 732 733 class B(A): 734 pass 735 736 class C(A): 737 x = 2 738 739 class D(B, C): 740 pass 741 self.assertEqual(D.x, 1) 742 743 # Classic MRO is preserved for a classic base class. 744 class E(D, object): 745 pass 746 self.assertEqual(E.__mro__, (E, D, B, A, C, object)) 747 self.assertEqual(E.x, 1) 748 749 # But with a mix of classic bases, their MROs are combined using 750 # new-style MRO. 751 class F(B, C, object): 752 pass 753 self.assertEqual(F.__mro__, (F, B, C, A, object)) 754 self.assertEqual(F.x, 2) 755 756 # Try something else. 757 class C: 758 def cmethod(self): 759 return "C a" 760 def all_method(self): 761 return "C b" 762 763 class M1(C, object): 764 def m1method(self): 765 return "M1 a" 766 def all_method(self): 767 return "M1 b" 768 769 self.assertEqual(M1.__mro__, (M1, C, object)) 770 m = M1() 771 self.assertEqual(m.cmethod(), "C a") 772 self.assertEqual(m.m1method(), "M1 a") 773 self.assertEqual(m.all_method(), "M1 b") 774 775 class D(C): 776 def dmethod(self): 777 return "D a" 778 def all_method(self): 779 return "D b" 780 781 class M2(D, object): 782 def m2method(self): 783 return "M2 a" 784 def all_method(self): 785 return "M2 b" 786 787 self.assertEqual(M2.__mro__, (M2, D, C, object)) 788 m = M2() 789 self.assertEqual(m.cmethod(), "C a") 790 self.assertEqual(m.dmethod(), "D a") 791 self.assertEqual(m.m2method(), "M2 a") 792 self.assertEqual(m.all_method(), "M2 b") 793 794 class M3(M1, M2, object): 795 def m3method(self): 796 return "M3 a" 797 def all_method(self): 798 return "M3 b" 799 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object)) 800 m = M3() 801 self.assertEqual(m.cmethod(), "C a") 802 self.assertEqual(m.dmethod(), "D a") 803 self.assertEqual(m.m1method(), "M1 a") 804 self.assertEqual(m.m2method(), "M2 a") 805 self.assertEqual(m.m3method(), "M3 a") 806 self.assertEqual(m.all_method(), "M3 b") 807 808 class Classic: 809 pass 810 try: 811 class New(Classic): 812 __metaclass__ = type 813 except TypeError: 814 pass 815 else: 816 self.fail("new class with only classic bases - shouldn't be") 817 818 def test_diamond_inheritance(self): 819 # Testing multiple inheritance special cases... 820 class A(object): 821 def spam(self): return "A" 822 self.assertEqual(A().spam(), "A") 823 class B(A): 824 def boo(self): return "B" 825 def spam(self): return "B" 826 self.assertEqual(B().spam(), "B") 827 self.assertEqual(B().boo(), "B") 828 class C(A): 829 def boo(self): return "C" 830 self.assertEqual(C().spam(), "A") 831 self.assertEqual(C().boo(), "C") 832 class D(B, C): pass 833 self.assertEqual(D().spam(), "B") 834 self.assertEqual(D().boo(), "B") 835 self.assertEqual(D.__mro__, (D, B, C, A, object)) 836 class E(C, B): pass 837 self.assertEqual(E().spam(), "B") 838 self.assertEqual(E().boo(), "C") 839 self.assertEqual(E.__mro__, (E, C, B, A, object)) 840 # MRO order disagreement 841 try: 842 class F(D, E): pass 843 except TypeError: 844 pass 845 else: 846 self.fail("expected MRO order disagreement (F)") 847 try: 848 class G(E, D): pass 849 except TypeError: 850 pass 851 else: 852 self.fail("expected MRO order disagreement (G)") 853 854 # see thread python-dev/2002-October/029035.html 855 def test_ex5_from_c3_switch(self): 856 # Testing ex5 from C3 switch discussion... 857 class A(object): pass 858 class B(object): pass 859 class C(object): pass 860 class X(A): pass 861 class Y(A): pass 862 class Z(X,B,Y,C): pass 863 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object)) 864 865 # see "A Monotonic Superclass Linearization for Dylan", 866 # by Kim Barrett et al. (OOPSLA 1996) 867 def test_monotonicity(self): 868 # Testing MRO monotonicity... 869 class Boat(object): pass 870 class DayBoat(Boat): pass 871 class WheelBoat(Boat): pass 872 class EngineLess(DayBoat): pass 873 class SmallMultihull(DayBoat): pass 874 class PedalWheelBoat(EngineLess,WheelBoat): pass 875 class SmallCatamaran(SmallMultihull): pass 876 class Pedalo(PedalWheelBoat,SmallCatamaran): pass 877 878 self.assertEqual(PedalWheelBoat.__mro__, 879 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object)) 880 self.assertEqual(SmallCatamaran.__mro__, 881 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object)) 882 self.assertEqual(Pedalo.__mro__, 883 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran, 884 SmallMultihull, DayBoat, WheelBoat, Boat, object)) 885 886 # see "A Monotonic Superclass Linearization for Dylan", 887 # by Kim Barrett et al. (OOPSLA 1996) 888 def test_consistency_with_epg(self): 889 # Testing consistency with EPG... 890 class Pane(object): pass 891 class ScrollingMixin(object): pass 892 class EditingMixin(object): pass 893 class ScrollablePane(Pane,ScrollingMixin): pass 894 class EditablePane(Pane,EditingMixin): pass 895 class EditableScrollablePane(ScrollablePane,EditablePane): pass 896 897 self.assertEqual(EditableScrollablePane.__mro__, 898 (EditableScrollablePane, ScrollablePane, EditablePane, Pane, 899 ScrollingMixin, EditingMixin, object)) 900 901 def test_mro_disagreement(self): 902 # Testing error messages for MRO disagreement... 903 mro_err_msg = """Cannot create a consistent method resolution 904order (MRO) for bases """ 905 906 def raises(exc, expected, callable, *args): 907 try: 908 callable(*args) 909 except exc, msg: 910 # the exact msg is generally considered an impl detail 911 if test_support.check_impl_detail(): 912 if not str(msg).startswith(expected): 913 self.fail("Message %r, expected %r" % 914 (str(msg), expected)) 915 else: 916 self.fail("Expected %s" % exc) 917 918 class A(object): pass 919 class B(A): pass 920 class C(object): pass 921 922 # Test some very simple errors 923 raises(TypeError, "duplicate base class A", 924 type, "X", (A, A), {}) 925 raises(TypeError, mro_err_msg, 926 type, "X", (A, B), {}) 927 raises(TypeError, mro_err_msg, 928 type, "X", (A, C, B), {}) 929 # Test a slightly more complex error 930 class GridLayout(object): pass 931 class HorizontalGrid(GridLayout): pass 932 class VerticalGrid(GridLayout): pass 933 class HVGrid(HorizontalGrid, VerticalGrid): pass 934 class VHGrid(VerticalGrid, HorizontalGrid): pass 935 raises(TypeError, mro_err_msg, 936 type, "ConfusedGrid", (HVGrid, VHGrid), {}) 937 938 def test_object_class(self): 939 # Testing object class... 940 a = object() 941 self.assertEqual(a.__class__, object) 942 self.assertEqual(type(a), object) 943 b = object() 944 self.assertNotEqual(a, b) 945 self.assertNotHasAttr(a, "foo") 946 try: 947 a.foo = 12 948 except (AttributeError, TypeError): 949 pass 950 else: 951 self.fail("object() should not allow setting a foo attribute") 952 self.assertNotHasAttr(object(), "__dict__") 953 954 class Cdict(object): 955 pass 956 x = Cdict() 957 self.assertEqual(x.__dict__, {}) 958 x.foo = 1 959 self.assertEqual(x.foo, 1) 960 self.assertEqual(x.__dict__, {'foo': 1}) 961 962 def test_slots(self): 963 # Testing __slots__... 964 class C0(object): 965 __slots__ = [] 966 x = C0() 967 self.assertNotHasAttr(x, "__dict__") 968 self.assertNotHasAttr(x, "foo") 969 970 class C1(object): 971 __slots__ = ['a'] 972 x = C1() 973 self.assertNotHasAttr(x, "__dict__") 974 self.assertNotHasAttr(x, "a") 975 x.a = 1 976 self.assertEqual(x.a, 1) 977 x.a = None 978 self.assertEqual(x.a, None) 979 del x.a 980 self.assertNotHasAttr(x, "a") 981 982 class C3(object): 983 __slots__ = ['a', 'b', 'c'] 984 x = C3() 985 self.assertNotHasAttr(x, "__dict__") 986 self.assertNotHasAttr(x, 'a') 987 self.assertNotHasAttr(x, 'b') 988 self.assertNotHasAttr(x, 'c') 989 x.a = 1 990 x.b = 2 991 x.c = 3 992 self.assertEqual(x.a, 1) 993 self.assertEqual(x.b, 2) 994 self.assertEqual(x.c, 3) 995 996 class C4(object): 997 """Validate name mangling""" 998 __slots__ = ['__a'] 999 def __init__(self, value): 1000 self.__a = value 1001 def get(self): 1002 return self.__a 1003 x = C4(5) 1004 self.assertNotHasAttr(x, '__dict__') 1005 self.assertNotHasAttr(x, '__a') 1006 self.assertEqual(x.get(), 5) 1007 try: 1008 x.__a = 6 1009 except AttributeError: 1010 pass 1011 else: 1012 self.fail("Double underscored names not mangled") 1013 1014 # Make sure slot names are proper identifiers 1015 try: 1016 class C(object): 1017 __slots__ = [None] 1018 except TypeError: 1019 pass 1020 else: 1021 self.fail("[None] slots not caught") 1022 try: 1023 class C(object): 1024 __slots__ = ["foo bar"] 1025 except TypeError: 1026 pass 1027 else: 1028 self.fail("['foo bar'] slots not caught") 1029 try: 1030 class C(object): 1031 __slots__ = ["foo\0bar"] 1032 except TypeError: 1033 pass 1034 else: 1035 self.fail("['foo\\0bar'] slots not caught") 1036 try: 1037 class C(object): 1038 __slots__ = ["1"] 1039 except TypeError: 1040 pass 1041 else: 1042 self.fail("['1'] slots not caught") 1043 try: 1044 class C(object): 1045 __slots__ = [""] 1046 except TypeError: 1047 pass 1048 else: 1049 self.fail("[''] slots not caught") 1050 class C(object): 1051 __slots__ = ["a", "a_b", "_a", "A0123456789Z"] 1052 # XXX(nnorwitz): was there supposed to be something tested 1053 # from the class above? 1054 1055 # Test a single string is not expanded as a sequence. 1056 class C(object): 1057 __slots__ = "abc" 1058 c = C() 1059 c.abc = 5 1060 self.assertEqual(c.abc, 5) 1061 1062 def test_unicode_slots(self): 1063 # Test unicode slot names 1064 try: 1065 unicode 1066 except NameError: 1067 self.skipTest('no unicode support') 1068 else: 1069 # Test a single unicode string is not expanded as a sequence. 1070 class C(object): 1071 __slots__ = unicode("abc") 1072 c = C() 1073 c.abc = 5 1074 self.assertEqual(c.abc, 5) 1075 1076 # _unicode_to_string used to modify slots in certain circumstances 1077 slots = (unicode("foo"), unicode("bar")) 1078 class C(object): 1079 __slots__ = slots 1080 x = C() 1081 x.foo = 5 1082 self.assertEqual(x.foo, 5) 1083 self.assertEqual(type(slots[0]), unicode) 1084 # this used to leak references 1085 try: 1086 class C(object): 1087 __slots__ = [unichr(128)] 1088 except (TypeError, UnicodeEncodeError): 1089 pass 1090 else: 1091 self.fail("[unichr(128)] slots not caught") 1092 1093 # Test leaks 1094 class Counted(object): 1095 counter = 0 # counts the number of instances alive 1096 def __init__(self): 1097 Counted.counter += 1 1098 def __del__(self): 1099 Counted.counter -= 1 1100 class C(object): 1101 __slots__ = ['a', 'b', 'c'] 1102 x = C() 1103 x.a = Counted() 1104 x.b = Counted() 1105 x.c = Counted() 1106 self.assertEqual(Counted.counter, 3) 1107 del x 1108 test_support.gc_collect() 1109 self.assertEqual(Counted.counter, 0) 1110 class D(C): 1111 pass 1112 x = D() 1113 x.a = Counted() 1114 x.z = Counted() 1115 self.assertEqual(Counted.counter, 2) 1116 del x 1117 test_support.gc_collect() 1118 self.assertEqual(Counted.counter, 0) 1119 class E(D): 1120 __slots__ = ['e'] 1121 x = E() 1122 x.a = Counted() 1123 x.z = Counted() 1124 x.e = Counted() 1125 self.assertEqual(Counted.counter, 3) 1126 del x 1127 test_support.gc_collect() 1128 self.assertEqual(Counted.counter, 0) 1129 1130 # Test cyclical leaks [SF bug 519621] 1131 class F(object): 1132 __slots__ = ['a', 'b'] 1133 s = F() 1134 s.a = [Counted(), s] 1135 self.assertEqual(Counted.counter, 1) 1136 s = None 1137 test_support.gc_collect() 1138 self.assertEqual(Counted.counter, 0) 1139 1140 # Test lookup leaks [SF bug 572567] 1141 if hasattr(gc, 'get_objects'): 1142 class G(object): 1143 def __cmp__(self, other): 1144 return 0 1145 __hash__ = None # Silence Py3k warning 1146 g = G() 1147 orig_objects = len(gc.get_objects()) 1148 for i in xrange(10): 1149 g==g 1150 new_objects = len(gc.get_objects()) 1151 self.assertEqual(orig_objects, new_objects) 1152 1153 class H(object): 1154 __slots__ = ['a', 'b'] 1155 def __init__(self): 1156 self.a = 1 1157 self.b = 2 1158 def __del__(self_): 1159 self.assertEqual(self_.a, 1) 1160 self.assertEqual(self_.b, 2) 1161 with test_support.captured_output('stderr') as s: 1162 h = H() 1163 del h 1164 self.assertEqual(s.getvalue(), '') 1165 1166 class X(object): 1167 __slots__ = "a" 1168 with self.assertRaises(AttributeError): 1169 del X().a 1170 1171 def test_slots_special(self): 1172 # Testing __dict__ and __weakref__ in __slots__... 1173 class D(object): 1174 __slots__ = ["__dict__"] 1175 a = D() 1176 self.assertHasAttr(a, "__dict__") 1177 self.assertNotHasAttr(a, "__weakref__") 1178 a.foo = 42 1179 self.assertEqual(a.__dict__, {"foo": 42}) 1180 1181 class W(object): 1182 __slots__ = ["__weakref__"] 1183 a = W() 1184 self.assertHasAttr(a, "__weakref__") 1185 self.assertNotHasAttr(a, "__dict__") 1186 try: 1187 a.foo = 42 1188 except AttributeError: 1189 pass 1190 else: 1191 self.fail("shouldn't be allowed to set a.foo") 1192 1193 class C1(W, D): 1194 __slots__ = [] 1195 a = C1() 1196 self.assertHasAttr(a, "__dict__") 1197 self.assertHasAttr(a, "__weakref__") 1198 a.foo = 42 1199 self.assertEqual(a.__dict__, {"foo": 42}) 1200 1201 class C2(D, W): 1202 __slots__ = [] 1203 a = C2() 1204 self.assertHasAttr(a, "__dict__") 1205 self.assertHasAttr(a, "__weakref__") 1206 a.foo = 42 1207 self.assertEqual(a.__dict__, {"foo": 42}) 1208 1209 def test_slots_descriptor(self): 1210 # Issue2115: slot descriptors did not correctly check 1211 # the type of the given object 1212 import abc 1213 class MyABC: 1214 __metaclass__ = abc.ABCMeta 1215 __slots__ = "a" 1216 1217 class Unrelated(object): 1218 pass 1219 MyABC.register(Unrelated) 1220 1221 u = Unrelated() 1222 self.assertIsInstance(u, MyABC) 1223 1224 # This used to crash 1225 self.assertRaises(TypeError, MyABC.a.__set__, u, 3) 1226 1227 def test_metaclass_cmp(self): 1228 # See bug 7491. 1229 class M(type): 1230 def __cmp__(self, other): 1231 return -1 1232 class X(object): 1233 __metaclass__ = M 1234 self.assertTrue(X < M) 1235 1236 def test_dynamics(self): 1237 # Testing class attribute propagation... 1238 class D(object): 1239 pass 1240 class E(D): 1241 pass 1242 class F(D): 1243 pass 1244 D.foo = 1 1245 self.assertEqual(D.foo, 1) 1246 # Test that dynamic attributes are inherited 1247 self.assertEqual(E.foo, 1) 1248 self.assertEqual(F.foo, 1) 1249 # Test dynamic instances 1250 class C(object): 1251 pass 1252 a = C() 1253 self.assertNotHasAttr(a, "foobar") 1254 C.foobar = 2 1255 self.assertEqual(a.foobar, 2) 1256 C.method = lambda self: 42 1257 self.assertEqual(a.method(), 42) 1258 C.__repr__ = lambda self: "C()" 1259 self.assertEqual(repr(a), "C()") 1260 C.__int__ = lambda self: 100 1261 self.assertEqual(int(a), 100) 1262 self.assertEqual(a.foobar, 2) 1263 self.assertNotHasAttr(a, "spam") 1264 def mygetattr(self, name): 1265 if name == "spam": 1266 return "spam" 1267 raise AttributeError 1268 C.__getattr__ = mygetattr 1269 self.assertEqual(a.spam, "spam") 1270 a.new = 12 1271 self.assertEqual(a.new, 12) 1272 def mysetattr(self, name, value): 1273 if name == "spam": 1274 raise AttributeError 1275 return object.__setattr__(self, name, value) 1276 C.__setattr__ = mysetattr 1277 try: 1278 a.spam = "not spam" 1279 except AttributeError: 1280 pass 1281 else: 1282 self.fail("expected AttributeError") 1283 self.assertEqual(a.spam, "spam") 1284 class D(C): 1285 pass 1286 d = D() 1287 d.foo = 1 1288 self.assertEqual(d.foo, 1) 1289 1290 # Test handling of int*seq and seq*int 1291 class I(int): 1292 pass 1293 self.assertEqual("a"*I(2), "aa") 1294 self.assertEqual(I(2)*"a", "aa") 1295 self.assertEqual(2*I(3), 6) 1296 self.assertEqual(I(3)*2, 6) 1297 self.assertEqual(I(3)*I(2), 6) 1298 1299 # Test handling of long*seq and seq*long 1300 class L(long): 1301 pass 1302 self.assertEqual("a"*L(2L), "aa") 1303 self.assertEqual(L(2L)*"a", "aa") 1304 self.assertEqual(2*L(3), 6) 1305 self.assertEqual(L(3)*2, 6) 1306 self.assertEqual(L(3)*L(2), 6) 1307 1308 # Test comparison of classes with dynamic metaclasses 1309 class dynamicmetaclass(type): 1310 pass 1311 class someclass: 1312 __metaclass__ = dynamicmetaclass 1313 self.assertNotEqual(someclass, object) 1314 1315 def test_errors(self): 1316 # Testing errors... 1317 try: 1318 class C(list, dict): 1319 pass 1320 except TypeError: 1321 pass 1322 else: 1323 self.fail("inheritance from both list and dict should be illegal") 1324 1325 try: 1326 class C(object, None): 1327 pass 1328 except TypeError: 1329 pass 1330 else: 1331 self.fail("inheritance from non-type should be illegal") 1332 class Classic: 1333 pass 1334 1335 try: 1336 class C(type(len)): 1337 pass 1338 except TypeError: 1339 pass 1340 else: 1341 self.fail("inheritance from CFunction should be illegal") 1342 1343 try: 1344 class C(object): 1345 __slots__ = 1 1346 except TypeError: 1347 pass 1348 else: 1349 self.fail("__slots__ = 1 should be illegal") 1350 1351 try: 1352 class C(object): 1353 __slots__ = [1] 1354 except TypeError: 1355 pass 1356 else: 1357 self.fail("__slots__ = [1] should be illegal") 1358 1359 class M1(type): 1360 pass 1361 class M2(type): 1362 pass 1363 class A1(object): 1364 __metaclass__ = M1 1365 class A2(object): 1366 __metaclass__ = M2 1367 try: 1368 class B(A1, A2): 1369 pass 1370 except TypeError: 1371 pass 1372 else: 1373 self.fail("finding the most derived metaclass should have failed") 1374 1375 def test_classmethods(self): 1376 # Testing class methods... 1377 class C(object): 1378 def foo(*a): return a 1379 goo = classmethod(foo) 1380 c = C() 1381 self.assertEqual(C.goo(1), (C, 1)) 1382 self.assertEqual(c.goo(1), (C, 1)) 1383 self.assertEqual(c.foo(1), (c, 1)) 1384 class D(C): 1385 pass 1386 d = D() 1387 self.assertEqual(D.goo(1), (D, 1)) 1388 self.assertEqual(d.goo(1), (D, 1)) 1389 self.assertEqual(d.foo(1), (d, 1)) 1390 self.assertEqual(D.foo(d, 1), (d, 1)) 1391 # Test for a specific crash (SF bug 528132) 1392 def f(cls, arg): return (cls, arg) 1393 ff = classmethod(f) 1394 self.assertEqual(ff.__get__(0, int)(42), (int, 42)) 1395 self.assertEqual(ff.__get__(0)(42), (int, 42)) 1396 1397 # Test super() with classmethods (SF bug 535444) 1398 self.assertEqual(C.goo.im_self, C) 1399 self.assertEqual(D.goo.im_self, D) 1400 self.assertEqual(super(D,D).goo.im_self, D) 1401 self.assertEqual(super(D,d).goo.im_self, D) 1402 self.assertEqual(super(D,D).goo(), (D,)) 1403 self.assertEqual(super(D,d).goo(), (D,)) 1404 1405 # Verify that a non-callable will raise 1406 meth = classmethod(1).__get__(1) 1407 self.assertRaises(TypeError, meth) 1408 1409 # Verify that classmethod() doesn't allow keyword args 1410 try: 1411 classmethod(f, kw=1) 1412 except TypeError: 1413 pass 1414 else: 1415 self.fail("classmethod shouldn't accept keyword args") 1416 1417 @test_support.impl_detail("the module 'xxsubtype' is internal") 1418 def test_classmethods_in_c(self): 1419 # Testing C-based class methods... 1420 import xxsubtype as spam 1421 a = (1, 2, 3) 1422 d = {'abc': 123} 1423 x, a1, d1 = spam.spamlist.classmeth(*a, **d) 1424 self.assertEqual(x, spam.spamlist) 1425 self.assertEqual(a, a1) 1426 self.assertEqual(d, d1) 1427 x, a1, d1 = spam.spamlist().classmeth(*a, **d) 1428 self.assertEqual(x, spam.spamlist) 1429 self.assertEqual(a, a1) 1430 self.assertEqual(d, d1) 1431 spam_cm = spam.spamlist.__dict__['classmeth'] 1432 x2, a2, d2 = spam_cm(spam.spamlist, *a, **d) 1433 self.assertEqual(x2, spam.spamlist) 1434 self.assertEqual(a2, a1) 1435 self.assertEqual(d2, d1) 1436 class SubSpam(spam.spamlist): pass 1437 x2, a2, d2 = spam_cm(SubSpam, *a, **d) 1438 self.assertEqual(x2, SubSpam) 1439 self.assertEqual(a2, a1) 1440 self.assertEqual(d2, d1) 1441 with self.assertRaises(TypeError): 1442 spam_cm() 1443 with self.assertRaises(TypeError): 1444 spam_cm(spam.spamlist()) 1445 with self.assertRaises(TypeError): 1446 spam_cm(list) 1447 1448 def test_staticmethods(self): 1449 # Testing static methods... 1450 class C(object): 1451 def foo(*a): return a 1452 goo = staticmethod(foo) 1453 c = C() 1454 self.assertEqual(C.goo(1), (1,)) 1455 self.assertEqual(c.goo(1), (1,)) 1456 self.assertEqual(c.foo(1), (c, 1,)) 1457 class D(C): 1458 pass 1459 d = D() 1460 self.assertEqual(D.goo(1), (1,)) 1461 self.assertEqual(d.goo(1), (1,)) 1462 self.assertEqual(d.foo(1), (d, 1)) 1463 self.assertEqual(D.foo(d, 1), (d, 1)) 1464 1465 @test_support.impl_detail("the module 'xxsubtype' is internal") 1466 def test_staticmethods_in_c(self): 1467 # Testing C-based static methods... 1468 import xxsubtype as spam 1469 a = (1, 2, 3) 1470 d = {"abc": 123} 1471 x, a1, d1 = spam.spamlist.staticmeth(*a, **d) 1472 self.assertEqual(x, None) 1473 self.assertEqual(a, a1) 1474 self.assertEqual(d, d1) 1475 x, a1, d2 = spam.spamlist().staticmeth(*a, **d) 1476 self.assertEqual(x, None) 1477 self.assertEqual(a, a1) 1478 self.assertEqual(d, d1) 1479 1480 def test_classic(self): 1481 # Testing classic classes... 1482 class C: 1483 def foo(*a): return a 1484 goo = classmethod(foo) 1485 c = C() 1486 self.assertEqual(C.goo(1), (C, 1)) 1487 self.assertEqual(c.goo(1), (C, 1)) 1488 self.assertEqual(c.foo(1), (c, 1)) 1489 class D(C): 1490 pass 1491 d = D() 1492 self.assertEqual(D.goo(1), (D, 1)) 1493 self.assertEqual(d.goo(1), (D, 1)) 1494 self.assertEqual(d.foo(1), (d, 1)) 1495 self.assertEqual(D.foo(d, 1), (d, 1)) 1496 class E: # *not* subclassing from C 1497 foo = C.foo 1498 self.assertEqual(E().foo, C.foo) # i.e., unbound 1499 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method ")) 1500 1501 def test_compattr(self): 1502 # Testing computed attributes... 1503 class C(object): 1504 class computed_attribute(object): 1505 def __init__(self, get, set=None, delete=None): 1506 self.__get = get 1507 self.__set = set 1508 self.__delete = delete 1509 def __get__(self, obj, type=None): 1510 return self.__get(obj) 1511 def __set__(self, obj, value): 1512 return self.__set(obj, value) 1513 def __delete__(self, obj): 1514 return self.__delete(obj) 1515 def __init__(self): 1516 self.__x = 0 1517 def __get_x(self): 1518 x = self.__x 1519 self.__x = x+1 1520 return x 1521 def __set_x(self, x): 1522 self.__x = x 1523 def __delete_x(self): 1524 del self.__x 1525 x = computed_attribute(__get_x, __set_x, __delete_x) 1526 a = C() 1527 self.assertEqual(a.x, 0) 1528 self.assertEqual(a.x, 1) 1529 a.x = 10 1530 self.assertEqual(a.x, 10) 1531 self.assertEqual(a.x, 11) 1532 del a.x 1533 self.assertNotHasAttr(a, 'x') 1534 1535 def test_newslots(self): 1536 # Testing __new__ slot override... 1537 class C(list): 1538 def __new__(cls): 1539 self = list.__new__(cls) 1540 self.foo = 1 1541 return self 1542 def __init__(self): 1543 self.foo = self.foo + 2 1544 a = C() 1545 self.assertEqual(a.foo, 3) 1546 self.assertEqual(a.__class__, C) 1547 class D(C): 1548 pass 1549 b = D() 1550 self.assertEqual(b.foo, 3) 1551 self.assertEqual(b.__class__, D) 1552 1553 def test_altmro(self): 1554 # Testing mro() and overriding it... 1555 class A(object): 1556 def f(self): return "A" 1557 class B(A): 1558 pass 1559 class C(A): 1560 def f(self): return "C" 1561 class D(B, C): 1562 pass 1563 self.assertEqual(D.mro(), [D, B, C, A, object]) 1564 self.assertEqual(D.__mro__, (D, B, C, A, object)) 1565 self.assertEqual(D().f(), "C") 1566 1567 class PerverseMetaType(type): 1568 def mro(cls): 1569 L = type.mro(cls) 1570 L.reverse() 1571 return L 1572 class X(D,B,C,A): 1573 __metaclass__ = PerverseMetaType 1574 self.assertEqual(X.__mro__, (object, A, C, B, D, X)) 1575 self.assertEqual(X().f(), "A") 1576 1577 try: 1578 class X(object): 1579 class __metaclass__(type): 1580 def mro(self): 1581 return [self, dict, object] 1582 # In CPython, the class creation above already raises 1583 # TypeError, as a protection against the fact that 1584 # instances of X would segfault it. In other Python 1585 # implementations it would be ok to let the class X 1586 # be created, but instead get a clean TypeError on the 1587 # __setitem__ below. 1588 x = object.__new__(X) 1589 x[5] = 6 1590 except TypeError: 1591 pass 1592 else: 1593 self.fail("devious mro() return not caught") 1594 1595 try: 1596 class X(object): 1597 class __metaclass__(type): 1598 def mro(self): 1599 return [1] 1600 except TypeError: 1601 pass 1602 else: 1603 self.fail("non-class mro() return not caught") 1604 1605 try: 1606 class X(object): 1607 class __metaclass__(type): 1608 def mro(self): 1609 return 1 1610 except TypeError: 1611 pass 1612 else: 1613 self.fail("non-sequence mro() return not caught") 1614 1615 def test_overloading(self): 1616 # Testing operator overloading... 1617 1618 class B(object): 1619 "Intermediate class because object doesn't have a __setattr__" 1620 1621 class C(B): 1622 def __getattr__(self, name): 1623 if name == "foo": 1624 return ("getattr", name) 1625 else: 1626 raise AttributeError 1627 def __setattr__(self, name, value): 1628 if name == "foo": 1629 self.setattr = (name, value) 1630 else: 1631 return B.__setattr__(self, name, value) 1632 def __delattr__(self, name): 1633 if name == "foo": 1634 self.delattr = name 1635 else: 1636 return B.__delattr__(self, name) 1637 1638 def __getitem__(self, key): 1639 return ("getitem", key) 1640 def __setitem__(self, key, value): 1641 self.setitem = (key, value) 1642 def __delitem__(self, key): 1643 self.delitem = key 1644 1645 def __getslice__(self, i, j): 1646 return ("getslice", i, j) 1647 def __setslice__(self, i, j, value): 1648 self.setslice = (i, j, value) 1649 def __delslice__(self, i, j): 1650 self.delslice = (i, j) 1651 1652 a = C() 1653 self.assertEqual(a.foo, ("getattr", "foo")) 1654 a.foo = 12 1655 self.assertEqual(a.setattr, ("foo", 12)) 1656 del a.foo 1657 self.assertEqual(a.delattr, "foo") 1658 1659 self.assertEqual(a[12], ("getitem", 12)) 1660 a[12] = 21 1661 self.assertEqual(a.setitem, (12, 21)) 1662 del a[12] 1663 self.assertEqual(a.delitem, 12) 1664 1665 self.assertEqual(a[0:10], ("getslice", 0, 10)) 1666 a[0:10] = "foo" 1667 self.assertEqual(a.setslice, (0, 10, "foo")) 1668 del a[0:10] 1669 self.assertEqual(a.delslice, (0, 10)) 1670 1671 def test_methods(self): 1672 # Testing methods... 1673 class C(object): 1674 def __init__(self, x): 1675 self.x = x 1676 def foo(self): 1677 return self.x 1678 c1 = C(1) 1679 self.assertEqual(c1.foo(), 1) 1680 class D(C): 1681 boo = C.foo 1682 goo = c1.foo 1683 d2 = D(2) 1684 self.assertEqual(d2.foo(), 2) 1685 self.assertEqual(d2.boo(), 2) 1686 self.assertEqual(d2.goo(), 1) 1687 class E(object): 1688 foo = C.foo 1689 self.assertEqual(E().foo, C.foo) # i.e., unbound 1690 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method ")) 1691 1692 def test_special_method_lookup(self): 1693 # The lookup of special methods bypasses __getattr__ and 1694 # __getattribute__, but they still can be descriptors. 1695 1696 def run_context(manager): 1697 with manager: 1698 pass 1699 def iden(self): 1700 return self 1701 def hello(self): 1702 return "hello" 1703 def empty_seq(self): 1704 return [] 1705 def zero(self): 1706 return 0 1707 def complex_num(self): 1708 return 1j 1709 def stop(self): 1710 raise StopIteration 1711 def return_true(self, thing=None): 1712 return True 1713 def do_isinstance(obj): 1714 return isinstance(int, obj) 1715 def do_issubclass(obj): 1716 return issubclass(int, obj) 1717 def swallow(*args): 1718 pass 1719 def do_dict_missing(checker): 1720 class DictSub(checker.__class__, dict): 1721 pass 1722 self.assertEqual(DictSub()["hi"], 4) 1723 def some_number(self_, key): 1724 self.assertEqual(key, "hi") 1725 return 4 1726 def format_impl(self, spec): 1727 return "hello" 1728 1729 # It would be nice to have every special method tested here, but I'm 1730 # only listing the ones I can remember outside of typeobject.c, since it 1731 # does it right. 1732 specials = [ 1733 ("__unicode__", unicode, hello, set(), {}), 1734 ("__reversed__", reversed, empty_seq, set(), {}), 1735 ("__length_hint__", list, zero, set(), 1736 {"__iter__" : iden, "next" : stop}), 1737 ("__sizeof__", sys.getsizeof, zero, set(), {}), 1738 ("__instancecheck__", do_isinstance, return_true, set(), {}), 1739 ("__missing__", do_dict_missing, some_number, 1740 set(("__class__",)), {}), 1741 ("__subclasscheck__", do_issubclass, return_true, 1742 set(("__bases__",)), {}), 1743 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}), 1744 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}), 1745 ("__complex__", complex, complex_num, set(), {}), 1746 ("__format__", format, format_impl, set(), {}), 1747 ("__dir__", dir, empty_seq, set(), {}), 1748 ] 1749 1750 class Checker(object): 1751 def __getattr__(self, attr, test=self): 1752 test.fail("__getattr__ called with {0}".format(attr)) 1753 def __getattribute__(self, attr, test=self): 1754 if attr not in ok: 1755 test.fail("__getattribute__ called with {0}".format(attr)) 1756 return object.__getattribute__(self, attr) 1757 class SpecialDescr(object): 1758 def __init__(self, impl): 1759 self.impl = impl 1760 def __get__(self, obj, owner): 1761 record.append(1) 1762 return self.impl.__get__(obj, owner) 1763 class MyException(Exception): 1764 pass 1765 class ErrDescr(object): 1766 def __get__(self, obj, owner): 1767 raise MyException 1768 1769 for name, runner, meth_impl, ok, env in specials: 1770 class X(Checker): 1771 pass 1772 for attr, obj in env.iteritems(): 1773 setattr(X, attr, obj) 1774 setattr(X, name, meth_impl) 1775 runner(X()) 1776 1777 record = [] 1778 class X(Checker): 1779 pass 1780 for attr, obj in env.iteritems(): 1781 setattr(X, attr, obj) 1782 setattr(X, name, SpecialDescr(meth_impl)) 1783 runner(X()) 1784 self.assertEqual(record, [1], name) 1785 1786 class X(Checker): 1787 pass 1788 for attr, obj in env.iteritems(): 1789 setattr(X, attr, obj) 1790 setattr(X, name, ErrDescr()) 1791 try: 1792 runner(X()) 1793 except MyException: 1794 pass 1795 else: 1796 self.fail("{0!r} didn't raise".format(name)) 1797 1798 def test_specials(self): 1799 # Testing special operators... 1800 # Test operators like __hash__ for which a built-in default exists 1801 1802 # Test the default behavior for static classes 1803 class C(object): 1804 def __getitem__(self, i): 1805 if 0 <= i < 10: return i 1806 raise IndexError 1807 c1 = C() 1808 c2 = C() 1809 self.assertFalse(not c1) 1810 self.assertNotEqual(id(c1), id(c2)) 1811 hash(c1) 1812 hash(c2) 1813 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2))) 1814 self.assertEqual(c1, c1) 1815 self.assertTrue(c1 != c2) 1816 self.assertFalse(c1 != c1) 1817 self.assertFalse(c1 == c2) 1818 # Note that the module name appears in str/repr, and that varies 1819 # depending on whether this test is run standalone or from a framework. 1820 self.assertGreaterEqual(str(c1).find('C object at '), 0) 1821 self.assertEqual(str(c1), repr(c1)) 1822 self.assertNotIn(-1, c1) 1823 for i in range(10): 1824 self.assertIn(i, c1) 1825 self.assertNotIn(10, c1) 1826 # Test the default behavior for dynamic classes 1827 class D(object): 1828 def __getitem__(self, i): 1829 if 0 <= i < 10: return i 1830 raise IndexError 1831 d1 = D() 1832 d2 = D() 1833 self.assertFalse(not d1) 1834 self.assertNotEqual(id(d1), id(d2)) 1835 hash(d1) 1836 hash(d2) 1837 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2))) 1838 self.assertEqual(d1, d1) 1839 self.assertNotEqual(d1, d2) 1840 self.assertFalse(d1 != d1) 1841 self.assertFalse(d1 == d2) 1842 # Note that the module name appears in str/repr, and that varies 1843 # depending on whether this test is run standalone or from a framework. 1844 self.assertGreaterEqual(str(d1).find('D object at '), 0) 1845 self.assertEqual(str(d1), repr(d1)) 1846 self.assertNotIn(-1, d1) 1847 for i in range(10): 1848 self.assertIn(i, d1) 1849 self.assertNotIn(10, d1) 1850 # Test overridden behavior for static classes 1851 class Proxy(object): 1852 def __init__(self, x): 1853 self.x = x 1854 def __nonzero__(self): 1855 return not not self.x 1856 def __hash__(self): 1857 return hash(self.x) 1858 def __eq__(self, other): 1859 return self.x == other 1860 def __ne__(self, other): 1861 return self.x != other 1862 def __cmp__(self, other): 1863 return cmp(self.x, other.x) 1864 def __str__(self): 1865 return "Proxy:%s" % self.x 1866 def __repr__(self): 1867 return "Proxy(%r)" % self.x 1868 def __contains__(self, value): 1869 return value in self.x 1870 p0 = Proxy(0) 1871 p1 = Proxy(1) 1872 p_1 = Proxy(-1) 1873 self.assertFalse(p0) 1874 self.assertFalse(not p1) 1875 self.assertEqual(hash(p0), hash(0)) 1876 self.assertEqual(p0, p0) 1877 self.assertNotEqual(p0, p1) 1878 self.assertFalse(p0 != p0) 1879 self.assertEqual(not p0, p1) 1880 self.assertEqual(cmp(p0, p1), -1) 1881 self.assertEqual(cmp(p0, p0), 0) 1882 self.assertEqual(cmp(p0, p_1), 1) 1883 self.assertEqual(str(p0), "Proxy:0") 1884 self.assertEqual(repr(p0), "Proxy(0)") 1885 p10 = Proxy(range(10)) 1886 self.assertNotIn(-1, p10) 1887 for i in range(10): 1888 self.assertIn(i, p10) 1889 self.assertNotIn(10, p10) 1890 # Test overridden behavior for dynamic classes 1891 class DProxy(object): 1892 def __init__(self, x): 1893 self.x = x 1894 def __nonzero__(self): 1895 return not not self.x 1896 def __hash__(self): 1897 return hash(self.x) 1898 def __eq__(self, other): 1899 return self.x == other 1900 def __ne__(self, other): 1901 return self.x != other 1902 def __cmp__(self, other): 1903 return cmp(self.x, other.x) 1904 def __str__(self): 1905 return "DProxy:%s" % self.x 1906 def __repr__(self): 1907 return "DProxy(%r)" % self.x 1908 def __contains__(self, value): 1909 return value in self.x 1910 p0 = DProxy(0) 1911 p1 = DProxy(1) 1912 p_1 = DProxy(-1) 1913 self.assertFalse(p0) 1914 self.assertFalse(not p1) 1915 self.assertEqual(hash(p0), hash(0)) 1916 self.assertEqual(p0, p0) 1917 self.assertNotEqual(p0, p1) 1918 self.assertNotEqual(not p0, p0) 1919 self.assertEqual(not p0, p1) 1920 self.assertEqual(cmp(p0, p1), -1) 1921 self.assertEqual(cmp(p0, p0), 0) 1922 self.assertEqual(cmp(p0, p_1), 1) 1923 self.assertEqual(str(p0), "DProxy:0") 1924 self.assertEqual(repr(p0), "DProxy(0)") 1925 p10 = DProxy(range(10)) 1926 self.assertNotIn(-1, p10) 1927 for i in range(10): 1928 self.assertIn(i, p10) 1929 self.assertNotIn(10, p10) 1930 1931 # Safety test for __cmp__ 1932 def unsafecmp(a, b): 1933 if not hasattr(a, '__cmp__'): 1934 return # some types don't have a __cmp__ any more (so the 1935 # test doesn't make sense any more), or maybe they 1936 # never had a __cmp__ at all, e.g. in PyPy 1937 try: 1938 a.__class__.__cmp__(a, b) 1939 except TypeError: 1940 pass 1941 else: 1942 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % ( 1943 a.__class__, a, b)) 1944 1945 unsafecmp(u"123", "123") 1946 unsafecmp("123", u"123") 1947 unsafecmp(1, 1.0) 1948 unsafecmp(1.0, 1) 1949 unsafecmp(1, 1L) 1950 unsafecmp(1L, 1) 1951 1952 @test_support.impl_detail("custom logic for printing to real file objects") 1953 def test_recursions_1(self): 1954 # Testing recursion checks ... 1955 class Letter(str): 1956 def __new__(cls, letter): 1957 if letter == 'EPS': 1958 return str.__new__(cls) 1959 return str.__new__(cls, letter) 1960 def __str__(self): 1961 if not self: 1962 return 'EPS' 1963 return self 1964 # sys.stdout needs to be the original to trigger the recursion bug 1965 test_stdout = sys.stdout 1966 sys.stdout = test_support.get_original_stdout() 1967 try: 1968 # nothing should actually be printed, this should raise an exception 1969 print Letter('w') 1970 except RuntimeError: 1971 pass 1972 else: 1973 self.fail("expected a RuntimeError for print recursion") 1974 finally: 1975 sys.stdout = test_stdout 1976 1977 def test_recursions_2(self): 1978 # Bug #1202533. 1979 class A(object): 1980 pass 1981 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A) 1982 try: 1983 A()*2 1984 except RuntimeError: 1985 pass 1986 else: 1987 self.fail("expected a RuntimeError") 1988 1989 def test_weakrefs(self): 1990 # Testing weak references... 1991 import weakref 1992 class C(object): 1993 pass 1994 c = C() 1995 r = weakref.ref(c) 1996 self.assertEqual(r(), c) 1997 del c 1998 test_support.gc_collect() 1999 self.assertEqual(r(), None) 2000 del r 2001 class NoWeak(object): 2002 __slots__ = ['foo'] 2003 no = NoWeak() 2004 try: 2005 weakref.ref(no) 2006 except TypeError, msg: 2007 self.assertIn("weak reference", str(msg)) 2008 else: 2009 self.fail("weakref.ref(no) should be illegal") 2010 class Weak(object): 2011 __slots__ = ['foo', '__weakref__'] 2012 yes = Weak() 2013 r = weakref.ref(yes) 2014 self.assertEqual(r(), yes) 2015 del yes 2016 test_support.gc_collect() 2017 self.assertEqual(r(), None) 2018 del r 2019 2020 def test_properties(self): 2021 # Testing property... 2022 class C(object): 2023 def getx(self): 2024 return self.__x 2025 def setx(self, value): 2026 self.__x = value 2027 def delx(self): 2028 del self.__x 2029 x = property(getx, setx, delx, doc="I'm the x property.") 2030 a = C() 2031 self.assertNotHasAttr(a, "x") 2032 a.x = 42 2033 self.assertEqual(a._C__x, 42) 2034 self.assertEqual(a.x, 42) 2035 del a.x 2036 self.assertNotHasAttr(a, "x") 2037 self.assertNotHasAttr(a, "_C__x") 2038 C.x.__set__(a, 100) 2039 self.assertEqual(C.x.__get__(a), 100) 2040 C.x.__delete__(a) 2041 self.assertNotHasAttr(a, "x") 2042 2043 raw = C.__dict__['x'] 2044 self.assertIsInstance(raw, property) 2045 2046 attrs = dir(raw) 2047 self.assertIn("__doc__", attrs) 2048 self.assertIn("fget", attrs) 2049 self.assertIn("fset", attrs) 2050 self.assertIn("fdel", attrs) 2051 2052 self.assertEqual(raw.__doc__, "I'm the x property.") 2053 self.assertIs(raw.fget, C.__dict__['getx']) 2054 self.assertIs(raw.fset, C.__dict__['setx']) 2055 self.assertIs(raw.fdel, C.__dict__['delx']) 2056 2057 for attr in "__doc__", "fget", "fset", "fdel": 2058 try: 2059 setattr(raw, attr, 42) 2060 except TypeError, msg: 2061 if str(msg).find('readonly') < 0: 2062 self.fail("when setting readonly attr %r on a property, " 2063 "got unexpected TypeError msg %r" % (attr, str(msg))) 2064 else: 2065 self.fail("expected TypeError from trying to set readonly %r " 2066 "attr on a property" % attr) 2067 2068 class D(object): 2069 __getitem__ = property(lambda s: 1.0/0.0) 2070 2071 d = D() 2072 try: 2073 for i in d: 2074 str(i) 2075 except ZeroDivisionError: 2076 pass 2077 else: 2078 self.fail("expected ZeroDivisionError from bad property") 2079 2080 @unittest.skipIf(sys.flags.optimize >= 2, 2081 "Docstrings are omitted with -O2 and above") 2082 def test_properties_doc_attrib(self): 2083 class E(object): 2084 def getter(self): 2085 "getter method" 2086 return 0 2087 def setter(self_, value): 2088 "setter method" 2089 pass 2090 prop = property(getter) 2091 self.assertEqual(prop.__doc__, "getter method") 2092 prop2 = property(fset=setter) 2093 self.assertEqual(prop2.__doc__, None) 2094 2095 @test_support.cpython_only 2096 def test_testcapi_no_segfault(self): 2097 # this segfaulted in 2.5b2 2098 try: 2099 import _testcapi 2100 except ImportError: 2101 pass 2102 else: 2103 class X(object): 2104 p = property(_testcapi.test_with_docstring) 2105 2106 def test_properties_plus(self): 2107 class C(object): 2108 foo = property(doc="hello") 2109 @foo.getter 2110 def foo(self): 2111 return self._foo 2112 @foo.setter 2113 def foo(self, value): 2114 self._foo = abs(value) 2115 @foo.deleter 2116 def foo(self): 2117 del self._foo 2118 c = C() 2119 self.assertEqual(C.foo.__doc__, "hello") 2120 self.assertNotHasAttr(c, "foo") 2121 c.foo = -42 2122 self.assertHasAttr(c, '_foo') 2123 self.assertEqual(c._foo, 42) 2124 self.assertEqual(c.foo, 42) 2125 del c.foo 2126 self.assertNotHasAttr(c, '_foo') 2127 self.assertNotHasAttr(c, "foo") 2128 2129 class D(C): 2130 @C.foo.deleter 2131 def foo(self): 2132 try: 2133 del self._foo 2134 except AttributeError: 2135 pass 2136 d = D() 2137 d.foo = 24 2138 self.assertEqual(d.foo, 24) 2139 del d.foo 2140 del d.foo 2141 2142 class E(object): 2143 @property 2144 def foo(self): 2145 return self._foo 2146 @foo.setter 2147 def foo(self, value): 2148 raise RuntimeError 2149 @foo.setter 2150 def foo(self, value): 2151 self._foo = abs(value) 2152 @foo.deleter 2153 def foo(self, value=None): 2154 del self._foo 2155 2156 e = E() 2157 e.foo = -42 2158 self.assertEqual(e.foo, 42) 2159 del e.foo 2160 2161 class F(E): 2162 @E.foo.deleter 2163 def foo(self): 2164 del self._foo 2165 @foo.setter 2166 def foo(self, value): 2167 self._foo = max(0, value) 2168 f = F() 2169 f.foo = -10 2170 self.assertEqual(f.foo, 0) 2171 del f.foo 2172 2173 def test_dict_constructors(self): 2174 # Testing dict constructor ... 2175 d = dict() 2176 self.assertEqual(d, {}) 2177 d = dict({}) 2178 self.assertEqual(d, {}) 2179 d = dict({1: 2, 'a': 'b'}) 2180 self.assertEqual(d, {1: 2, 'a': 'b'}) 2181 self.assertEqual(d, dict(d.items())) 2182 self.assertEqual(d, dict(d.iteritems())) 2183 d = dict({'one':1, 'two':2}) 2184 self.assertEqual(d, dict(one=1, two=2)) 2185 self.assertEqual(d, dict(**d)) 2186 self.assertEqual(d, dict({"one": 1}, two=2)) 2187 self.assertEqual(d, dict([("two", 2)], one=1)) 2188 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d)) 2189 self.assertEqual(d, dict(**d)) 2190 2191 for badarg in 0, 0L, 0j, "0", [0], (0,): 2192 try: 2193 dict(badarg) 2194 except TypeError: 2195 pass 2196 except ValueError: 2197 if badarg == "0": 2198 # It's a sequence, and its elements are also sequences (gotta 2199 # love strings <wink>), but they aren't of length 2, so this 2200 # one seemed better as a ValueError than a TypeError. 2201 pass 2202 else: 2203 self.fail("no TypeError from dict(%r)" % badarg) 2204 else: 2205 self.fail("no TypeError from dict(%r)" % badarg) 2206 2207 try: 2208 dict({}, {}) 2209 except TypeError: 2210 pass 2211 else: 2212 self.fail("no TypeError from dict({}, {})") 2213 2214 class Mapping: 2215 # Lacks a .keys() method; will be added later. 2216 dict = {1:2, 3:4, 'a':1j} 2217 2218 try: 2219 dict(Mapping()) 2220 except TypeError: 2221 pass 2222 else: 2223 self.fail("no TypeError from dict(incomplete mapping)") 2224 2225 Mapping.keys = lambda self: self.dict.keys() 2226 Mapping.__getitem__ = lambda self, i: self.dict[i] 2227 d = dict(Mapping()) 2228 self.assertEqual(d, Mapping.dict) 2229 2230 # Init from sequence of iterable objects, each producing a 2-sequence. 2231 class AddressBookEntry: 2232 def __init__(self, first, last): 2233 self.first = first 2234 self.last = last 2235 def __iter__(self): 2236 return iter([self.first, self.last]) 2237 2238 d = dict([AddressBookEntry('Tim', 'Warsaw'), 2239 AddressBookEntry('Barry', 'Peters'), 2240 AddressBookEntry('Tim', 'Peters'), 2241 AddressBookEntry('Barry', 'Warsaw')]) 2242 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'}) 2243 2244 d = dict(zip(range(4), range(1, 5))) 2245 self.assertEqual(d, dict([(i, i+1) for i in range(4)])) 2246 2247 # Bad sequence lengths. 2248 for bad in [('tooshort',)], [('too', 'long', 'by 1')]: 2249 try: 2250 dict(bad) 2251 except ValueError: 2252 pass 2253 else: 2254 self.fail("no ValueError from dict(%r)" % bad) 2255 2256 def test_dir(self): 2257 # Testing dir() ... 2258 junk = 12 2259 self.assertEqual(dir(), ['junk', 'self']) 2260 del junk 2261 2262 # Just make sure these don't blow up! 2263 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir: 2264 dir(arg) 2265 2266 # Try classic classes. 2267 class C: 2268 Cdata = 1 2269 def Cmethod(self): pass 2270 2271 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__'] 2272 self.assertEqual(dir(C), cstuff) 2273 self.assertIn('im_self', dir(C.Cmethod)) 2274 2275 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__. 2276 self.assertEqual(dir(c), cstuff) 2277 2278 c.cdata = 2 2279 c.cmethod = lambda self: 0 2280 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod']) 2281 self.assertIn('im_self', dir(c.Cmethod)) 2282 2283 class A(C): 2284 Adata = 1 2285 def Amethod(self): pass 2286 2287 astuff = ['Adata', 'Amethod'] + cstuff 2288 self.assertEqual(dir(A), astuff) 2289 self.assertIn('im_self', dir(A.Amethod)) 2290 a = A() 2291 self.assertEqual(dir(a), astuff) 2292 self.assertIn('im_self', dir(a.Amethod)) 2293 a.adata = 42 2294 a.amethod = lambda self: 3 2295 self.assertEqual(dir(a), astuff + ['adata', 'amethod']) 2296 2297 # The same, but with new-style classes. Since these have object as a 2298 # base class, a lot more gets sucked in. 2299 def interesting(strings): 2300 return [s for s in strings if not s.startswith('_')] 2301 2302 class C(object): 2303 Cdata = 1 2304 def Cmethod(self): pass 2305 2306 cstuff = ['Cdata', 'Cmethod'] 2307 self.assertEqual(interesting(dir(C)), cstuff) 2308 2309 c = C() 2310 self.assertEqual(interesting(dir(c)), cstuff) 2311 self.assertIn('im_self', dir(C.Cmethod)) 2312 2313 c.cdata = 2 2314 c.cmethod = lambda self: 0 2315 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod']) 2316 self.assertIn('im_self', dir(c.Cmethod)) 2317 2318 class A(C): 2319 Adata = 1 2320 def Amethod(self): pass 2321 2322 astuff = ['Adata', 'Amethod'] + cstuff 2323 self.assertEqual(interesting(dir(A)), astuff) 2324 self.assertIn('im_self', dir(A.Amethod)) 2325 a = A() 2326 self.assertEqual(interesting(dir(a)), astuff) 2327 a.adata = 42 2328 a.amethod = lambda self: 3 2329 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod']) 2330 self.assertIn('im_self', dir(a.Amethod)) 2331 2332 # Try a module subclass. 2333 class M(type(sys)): 2334 pass 2335 minstance = M("m") 2336 minstance.b = 2 2337 minstance.a = 1 2338 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]] 2339 self.assertEqual(names, ['a', 'b']) 2340 2341 class M2(M): 2342 def getdict(self): 2343 return "Not a dict!" 2344 __dict__ = property(getdict) 2345 2346 m2instance = M2("m2") 2347 m2instance.b = 2 2348 m2instance.a = 1 2349 self.assertEqual(m2instance.__dict__, "Not a dict!") 2350 try: 2351 dir(m2instance) 2352 except TypeError: 2353 pass 2354 2355 # Two essentially featureless objects, just inheriting stuff from 2356 # object. 2357 self.assertEqual(dir(NotImplemented), dir(Ellipsis)) 2358 if test_support.check_impl_detail(): 2359 # None differs in PyPy: it has a __nonzero__ 2360 self.assertEqual(dir(None), dir(Ellipsis)) 2361 2362 # Nasty test case for proxied objects 2363 class Wrapper(object): 2364 def __init__(self, obj): 2365 self.__obj = obj 2366 def __repr__(self): 2367 return "Wrapper(%s)" % repr(self.__obj) 2368 def __getitem__(self, key): 2369 return Wrapper(self.__obj[key]) 2370 def __len__(self): 2371 return len(self.__obj) 2372 def __getattr__(self, name): 2373 return Wrapper(getattr(self.__obj, name)) 2374 2375 class C(object): 2376 def __getclass(self): 2377 return Wrapper(type(self)) 2378 __class__ = property(__getclass) 2379 2380 dir(C()) # This used to segfault 2381 2382 def test_supers(self): 2383 # Testing super... 2384 2385 class A(object): 2386 def meth(self, a): 2387 return "A(%r)" % a 2388 2389 self.assertEqual(A().meth(1), "A(1)") 2390 2391 class B(A): 2392 def __init__(self): 2393 self.__super = super(B, self) 2394 def meth(self, a): 2395 return "B(%r)" % a + self.__super.meth(a) 2396 2397 self.assertEqual(B().meth(2), "B(2)A(2)") 2398 2399 class C(A): 2400 def meth(self, a): 2401 return "C(%r)" % a + self.__super.meth(a) 2402 C._C__super = super(C) 2403 2404 self.assertEqual(C().meth(3), "C(3)A(3)") 2405 2406 class D(C, B): 2407 def meth(self, a): 2408 return "D(%r)" % a + super(D, self).meth(a) 2409 2410 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)") 2411 2412 # Test for subclassing super 2413 2414 class mysuper(super): 2415 def __init__(self, *args): 2416 return super(mysuper, self).__init__(*args) 2417 2418 class E(D): 2419 def meth(self, a): 2420 return "E(%r)" % a + mysuper(E, self).meth(a) 2421 2422 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") 2423 2424 class F(E): 2425 def meth(self, a): 2426 s = self.__super # == mysuper(F, self) 2427 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) 2428 F._F__super = mysuper(F) 2429 2430 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") 2431 2432 # Make sure certain errors are raised 2433 2434 try: 2435 super(D, 42) 2436 except TypeError: 2437 pass 2438 else: 2439 self.fail("shouldn't allow super(D, 42)") 2440 2441 try: 2442 super(D, C()) 2443 except TypeError: 2444 pass 2445 else: 2446 self.fail("shouldn't allow super(D, C())") 2447 2448 try: 2449 super(D).__get__(12) 2450 except TypeError: 2451 pass 2452 else: 2453 self.fail("shouldn't allow super(D).__get__(12)") 2454 2455 try: 2456 super(D).__get__(C()) 2457 except TypeError: 2458 pass 2459 else: 2460 self.fail("shouldn't allow super(D).__get__(C())") 2461 2462 # Make sure data descriptors can be overridden and accessed via super 2463 # (new feature in Python 2.3) 2464 2465 class DDbase(object): 2466 def getx(self): return 42 2467 x = property(getx) 2468 2469 class DDsub(DDbase): 2470 def getx(self): return "hello" 2471 x = property(getx) 2472 2473 dd = DDsub() 2474 self.assertEqual(dd.x, "hello") 2475 self.assertEqual(super(DDsub, dd).x, 42) 2476 2477 # Ensure that super() lookup of descriptor from classmethod 2478 # works (SF ID# 743627) 2479 2480 class Base(object): 2481 aProp = property(lambda self: "foo") 2482 2483 class Sub(Base): 2484 @classmethod 2485 def test(klass): 2486 return super(Sub,klass).aProp 2487 2488 self.assertEqual(Sub.test(), Base.aProp) 2489 2490 # Verify that super() doesn't allow keyword args 2491 try: 2492 super(Base, kw=1) 2493 except TypeError: 2494 pass 2495 else: 2496 self.assertEqual("super shouldn't accept keyword args") 2497 2498 def test_basic_inheritance(self): 2499 # Testing inheritance from basic types... 2500 2501 class hexint(int): 2502 def __repr__(self): 2503 return hex(self) 2504 def __add__(self, other): 2505 return hexint(int.__add__(self, other)) 2506 # (Note that overriding __radd__ doesn't work, 2507 # because the int type gets first dibs.) 2508 self.assertEqual(repr(hexint(7) + 9), "0x10") 2509 self.assertEqual(repr(hexint(1000) + 7), "0x3ef") 2510 a = hexint(12345) 2511 self.assertEqual(a, 12345) 2512 self.assertEqual(int(a), 12345) 2513 self.assertIs(int(a).__class__, int) 2514 self.assertEqual(hash(a), hash(12345)) 2515 self.assertIs((+a).__class__, int) 2516 self.assertIs((a >> 0).__class__, int) 2517 self.assertIs((a << 0).__class__, int) 2518 self.assertIs((hexint(0) << 12).__class__, int) 2519 self.assertIs((hexint(0) >> 12).__class__, int) 2520 2521 class octlong(long): 2522 __slots__ = [] 2523 def __str__(self): 2524 s = oct(self) 2525 if s[-1] == 'L': 2526 s = s[:-1] 2527 return s 2528 def __add__(self, other): 2529 return self.__class__(super(octlong, self).__add__(other)) 2530 __radd__ = __add__ 2531 self.assertEqual(str(octlong(3) + 5), "010") 2532 # (Note that overriding __radd__ here only seems to work 2533 # because the example uses a short int left argument.) 2534 self.assertEqual(str(5 + octlong(3000)), "05675") 2535 a = octlong(12345) 2536 self.assertEqual(a, 12345L) 2537 self.assertEqual(long(a), 12345L) 2538 self.assertEqual(hash(a), hash(12345L)) 2539 self.assertIs(long(a).__class__, long) 2540 self.assertIs((+a).__class__, long) 2541 self.assertIs((-a).__class__, long) 2542 self.assertIs((-octlong(0)).__class__, long) 2543 self.assertIs((a >> 0).__class__, long) 2544 self.assertIs((a << 0).__class__, long) 2545 self.assertIs((a - 0).__class__, long) 2546 self.assertIs((a * 1).__class__, long) 2547 self.assertIs((a ** 1).__class__, long) 2548 self.assertIs((a // 1).__class__, long) 2549 self.assertIs((1 * a).__class__, long) 2550 self.assertIs((a | 0).__class__, long) 2551 self.assertIs((a ^ 0).__class__, long) 2552 self.assertIs((a & -1L).__class__, long) 2553 self.assertIs((octlong(0) << 12).__class__, long) 2554 self.assertIs((octlong(0) >> 12).__class__, long) 2555 self.assertIs(abs(octlong(0)).__class__, long) 2556 2557 # Because octlong overrides __add__, we can't check the absence of +0 2558 # optimizations using octlong. 2559 class longclone(long): 2560 pass 2561 a = longclone(1) 2562 self.assertIs((a + 0).__class__, long) 2563 self.assertIs((0 + a).__class__, long) 2564 2565 # Check that negative clones don't segfault 2566 a = longclone(-1) 2567 self.assertEqual(a.__dict__, {}) 2568 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit 2569 2570 class precfloat(float): 2571 __slots__ = ['prec'] 2572 def __init__(self, value=0.0, prec=12): 2573 self.prec = int(prec) 2574 def __repr__(self): 2575 return "%.*g" % (self.prec, self) 2576 self.assertEqual(repr(precfloat(1.1)), "1.1") 2577 a = precfloat(12345) 2578 self.assertEqual(a, 12345.0) 2579 self.assertEqual(float(a), 12345.0) 2580 self.assertIs(float(a).__class__, float) 2581 self.assertEqual(hash(a), hash(12345.0)) 2582 self.assertIs((+a).__class__, float) 2583 2584 class madcomplex(complex): 2585 def __repr__(self): 2586 return "%.17gj%+.17g" % (self.imag, self.real) 2587 a = madcomplex(-3, 4) 2588 self.assertEqual(repr(a), "4j-3") 2589 base = complex(-3, 4) 2590 self.assertEqual(base.__class__, complex) 2591 self.assertEqual(a, base) 2592 self.assertEqual(complex(a), base) 2593 self.assertEqual(complex(a).__class__, complex) 2594 a = madcomplex(a) # just trying another form of the constructor 2595 self.assertEqual(repr(a), "4j-3") 2596 self.assertEqual(a, base) 2597 self.assertEqual(complex(a), base) 2598 self.assertEqual(complex(a).__class__, complex) 2599 self.assertEqual(hash(a), hash(base)) 2600 self.assertEqual((+a).__class__, complex) 2601 self.assertEqual((a + 0).__class__, complex) 2602 self.assertEqual(a + 0, base) 2603 self.assertEqual((a - 0).__class__, complex) 2604 self.assertEqual(a - 0, base) 2605 self.assertEqual((a * 1).__class__, complex) 2606 self.assertEqual(a * 1, base) 2607 self.assertEqual((a / 1).__class__, complex) 2608 self.assertEqual(a / 1, base) 2609 2610 class madtuple(tuple): 2611 _rev = None 2612 def rev(self): 2613 if self._rev is not None: 2614 return self._rev 2615 L = list(self) 2616 L.reverse() 2617 self._rev = self.__class__(L) 2618 return self._rev 2619 a = madtuple((1,2,3,4,5,6,7,8,9,0)) 2620 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0)) 2621 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1))) 2622 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0))) 2623 for i in range(512): 2624 t = madtuple(range(i)) 2625 u = t.rev() 2626 v = u.rev() 2627 self.assertEqual(v, t) 2628 a = madtuple((1,2,3,4,5)) 2629 self.assertEqual(tuple(a), (1,2,3,4,5)) 2630 self.assertIs(tuple(a).__class__, tuple) 2631 self.assertEqual(hash(a), hash((1,2,3,4,5))) 2632 self.assertIs(a[:].__class__, tuple) 2633 self.assertIs((a * 1).__class__, tuple) 2634 self.assertIs((a * 0).__class__, tuple) 2635 self.assertIs((a + ()).__class__, tuple) 2636 a = madtuple(()) 2637 self.assertEqual(tuple(a), ()) 2638 self.assertIs(tuple(a).__class__, tuple) 2639 self.assertIs((a + a).__class__, tuple) 2640 self.assertIs((a * 0).__class__, tuple) 2641 self.assertIs((a * 1).__class__, tuple) 2642 self.assertIs((a * 2).__class__, tuple) 2643 self.assertIs(a[:].__class__, tuple) 2644 2645 class madstring(str): 2646 _rev = None 2647 def rev(self): 2648 if self._rev is not None: 2649 return self._rev 2650 L = list(self) 2651 L.reverse() 2652 self._rev = self.__class__("".join(L)) 2653 return self._rev 2654 s = madstring("abcdefghijklmnopqrstuvwxyz") 2655 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz") 2656 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba")) 2657 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz")) 2658 for i in range(256): 2659 s = madstring("".join(map(chr, range(i)))) 2660 t = s.rev() 2661 u = t.rev() 2662 self.assertEqual(u, s) 2663 s = madstring("12345") 2664 self.assertEqual(str(s), "12345") 2665 self.assertIs(str(s).__class__, str) 2666 2667 base = "\x00" * 5 2668 s = madstring(base) 2669 self.assertEqual(s, base) 2670 self.assertEqual(str(s), base) 2671 self.assertIs(str(s).__class__, str) 2672 self.assertEqual(hash(s), hash(base)) 2673 self.assertEqual({s: 1}[base], 1) 2674 self.assertEqual({base: 1}[s], 1) 2675 self.assertIs((s + "").__class__, str) 2676 self.assertEqual(s + "", base) 2677 self.assertIs(("" + s).__class__, str) 2678 self.assertEqual("" + s, base) 2679 self.assertIs((s * 0).__class__, str) 2680 self.assertEqual(s * 0, "") 2681 self.assertIs((s * 1).__class__, str) 2682 self.assertEqual(s * 1, base) 2683 self.assertIs((s * 2).__class__, str) 2684 self.assertEqual(s * 2, base + base) 2685 self.assertIs(s[:].__class__, str) 2686 self.assertEqual(s[:], base) 2687 self.assertIs(s[0:0].__class__, str) 2688 self.assertEqual(s[0:0], "") 2689 self.assertIs(s.strip().__class__, str) 2690 self.assertEqual(s.strip(), base) 2691 self.assertIs(s.lstrip().__class__, str) 2692 self.assertEqual(s.lstrip(), base) 2693 self.assertIs(s.rstrip().__class__, str) 2694 self.assertEqual(s.rstrip(), base) 2695 identitytab = ''.join([chr(i) for i in range(256)]) 2696 self.assertIs(s.translate(identitytab).__class__, str) 2697 self.assertEqual(s.translate(identitytab), base) 2698 self.assertIs(s.translate(identitytab, "x").__class__, str) 2699 self.assertEqual(s.translate(identitytab, "x"), base) 2700 self.assertEqual(s.translate(identitytab, "\x00"), "") 2701 self.assertIs(s.replace("x", "x").__class__, str) 2702 self.assertEqual(s.replace("x", "x"), base) 2703 self.assertIs(s.ljust(len(s)).__class__, str) 2704 self.assertEqual(s.ljust(len(s)), base) 2705 self.assertIs(s.rjust(len(s)).__class__, str) 2706 self.assertEqual(s.rjust(len(s)), base) 2707 self.assertIs(s.center(len(s)).__class__, str) 2708 self.assertEqual(s.center(len(s)), base) 2709 self.assertIs(s.lower().__class__, str) 2710 self.assertEqual(s.lower(), base) 2711 2712 class madunicode(unicode): 2713 _rev = None 2714 def rev(self): 2715 if self._rev is not None: 2716 return self._rev 2717 L = list(self) 2718 L.reverse() 2719 self._rev = self.__class__(u"".join(L)) 2720 return self._rev 2721 u = madunicode("ABCDEF") 2722 self.assertEqual(u, u"ABCDEF") 2723 self.assertEqual(u.rev(), madunicode(u"FEDCBA")) 2724 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF")) 2725 base = u"12345" 2726 u = madunicode(base) 2727 self.assertEqual(unicode(u), base) 2728 self.assertIs(unicode(u).__class__, unicode) 2729 self.assertEqual(hash(u), hash(base)) 2730 self.assertEqual({u: 1}[base], 1) 2731 self.assertEqual({base: 1}[u], 1) 2732 self.assertIs(u.strip().__class__, unicode) 2733 self.assertEqual(u.strip(), base) 2734 self.assertIs(u.lstrip().__class__, unicode) 2735 self.assertEqual(u.lstrip(), base) 2736 self.assertIs(u.rstrip().__class__, unicode) 2737 self.assertEqual(u.rstrip(), base) 2738 self.assertIs(u.replace(u"x", u"x").__class__, unicode) 2739 self.assertEqual(u.replace(u"x", u"x"), base) 2740 self.assertIs(u.replace(u"xy", u"xy").__class__, unicode) 2741 self.assertEqual(u.replace(u"xy", u"xy"), base) 2742 self.assertIs(u.center(len(u)).__class__, unicode) 2743 self.assertEqual(u.center(len(u)), base) 2744 self.assertIs(u.ljust(len(u)).__class__, unicode) 2745 self.assertEqual(u.ljust(len(u)), base) 2746 self.assertIs(u.rjust(len(u)).__class__, unicode) 2747 self.assertEqual(u.rjust(len(u)), base) 2748 self.assertIs(u.lower().__class__, unicode) 2749 self.assertEqual(u.lower(), base) 2750 self.assertIs(u.upper().__class__, unicode) 2751 self.assertEqual(u.upper(), base) 2752 self.assertIs(u.capitalize().__class__, unicode) 2753 self.assertEqual(u.capitalize(), base) 2754 self.assertIs(u.title().__class__, unicode) 2755 self.assertEqual(u.title(), base) 2756 self.assertIs((u + u"").__class__, unicode) 2757 self.assertEqual(u + u"", base) 2758 self.assertIs((u"" + u).__class__, unicode) 2759 self.assertEqual(u"" + u, base) 2760 self.assertIs((u * 0).__class__, unicode) 2761 self.assertEqual(u * 0, u"") 2762 self.assertIs((u * 1).__class__, unicode) 2763 self.assertEqual(u * 1, base) 2764 self.assertIs((u * 2).__class__, unicode) 2765 self.assertEqual(u * 2, base + base) 2766 self.assertIs(u[:].__class__, unicode) 2767 self.assertEqual(u[:], base) 2768 self.assertIs(u[0:0].__class__, unicode) 2769 self.assertEqual(u[0:0], u"") 2770 2771 class sublist(list): 2772 pass 2773 a = sublist(range(5)) 2774 self.assertEqual(a, range(5)) 2775 a.append("hello") 2776 self.assertEqual(a, range(5) + ["hello"]) 2777 a[5] = 5 2778 self.assertEqual(a, range(6)) 2779 a.extend(range(6, 20)) 2780 self.assertEqual(a, range(20)) 2781 a[-5:] = [] 2782 self.assertEqual(a, range(15)) 2783 del a[10:15] 2784 self.assertEqual(len(a), 10) 2785 self.assertEqual(a, range(10)) 2786 self.assertEqual(list(a), range(10)) 2787 self.assertEqual(a[0], 0) 2788 self.assertEqual(a[9], 9) 2789 self.assertEqual(a[-10], 0) 2790 self.assertEqual(a[-1], 9) 2791 self.assertEqual(a[:5], range(5)) 2792 2793 class CountedInput(file): 2794 """Counts lines read by self.readline(). 2795 2796 self.lineno is the 0-based ordinal of the last line read, up to 2797 a maximum of one greater than the number of lines in the file. 2798 2799 self.ateof is true if and only if the final "" line has been read, 2800 at which point self.lineno stops incrementing, and further calls 2801 to readline() continue to return "". 2802 """ 2803 2804 lineno = 0 2805 ateof = 0 2806 def readline(self): 2807 if self.ateof: 2808 return "" 2809 s = file.readline(self) 2810 # Next line works too. 2811 # s = super(CountedInput, self).readline() 2812 self.lineno += 1 2813 if s == "": 2814 self.ateof = 1 2815 return s 2816 2817 f = file(name=test_support.TESTFN, mode='w') 2818 lines = ['a\n', 'b\n', 'c\n'] 2819 try: 2820 f.writelines(lines) 2821 f.close() 2822 f = CountedInput(test_support.TESTFN) 2823 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]): 2824 got = f.readline() 2825 self.assertEqual(expected, got) 2826 self.assertEqual(f.lineno, i) 2827 self.assertEqual(f.ateof, (i > len(lines))) 2828 f.close() 2829 finally: 2830 try: 2831 f.close() 2832 except: 2833 pass 2834 test_support.unlink(test_support.TESTFN) 2835 2836 def test_keywords(self): 2837 # Testing keyword args to basic type constructors ... 2838 self.assertEqual(int(x=1), 1) 2839 self.assertEqual(float(x=2), 2.0) 2840 self.assertEqual(long(x=3), 3L) 2841 self.assertEqual(complex(imag=42, real=666), complex(666, 42)) 2842 self.assertEqual(str(object=500), '500') 2843 self.assertEqual(unicode(string='abc', errors='strict'), u'abc') 2844 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2)) 2845 self.assertEqual(list(sequence=(0, 1, 2)), range(3)) 2846 # note: as of Python 2.3, dict() no longer has an "items" keyword arg 2847 2848 for constructor in (int, float, long, complex, str, unicode, 2849 tuple, list, file): 2850 try: 2851 constructor(bogus_keyword_arg=1) 2852 except TypeError: 2853 pass 2854 else: 2855 self.fail("expected TypeError from bogus keyword argument to %r" 2856 % constructor) 2857 2858 def test_str_subclass_as_dict_key(self): 2859 # Testing a str subclass used as dict key .. 2860 2861 class cistr(str): 2862 """Sublcass of str that computes __eq__ case-insensitively. 2863 2864 Also computes a hash code of the string in canonical form. 2865 """ 2866 2867 def __init__(self, value): 2868 self.canonical = value.lower() 2869 self.hashcode = hash(self.canonical) 2870 2871 def __eq__(self, other): 2872 if not isinstance(other, cistr): 2873 other = cistr(other) 2874 return self.canonical == other.canonical 2875 2876 def __hash__(self): 2877 return self.hashcode 2878 2879 self.assertEqual(cistr('ABC'), 'abc') 2880 self.assertEqual('aBc', cistr('ABC')) 2881 self.assertEqual(str(cistr('ABC')), 'ABC') 2882 2883 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3} 2884 self.assertEqual(d[cistr('one')], 1) 2885 self.assertEqual(d[cistr('tWo')], 2) 2886 self.assertEqual(d[cistr('THrEE')], 3) 2887 self.assertIn(cistr('ONe'), d) 2888 self.assertEqual(d.get(cistr('thrEE')), 3) 2889 2890 def test_classic_comparisons(self): 2891 # Testing classic comparisons... 2892 class classic: 2893 pass 2894 2895 for base in (classic, int, object): 2896 class C(base): 2897 def __init__(self, value): 2898 self.value = int(value) 2899 def __cmp__(self, other): 2900 if isinstance(other, C): 2901 return cmp(self.value, other.value) 2902 if isinstance(other, int) or isinstance(other, long): 2903 return cmp(self.value, other) 2904 return NotImplemented 2905 __hash__ = None # Silence Py3k warning 2906 2907 c1 = C(1) 2908 c2 = C(2) 2909 c3 = C(3) 2910 self.assertEqual(c1, 1) 2911 c = {1: c1, 2: c2, 3: c3} 2912 for x in 1, 2, 3: 2913 for y in 1, 2, 3: 2914 self.assertEqual(cmp(c[x], c[y]), cmp(x, y), 2915 "x=%d, y=%d" % (x, y)) 2916 for op in "<", "<=", "==", "!=", ">", ">=": 2917 self.assertEqual(eval("c[x] %s c[y]" % op), 2918 eval("x %s y" % op), 2919 "x=%d, y=%d" % (x, y)) 2920 self.assertEqual(cmp(c[x], y), cmp(x, y), 2921 "x=%d, y=%d" % (x, y)) 2922 self.assertEqual(cmp(x, c[y]), cmp(x, y), 2923 "x=%d, y=%d" % (x, y)) 2924 2925 def test_rich_comparisons(self): 2926 # Testing rich comparisons... 2927 class Z(complex): 2928 pass 2929 z = Z(1) 2930 self.assertEqual(z, 1+0j) 2931 self.assertEqual(1+0j, z) 2932 class ZZ(complex): 2933 def __eq__(self, other): 2934 try: 2935 return abs(self - other) <= 1e-6 2936 except: 2937 return NotImplemented 2938 __hash__ = None # Silence Py3k warning 2939 zz = ZZ(1.0000003) 2940 self.assertEqual(zz, 1+0j) 2941 self.assertEqual(1+0j, zz) 2942 2943 class classic: 2944 pass 2945 for base in (classic, int, object, list): 2946 class C(base): 2947 def __init__(self, value): 2948 self.value = int(value) 2949 def __cmp__(self_, other): 2950 self.fail("shouldn't call __cmp__") 2951 __hash__ = None # Silence Py3k warning 2952 def __eq__(self, other): 2953 if isinstance(other, C): 2954 return self.value == other.value 2955 if isinstance(other, int) or isinstance(other, long): 2956 return self.value == other 2957 return NotImplemented 2958 def __ne__(self, other): 2959 if isinstance(other, C): 2960 return self.value != other.value 2961 if isinstance(other, int) or isinstance(other, long): 2962 return self.value != other 2963 return NotImplemented 2964 def __lt__(self, other): 2965 if isinstance(other, C): 2966 return self.value < other.value 2967 if isinstance(other, int) or isinstance(other, long): 2968 return self.value < other 2969 return NotImplemented 2970 def __le__(self, other): 2971 if isinstance(other, C): 2972 return self.value <= other.value 2973 if isinstance(other, int) or isinstance(other, long): 2974 return self.value <= other 2975 return NotImplemented 2976 def __gt__(self, other): 2977 if isinstance(other, C): 2978 return self.value > other.value 2979 if isinstance(other, int) or isinstance(other, long): 2980 return self.value > other 2981 return NotImplemented 2982 def __ge__(self, other): 2983 if isinstance(other, C): 2984 return self.value >= other.value 2985 if isinstance(other, int) or isinstance(other, long): 2986 return self.value >= other 2987 return NotImplemented 2988 c1 = C(1) 2989 c2 = C(2) 2990 c3 = C(3) 2991 self.assertEqual(c1, 1) 2992 c = {1: c1, 2: c2, 3: c3} 2993 for x in 1, 2, 3: 2994 for y in 1, 2, 3: 2995 for op in "<", "<=", "==", "!=", ">", ">=": 2996 self.assertEqual(eval("c[x] %s c[y]" % op), 2997 eval("x %s y" % op), 2998 "x=%d, y=%d" % (x, y)) 2999 self.assertEqual(eval("c[x] %s y" % op), 3000 eval("x %s y" % op), 3001 "x=%d, y=%d" % (x, y)) 3002 self.assertEqual(eval("x %s c[y]" % op), 3003 eval("x %s y" % op), 3004 "x=%d, y=%d" % (x, y)) 3005 3006 def test_coercions(self): 3007 # Testing coercions... 3008 class I(int): pass 3009 coerce(I(0), 0) 3010 coerce(0, I(0)) 3011 class L(long): pass 3012 coerce(L(0), 0) 3013 coerce(L(0), 0L) 3014 coerce(0, L(0)) 3015 coerce(0L, L(0)) 3016 class F(float): pass 3017 coerce(F(0), 0) 3018 coerce(F(0), 0L) 3019 coerce(F(0), 0.) 3020 coerce(0, F(0)) 3021 coerce(0L, F(0)) 3022 coerce(0., F(0)) 3023 class C(complex): pass 3024 coerce(C(0), 0) 3025 coerce(C(0), 0L) 3026 coerce(C(0), 0.) 3027 coerce(C(0), 0j) 3028 coerce(0, C(0)) 3029 coerce(0L, C(0)) 3030 coerce(0., C(0)) 3031 coerce(0j, C(0)) 3032 3033 def test_descrdoc(self): 3034 # Testing descriptor doc strings... 3035 def check(descr, what): 3036 self.assertEqual(descr.__doc__, what) 3037 check(file.closed, "True if the file is closed") # getset descriptor 3038 check(file.name, "file name") # member descriptor 3039 3040 def test_doc_descriptor(self): 3041 # Testing __doc__ descriptor... 3042 # SF bug 542984 3043 class DocDescr(object): 3044 def __get__(self, object, otype): 3045 if object: 3046 object = object.__class__.__name__ + ' instance' 3047 if otype: 3048 otype = otype.__name__ 3049 return 'object=%s; type=%s' % (object, otype) 3050 class OldClass: 3051 __doc__ = DocDescr() 3052 class NewClass(object): 3053 __doc__ = DocDescr() 3054 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass') 3055 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass') 3056 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass') 3057 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass') 3058 3059 def test_set_class(self): 3060 # Testing __class__ assignment... 3061 class C(object): pass 3062 class D(object): pass 3063 class E(object): pass 3064 class F(D, E): pass 3065 for cls in C, D, E, F: 3066 for cls2 in C, D, E, F: 3067 x = cls() 3068 x.__class__ = cls2 3069 self.assertIs(x.__class__, cls2) 3070 x.__class__ = cls 3071 self.assertIs(x.__class__, cls) 3072 def cant(x, C): 3073 try: 3074 x.__class__ = C 3075 except TypeError: 3076 pass 3077 else: 3078 self.fail("shouldn't allow %r.__class__ = %r" % (x, C)) 3079 try: 3080 delattr(x, "__class__") 3081 except (TypeError, AttributeError): 3082 pass 3083 else: 3084 self.fail("shouldn't allow del %r.__class__" % x) 3085 cant(C(), list) 3086 cant(list(), C) 3087 cant(C(), 1) 3088 cant(C(), object) 3089 cant(object(), list) 3090 cant(list(), object) 3091 class Int(int): __slots__ = [] 3092 cant(2, Int) 3093 cant(Int(), int) 3094 cant(True, int) 3095 cant(2, bool) 3096 o = object() 3097 cant(o, type(1)) 3098 cant(o, type(None)) 3099 del o 3100 class G(object): 3101 __slots__ = ["a", "b"] 3102 class H(object): 3103 __slots__ = ["b", "a"] 3104 try: 3105 unicode 3106 except NameError: 3107 class I(object): 3108 __slots__ = ["a", "b"] 3109 else: 3110 class I(object): 3111 __slots__ = [unicode("a"), unicode("b")] 3112 class J(object): 3113 __slots__ = ["c", "b"] 3114 class K(object): 3115 __slots__ = ["a", "b", "d"] 3116 class L(H): 3117 __slots__ = ["e"] 3118 class M(I): 3119 __slots__ = ["e"] 3120 class N(J): 3121 __slots__ = ["__weakref__"] 3122 class P(J): 3123 __slots__ = ["__dict__"] 3124 class Q(J): 3125 pass 3126 class R(J): 3127 __slots__ = ["__dict__", "__weakref__"] 3128 3129 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)): 3130 x = cls() 3131 x.a = 1 3132 x.__class__ = cls2 3133 self.assertIs(x.__class__, cls2, 3134 "assigning %r as __class__ for %r silently failed" % (cls2, x)) 3135 self.assertEqual(x.a, 1) 3136 x.__class__ = cls 3137 self.assertIs(x.__class__, cls, 3138 "assigning %r as __class__ for %r silently failed" % (cls, x)) 3139 self.assertEqual(x.a, 1) 3140 for cls in G, J, K, L, M, N, P, R, list, Int: 3141 for cls2 in G, J, K, L, M, N, P, R, list, Int: 3142 if cls is cls2: 3143 continue 3144 cant(cls(), cls2) 3145 3146 # Issue5283: when __class__ changes in __del__, the wrong 3147 # type gets DECREF'd. 3148 class O(object): 3149 pass 3150 class A(object): 3151 def __del__(self): 3152 self.__class__ = O 3153 l = [A() for x in range(100)] 3154 del l 3155 3156 def test_set_dict(self): 3157 # Testing __dict__ assignment... 3158 class C(object): pass 3159 a = C() 3160 a.__dict__ = {'b': 1} 3161 self.assertEqual(a.b, 1) 3162 def cant(x, dict): 3163 try: 3164 x.__dict__ = dict 3165 except (AttributeError, TypeError): 3166 pass 3167 else: 3168 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict)) 3169 cant(a, None) 3170 cant(a, []) 3171 cant(a, 1) 3172 del a.__dict__ # Deleting __dict__ is allowed 3173 3174 class Base(object): 3175 pass 3176 def verify_dict_readonly(x): 3177 """ 3178 x has to be an instance of a class inheriting from Base. 3179 """ 3180 cant(x, {}) 3181 try: 3182 del x.__dict__ 3183 except (AttributeError, TypeError): 3184 pass 3185 else: 3186 self.fail("shouldn't allow del %r.__dict__" % x) 3187 dict_descr = Base.__dict__["__dict__"] 3188 try: 3189 dict_descr.__set__(x, {}) 3190 except (AttributeError, TypeError): 3191 pass 3192 else: 3193 self.fail("dict_descr allowed access to %r's dict" % x) 3194 3195 # Classes don't allow __dict__ assignment and have readonly dicts 3196 class Meta1(type, Base): 3197 pass 3198 class Meta2(Base, type): 3199 pass 3200 class D(object): 3201 __metaclass__ = Meta1 3202 class E(object): 3203 __metaclass__ = Meta2 3204 for cls in C, D, E: 3205 verify_dict_readonly(cls) 3206 class_dict = cls.__dict__ 3207 try: 3208 class_dict["spam"] = "eggs" 3209 except TypeError: 3210 pass 3211 else: 3212 self.fail("%r's __dict__ can be modified" % cls) 3213 3214 # Modules also disallow __dict__ assignment 3215 class Module1(types.ModuleType, Base): 3216 pass 3217 class Module2(Base, types.ModuleType): 3218 pass 3219 for ModuleType in Module1, Module2: 3220 mod = ModuleType("spam") 3221 verify_dict_readonly(mod) 3222 mod.__dict__["spam"] = "eggs" 3223 3224 # Exception's __dict__ can be replaced, but not deleted 3225 # (at least not any more than regular exception's __dict__ can 3226 # be deleted; on CPython it is not the case, whereas on PyPy they 3227 # can, just like any other new-style instance's __dict__.) 3228 def can_delete_dict(e): 3229 try: 3230 del e.__dict__ 3231 except (TypeError, AttributeError): 3232 return False 3233 else: 3234 return True 3235 class Exception1(Exception, Base): 3236 pass 3237 class Exception2(Base, Exception): 3238 pass 3239 for ExceptionType in Exception, Exception1, Exception2: 3240 e = ExceptionType() 3241 e.__dict__ = {"a": 1} 3242 self.assertEqual(e.a, 1) 3243 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError())) 3244 3245 def test_pickles(self): 3246 # Testing pickling and copying new-style classes and objects... 3247 import pickle, cPickle 3248 3249 def sorteditems(d): 3250 L = d.items() 3251 L.sort() 3252 return L 3253 3254 global C 3255 class C(object): 3256 def __init__(self, a, b): 3257 super(C, self).__init__() 3258 self.a = a 3259 self.b = b 3260 def __repr__(self): 3261 return "C(%r, %r)" % (self.a, self.b) 3262 3263 global C1 3264 class C1(list): 3265 def __new__(cls, a, b): 3266 return super(C1, cls).__new__(cls) 3267 def __getnewargs__(self): 3268 return (self.a, self.b) 3269 def __init__(self, a, b): 3270 self.a = a 3271 self.b = b 3272 def __repr__(self): 3273 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self)) 3274 3275 global C2 3276 class C2(int): 3277 def __new__(cls, a, b, val=0): 3278 return super(C2, cls).__new__(cls, val) 3279 def __getnewargs__(self): 3280 return (self.a, self.b, int(self)) 3281 def __init__(self, a, b, val=0): 3282 self.a = a 3283 self.b = b 3284 def __repr__(self): 3285 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self)) 3286 3287 global C3 3288 class C3(object): 3289 def __init__(self, foo): 3290 self.foo = foo 3291 def __getstate__(self): 3292 return self.foo 3293 def __setstate__(self, foo): 3294 self.foo = foo 3295 3296 global C4classic, C4 3297 class C4classic: # classic 3298 pass 3299 class C4(C4classic, object): # mixed inheritance 3300 pass 3301 3302 for p in pickle, cPickle: 3303 for bin in range(p.HIGHEST_PROTOCOL + 1): 3304 for cls in C, C1, C2: 3305 s = p.dumps(cls, bin) 3306 cls2 = p.loads(s) 3307 self.assertIs(cls2, cls) 3308 3309 a = C1(1, 2); a.append(42); a.append(24) 3310 b = C2("hello", "world", 42) 3311 s = p.dumps((a, b), bin) 3312 x, y = p.loads(s) 3313 self.assertEqual(x.__class__, a.__class__) 3314 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__)) 3315 self.assertEqual(y.__class__, b.__class__) 3316 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__)) 3317 self.assertEqual(repr(x), repr(a)) 3318 self.assertEqual(repr(y), repr(b)) 3319 # Test for __getstate__ and __setstate__ on new style class 3320 u = C3(42) 3321 s = p.dumps(u, bin) 3322 v = p.loads(s) 3323 self.assertEqual(u.__class__, v.__class__) 3324 self.assertEqual(u.foo, v.foo) 3325 # Test for picklability of hybrid class 3326 u = C4() 3327 u.foo = 42 3328 s = p.dumps(u, bin) 3329 v = p.loads(s) 3330 self.assertEqual(u.__class__, v.__class__) 3331 self.assertEqual(u.foo, v.foo) 3332 3333 # Testing copy.deepcopy() 3334 import copy 3335 for cls in C, C1, C2: 3336 cls2 = copy.deepcopy(cls) 3337 self.assertIs(cls2, cls) 3338 3339 a = C1(1, 2); a.append(42); a.append(24) 3340 b = C2("hello", "world", 42) 3341 x, y = copy.deepcopy((a, b)) 3342 self.assertEqual(x.__class__, a.__class__) 3343 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__)) 3344 self.assertEqual(y.__class__, b.__class__) 3345 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__)) 3346 self.assertEqual(repr(x), repr(a)) 3347 self.assertEqual(repr(y), repr(b)) 3348 3349 def test_pickle_slots(self): 3350 # Testing pickling of classes with __slots__ ... 3351 import pickle, cPickle 3352 # Pickling of classes with __slots__ but without __getstate__ should fail 3353 global B, C, D, E 3354 class B(object): 3355 pass 3356 for base in [object, B]: 3357 class C(base): 3358 __slots__ = ['a'] 3359 class D(C): 3360 pass 3361 for proto in range(2): 3362 try: 3363 pickle.dumps(C(), proto) 3364 except TypeError: 3365 pass 3366 else: 3367 self.fail("should fail: pickle C instance - %s" % base) 3368 try: 3369 cPickle.dumps(C(), proto) 3370 except TypeError: 3371 pass 3372 else: 3373 self.fail("should fail: cPickle C instance - %s" % base) 3374 try: 3375 pickle.dumps(C(), proto) 3376 except TypeError: 3377 pass 3378 else: 3379 self.fail("should fail: pickle D instance - %s" % base) 3380 try: 3381 cPickle.dumps(D(), proto) 3382 except TypeError: 3383 pass 3384 else: 3385 self.fail("should fail: cPickle D instance - %s" % base) 3386 # Give C a nice generic __getstate__ and __setstate__ 3387 class C(base): 3388 __slots__ = ['a'] 3389 def __getstate__(self): 3390 try: 3391 d = self.__dict__.copy() 3392 except AttributeError: 3393 d = {} 3394 for cls in self.__class__.__mro__: 3395 for sn in cls.__dict__.get('__slots__', ()): 3396 try: 3397 d[sn] = getattr(self, sn) 3398 except AttributeError: 3399 pass 3400 return d 3401 def __setstate__(self, d): 3402 for k, v in d.items(): 3403 setattr(self, k, v) 3404 class D(C): 3405 pass 3406 # Now it should work 3407 x = C() 3408 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3409 y = pickle.loads(pickle.dumps(x, proto)) 3410 self.assertNotHasAttr(y, 'a') 3411 y = cPickle.loads(cPickle.dumps(x, proto)) 3412 self.assertNotHasAttr(y, 'a') 3413 x.a = 42 3414 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3415 y = pickle.loads(pickle.dumps(x, proto)) 3416 self.assertEqual(y.a, 42) 3417 y = cPickle.loads(cPickle.dumps(x, proto)) 3418 self.assertEqual(y.a, 42) 3419 x = D() 3420 x.a = 42 3421 x.b = 100 3422 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3423 y = pickle.loads(pickle.dumps(x, proto)) 3424 self.assertEqual(y.a + y.b, 142) 3425 y = cPickle.loads(cPickle.dumps(x, proto)) 3426 self.assertEqual(y.a + y.b, 142) 3427 # A subclass that adds a slot should also work 3428 class E(C): 3429 __slots__ = ['b'] 3430 x = E() 3431 x.a = 42 3432 x.b = "foo" 3433 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3434 y = pickle.loads(pickle.dumps(x, proto)) 3435 self.assertEqual(y.a, x.a) 3436 self.assertEqual(y.b, x.b) 3437 y = cPickle.loads(cPickle.dumps(x, proto)) 3438 self.assertEqual(y.a, x.a) 3439 self.assertEqual(y.b, x.b) 3440 3441 def test_binary_operator_override(self): 3442 # Testing overrides of binary operations... 3443 class I(int): 3444 def __repr__(self): 3445 return "I(%r)" % int(self) 3446 def __add__(self, other): 3447 return I(int(self) + int(other)) 3448 __radd__ = __add__ 3449 def __pow__(self, other, mod=None): 3450 if mod is None: 3451 return I(pow(int(self), int(other))) 3452 else: 3453 return I(pow(int(self), int(other), int(mod))) 3454 def __rpow__(self, other, mod=None): 3455 if mod is None: 3456 return I(pow(int(other), int(self), mod)) 3457 else: 3458 return I(pow(int(other), int(self), int(mod))) 3459 3460 self.assertEqual(repr(I(1) + I(2)), "I(3)") 3461 self.assertEqual(repr(I(1) + 2), "I(3)") 3462 self.assertEqual(repr(1 + I(2)), "I(3)") 3463 self.assertEqual(repr(I(2) ** I(3)), "I(8)") 3464 self.assertEqual(repr(2 ** I(3)), "I(8)") 3465 self.assertEqual(repr(I(2) ** 3), "I(8)") 3466 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)") 3467 class S(str): 3468 def __eq__(self, other): 3469 return self.lower() == other.lower() 3470 __hash__ = None # Silence Py3k warning 3471 3472 def test_subclass_propagation(self): 3473 # Testing propagation of slot functions to subclasses... 3474 class A(object): 3475 pass 3476 class B(A): 3477 pass 3478 class C(A): 3479 pass 3480 class D(B, C): 3481 pass 3482 d = D() 3483 orig_hash = hash(d) # related to id(d) in platform-dependent ways 3484 A.__hash__ = lambda self: 42 3485 self.assertEqual(hash(d), 42) 3486 C.__hash__ = lambda self: 314 3487 self.assertEqual(hash(d), 314) 3488 B.__hash__ = lambda self: 144 3489 self.assertEqual(hash(d), 144) 3490 D.__hash__ = lambda self: 100 3491 self.assertEqual(hash(d), 100) 3492 D.__hash__ = None 3493 self.assertRaises(TypeError, hash, d) 3494 del D.__hash__ 3495 self.assertEqual(hash(d), 144) 3496 B.__hash__ = None 3497 self.assertRaises(TypeError, hash, d) 3498 del B.__hash__ 3499 self.assertEqual(hash(d), 314) 3500 C.__hash__ = None 3501 self.assertRaises(TypeError, hash, d) 3502 del C.__hash__ 3503 self.assertEqual(hash(d), 42) 3504 A.__hash__ = None 3505 self.assertRaises(TypeError, hash, d) 3506 del A.__hash__ 3507 self.assertEqual(hash(d), orig_hash) 3508 d.foo = 42 3509 d.bar = 42 3510 self.assertEqual(d.foo, 42) 3511 self.assertEqual(d.bar, 42) 3512 def __getattribute__(self, name): 3513 if name == "foo": 3514 return 24 3515 return object.__getattribute__(self, name) 3516 A.__getattribute__ = __getattribute__ 3517 self.assertEqual(d.foo, 24) 3518 self.assertEqual(d.bar, 42) 3519 def __getattr__(self, name): 3520 if name in ("spam", "foo", "bar"): 3521 return "hello" 3522 raise AttributeError, name 3523 B.__getattr__ = __getattr__ 3524 self.assertEqual(d.spam, "hello") 3525 self.assertEqual(d.foo, 24) 3526 self.assertEqual(d.bar, 42) 3527 del A.__getattribute__ 3528 self.assertEqual(d.foo, 42) 3529 del d.foo 3530 self.assertEqual(d.foo, "hello") 3531 self.assertEqual(d.bar, 42) 3532 del B.__getattr__ 3533 try: 3534 d.foo 3535 except AttributeError: 3536 pass 3537 else: 3538 self.fail("d.foo should be undefined now") 3539 3540 # Test a nasty bug in recurse_down_subclasses() 3541 class A(object): 3542 pass 3543 class B(A): 3544 pass 3545 del B 3546 test_support.gc_collect() 3547 A.__setitem__ = lambda *a: None # crash 3548 3549 def test_buffer_inheritance(self): 3550 # Testing that buffer interface is inherited ... 3551 3552 import binascii 3553 # SF bug [#470040] ParseTuple t# vs subclasses. 3554 3555 class MyStr(str): 3556 pass 3557 base = 'abc' 3558 m = MyStr(base) 3559 # b2a_hex uses the buffer interface to get its argument's value, via 3560 # PyArg_ParseTuple 't#' code. 3561 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base)) 3562 3563 # It's not clear that unicode will continue to support the character 3564 # buffer interface, and this test will fail if that's taken away. 3565 class MyUni(unicode): 3566 pass 3567 base = u'abc' 3568 m = MyUni(base) 3569 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base)) 3570 3571 class MyInt(int): 3572 pass 3573 m = MyInt(42) 3574 try: 3575 binascii.b2a_hex(m) 3576 self.fail('subclass of int should not have a buffer interface') 3577 except TypeError: 3578 pass 3579 3580 def test_str_of_str_subclass(self): 3581 # Testing __str__ defined in subclass of str ... 3582 import binascii 3583 import cStringIO 3584 3585 class octetstring(str): 3586 def __str__(self): 3587 return binascii.b2a_hex(self) 3588 def __repr__(self): 3589 return self + " repr" 3590 3591 o = octetstring('A') 3592 self.assertEqual(type(o), octetstring) 3593 self.assertEqual(type(str(o)), str) 3594 self.assertEqual(type(repr(o)), str) 3595 self.assertEqual(ord(o), 0x41) 3596 self.assertEqual(str(o), '41') 3597 self.assertEqual(repr(o), 'A repr') 3598 self.assertEqual(o.__str__(), '41') 3599 self.assertEqual(o.__repr__(), 'A repr') 3600 3601 capture = cStringIO.StringIO() 3602 # Calling str() or not exercises different internal paths. 3603 print >> capture, o 3604 print >> capture, str(o) 3605 self.assertEqual(capture.getvalue(), '41\n41\n') 3606 capture.close() 3607 3608 def test_keyword_arguments(self): 3609 # Testing keyword arguments to __init__, __call__... 3610 def f(a): return a 3611 self.assertEqual(f.__call__(a=42), 42) 3612 a = [] 3613 list.__init__(a, sequence=[0, 1, 2]) 3614 self.assertEqual(a, [0, 1, 2]) 3615 3616 def test_recursive_call(self): 3617 # Testing recursive __call__() by setting to instance of class... 3618 class A(object): 3619 pass 3620 3621 A.__call__ = A() 3622 try: 3623 A()() 3624 except RuntimeError: 3625 pass 3626 else: 3627 self.fail("Recursion limit should have been reached for __call__()") 3628 3629 def test_delete_hook(self): 3630 # Testing __del__ hook... 3631 log = [] 3632 class C(object): 3633 def __del__(self): 3634 log.append(1) 3635 c = C() 3636 self.assertEqual(log, []) 3637 del c 3638 test_support.gc_collect() 3639 self.assertEqual(log, [1]) 3640 3641 class D(object): pass 3642 d = D() 3643 try: del d[0] 3644 except TypeError: pass 3645 else: self.fail("invalid del() didn't raise TypeError") 3646 3647 def test_hash_inheritance(self): 3648 # Testing hash of mutable subclasses... 3649 3650 class mydict(dict): 3651 pass 3652 d = mydict() 3653 try: 3654 hash(d) 3655 except TypeError: 3656 pass 3657 else: 3658 self.fail("hash() of dict subclass should fail") 3659 3660 class mylist(list): 3661 pass 3662 d = mylist() 3663 try: 3664 hash(d) 3665 except TypeError: 3666 pass 3667 else: 3668 self.fail("hash() of list subclass should fail") 3669 3670 def test_str_operations(self): 3671 try: 'a' + 5 3672 except TypeError: pass 3673 else: self.fail("'' + 5 doesn't raise TypeError") 3674 3675 try: ''.split('') 3676 except ValueError: pass 3677 else: self.fail("''.split('') doesn't raise ValueError") 3678 3679 try: ''.join([0]) 3680 except TypeError: pass 3681 else: self.fail("''.join([0]) doesn't raise TypeError") 3682 3683 try: ''.rindex('5') 3684 except ValueError: pass 3685 else: self.fail("''.rindex('5') doesn't raise ValueError") 3686 3687 try: '%(n)s' % None 3688 except TypeError: pass 3689 else: self.fail("'%(n)s' % None doesn't raise TypeError") 3690 3691 try: '%(n' % {} 3692 except ValueError: pass 3693 else: self.fail("'%(n' % {} '' doesn't raise ValueError") 3694 3695 try: '%*s' % ('abc') 3696 except TypeError: pass 3697 else: self.fail("'%*s' % ('abc') doesn't raise TypeError") 3698 3699 try: '%*.*s' % ('abc', 5) 3700 except TypeError: pass 3701 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError") 3702 3703 try: '%s' % (1, 2) 3704 except TypeError: pass 3705 else: self.fail("'%s' % (1, 2) doesn't raise TypeError") 3706 3707 try: '%' % None 3708 except ValueError: pass 3709 else: self.fail("'%' % None doesn't raise ValueError") 3710 3711 self.assertEqual('534253'.isdigit(), 1) 3712 self.assertEqual('534253x'.isdigit(), 0) 3713 self.assertEqual('%c' % 5, '\x05') 3714 self.assertEqual('%c' % '5', '5') 3715 3716 def test_deepcopy_recursive(self): 3717 # Testing deepcopy of recursive objects... 3718 class Node: 3719 pass 3720 a = Node() 3721 b = Node() 3722 a.b = b 3723 b.a = a 3724 z = deepcopy(a) # This blew up before 3725 3726 def test_uninitialized_modules(self): 3727 # Testing uninitialized module objects... 3728 from types import ModuleType as M 3729 m = M.__new__(M) 3730 str(m) 3731 self.assertNotHasAttr(m, "__name__") 3732 self.assertNotHasAttr(m, "__file__") 3733 self.assertNotHasAttr(m, "foo") 3734 self.assertFalse(m.__dict__) # None or {} are both reasonable answers 3735 m.foo = 1 3736 self.assertEqual(m.__dict__, {"foo": 1}) 3737 3738 def test_funny_new(self): 3739 # Testing __new__ returning something unexpected... 3740 class C(object): 3741 def __new__(cls, arg): 3742 if isinstance(arg, str): return [1, 2, 3] 3743 elif isinstance(arg, int): return object.__new__(D) 3744 else: return object.__new__(cls) 3745 class D(C): 3746 def __init__(self, arg): 3747 self.foo = arg 3748 self.assertEqual(C("1"), [1, 2, 3]) 3749 self.assertEqual(D("1"), [1, 2, 3]) 3750 d = D(None) 3751 self.assertEqual(d.foo, None) 3752 d = C(1) 3753 self.assertEqual(isinstance(d, D), True) 3754 self.assertEqual(d.foo, 1) 3755 d = D(1) 3756 self.assertEqual(isinstance(d, D), True) 3757 self.assertEqual(d.foo, 1) 3758 3759 def test_imul_bug(self): 3760 # Testing for __imul__ problems... 3761 # SF bug 544647 3762 class C(object): 3763 def __imul__(self, other): 3764 return (self, other) 3765 x = C() 3766 y = x 3767 y *= 1.0 3768 self.assertEqual(y, (x, 1.0)) 3769 y = x 3770 y *= 2 3771 self.assertEqual(y, (x, 2)) 3772 y = x 3773 y *= 3L 3774 self.assertEqual(y, (x, 3L)) 3775 y = x 3776 y *= 1L<<100 3777 self.assertEqual(y, (x, 1L<<100)) 3778 y = x 3779 y *= None 3780 self.assertEqual(y, (x, None)) 3781 y = x 3782 y *= "foo" 3783 self.assertEqual(y, (x, "foo")) 3784 3785 def test_copy_setstate(self): 3786 # Testing that copy.*copy() correctly uses __setstate__... 3787 import copy 3788 class C(object): 3789 def __init__(self, foo=None): 3790 self.foo = foo 3791 self.__foo = foo 3792 def setfoo(self, foo=None): 3793 self.foo = foo 3794 def getfoo(self): 3795 return self.__foo 3796 def __getstate__(self): 3797 return [self.foo] 3798 def __setstate__(self_, lst): 3799 self.assertEqual(len(lst), 1) 3800 self_.__foo = self_.foo = lst[0] 3801 a = C(42) 3802 a.setfoo(24) 3803 self.assertEqual(a.foo, 24) 3804 self.assertEqual(a.getfoo(), 42) 3805 b = copy.copy(a) 3806 self.assertEqual(b.foo, 24) 3807 self.assertEqual(b.getfoo(), 24) 3808 b = copy.deepcopy(a) 3809 self.assertEqual(b.foo, 24) 3810 self.assertEqual(b.getfoo(), 24) 3811 3812 def test_slices(self): 3813 # Testing cases with slices and overridden __getitem__ ... 3814 3815 # Strings 3816 self.assertEqual("hello"[:4], "hell") 3817 self.assertEqual("hello"[slice(4)], "hell") 3818 self.assertEqual(str.__getitem__("hello", slice(4)), "hell") 3819 class S(str): 3820 def __getitem__(self, x): 3821 return str.__getitem__(self, x) 3822 self.assertEqual(S("hello")[:4], "hell") 3823 self.assertEqual(S("hello")[slice(4)], "hell") 3824 self.assertEqual(S("hello").__getitem__(slice(4)), "hell") 3825 # Tuples 3826 self.assertEqual((1,2,3)[:2], (1,2)) 3827 self.assertEqual((1,2,3)[slice(2)], (1,2)) 3828 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2)) 3829 class T(tuple): 3830 def __getitem__(self, x): 3831 return tuple.__getitem__(self, x) 3832 self.assertEqual(T((1,2,3))[:2], (1,2)) 3833 self.assertEqual(T((1,2,3))[slice(2)], (1,2)) 3834 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2)) 3835 # Lists 3836 self.assertEqual([1,2,3][:2], [1,2]) 3837 self.assertEqual([1,2,3][slice(2)], [1,2]) 3838 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2]) 3839 class L(list): 3840 def __getitem__(self, x): 3841 return list.__getitem__(self, x) 3842 self.assertEqual(L([1,2,3])[:2], [1,2]) 3843 self.assertEqual(L([1,2,3])[slice(2)], [1,2]) 3844 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2]) 3845 # Now do lists and __setitem__ 3846 a = L([1,2,3]) 3847 a[slice(1, 3)] = [3,2] 3848 self.assertEqual(a, [1,3,2]) 3849 a[slice(0, 2, 1)] = [3,1] 3850 self.assertEqual(a, [3,1,2]) 3851 a.__setitem__(slice(1, 3), [2,1]) 3852 self.assertEqual(a, [3,2,1]) 3853 a.__setitem__(slice(0, 2, 1), [2,3]) 3854 self.assertEqual(a, [2,3,1]) 3855 3856 def test_subtype_resurrection(self): 3857 # Testing resurrection of new-style instance... 3858 3859 class C(object): 3860 container = [] 3861 3862 def __del__(self): 3863 # resurrect the instance 3864 C.container.append(self) 3865 3866 c = C() 3867 c.attr = 42 3868 3869 # The most interesting thing here is whether this blows up, due to 3870 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 3871 # bug). 3872 del c 3873 3874 # If that didn't blow up, it's also interesting to see whether clearing 3875 # the last container slot works: that will attempt to delete c again, 3876 # which will cause c to get appended back to the container again 3877 # "during" the del. (On non-CPython implementations, however, __del__ 3878 # is typically not called again.) 3879 test_support.gc_collect() 3880 self.assertEqual(len(C.container), 1) 3881 del C.container[-1] 3882 if test_support.check_impl_detail(): 3883 test_support.gc_collect() 3884 self.assertEqual(len(C.container), 1) 3885 self.assertEqual(C.container[-1].attr, 42) 3886 3887 # Make c mortal again, so that the test framework with -l doesn't report 3888 # it as a leak. 3889 del C.__del__ 3890 3891 def test_slots_trash(self): 3892 # Testing slot trash... 3893 # Deallocating deeply nested slotted trash caused stack overflows 3894 class trash(object): 3895 __slots__ = ['x'] 3896 def __init__(self, x): 3897 self.x = x 3898 o = None 3899 for i in xrange(50000): 3900 o = trash(o) 3901 del o 3902 3903 def test_slots_multiple_inheritance(self): 3904 # SF bug 575229, multiple inheritance w/ slots dumps core 3905 class A(object): 3906 __slots__=() 3907 class B(object): 3908 pass 3909 class C(A,B) : 3910 __slots__=() 3911 if test_support.check_impl_detail(): 3912 self.assertEqual(C.__basicsize__, B.__basicsize__) 3913 self.assertHasAttr(C, '__dict__') 3914 self.assertHasAttr(C, '__weakref__') 3915 C().x = 2 3916 3917 def test_rmul(self): 3918 # Testing correct invocation of __rmul__... 3919 # SF patch 592646 3920 class C(object): 3921 def __mul__(self, other): 3922 return "mul" 3923 def __rmul__(self, other): 3924 return "rmul" 3925 a = C() 3926 self.assertEqual(a*2, "mul") 3927 self.assertEqual(a*2.2, "mul") 3928 self.assertEqual(2*a, "rmul") 3929 self.assertEqual(2.2*a, "rmul") 3930 3931 def test_ipow(self): 3932 # Testing correct invocation of __ipow__... 3933 # [SF bug 620179] 3934 class C(object): 3935 def __ipow__(self, other): 3936 pass 3937 a = C() 3938 a **= 2 3939 3940 def test_mutable_bases(self): 3941 # Testing mutable bases... 3942 3943 # stuff that should work: 3944 class C(object): 3945 pass 3946 class C2(object): 3947 def __getattribute__(self, attr): 3948 if attr == 'a': 3949 return 2 3950 else: 3951 return super(C2, self).__getattribute__(attr) 3952 def meth(self): 3953 return 1 3954 class D(C): 3955 pass 3956 class E(D): 3957 pass 3958 d = D() 3959 e = E() 3960 D.__bases__ = (C,) 3961 D.__bases__ = (C2,) 3962 self.assertEqual(d.meth(), 1) 3963 self.assertEqual(e.meth(), 1) 3964 self.assertEqual(d.a, 2) 3965 self.assertEqual(e.a, 2) 3966 self.assertEqual(C2.__subclasses__(), [D]) 3967 3968 try: 3969 del D.__bases__ 3970 except (TypeError, AttributeError): 3971 pass 3972 else: 3973 self.fail("shouldn't be able to delete .__bases__") 3974 3975 try: 3976 D.__bases__ = () 3977 except TypeError, msg: 3978 if str(msg) == "a new-style class can't have only classic bases": 3979 self.fail("wrong error message for .__bases__ = ()") 3980 else: 3981 self.fail("shouldn't be able to set .__bases__ to ()") 3982 3983 try: 3984 D.__bases__ = (D,) 3985 except TypeError: 3986 pass 3987 else: 3988 # actually, we'll have crashed by here... 3989 self.fail("shouldn't be able to create inheritance cycles") 3990 3991 try: 3992 D.__bases__ = (C, C) 3993 except TypeError: 3994 pass 3995 else: 3996 self.fail("didn't detect repeated base classes") 3997 3998 try: 3999 D.__bases__ = (E,) 4000 except TypeError: 4001 pass 4002 else: 4003 self.fail("shouldn't be able to create inheritance cycles") 4004 4005 # let's throw a classic class into the mix: 4006 class Classic: 4007 def meth2(self): 4008 return 3 4009 4010 D.__bases__ = (C, Classic) 4011 4012 self.assertEqual(d.meth2(), 3) 4013 self.assertEqual(e.meth2(), 3) 4014 try: 4015 d.a 4016 except AttributeError: 4017 pass 4018 else: 4019 self.fail("attribute should have vanished") 4020 4021 try: 4022 D.__bases__ = (Classic,) 4023 except TypeError: 4024 pass 4025 else: 4026 self.fail("new-style class must have a new-style base") 4027 4028 def test_builtin_bases(self): 4029 # Make sure all the builtin types can have their base queried without 4030 # segfaulting. See issue #5787. 4031 builtin_types = [tp for tp in __builtin__.__dict__.itervalues() 4032 if isinstance(tp, type)] 4033 for tp in builtin_types: 4034 object.__getattribute__(tp, "__bases__") 4035 if tp is not object: 4036 self.assertEqual(len(tp.__bases__), 1, tp) 4037 4038 class L(list): 4039 pass 4040 4041 class C(object): 4042 pass 4043 4044 class D(C): 4045 pass 4046 4047 try: 4048 L.__bases__ = (dict,) 4049 except TypeError: 4050 pass 4051 else: 4052 self.fail("shouldn't turn list subclass into dict subclass") 4053 4054 try: 4055 list.__bases__ = (dict,) 4056 except TypeError: 4057 pass 4058 else: 4059 self.fail("shouldn't be able to assign to list.__bases__") 4060 4061 try: 4062 D.__bases__ = (C, list) 4063 except TypeError: 4064 pass 4065 else: 4066 assert 0, "best_base calculation found wanting" 4067 4068 def test_unsubclassable_types(self): 4069 with self.assertRaises(TypeError): 4070 class X(types.NoneType): 4071 pass 4072 with self.assertRaises(TypeError): 4073 class X(object, types.NoneType): 4074 pass 4075 with self.assertRaises(TypeError): 4076 class X(types.NoneType, object): 4077 pass 4078 class O(object): 4079 pass 4080 with self.assertRaises(TypeError): 4081 class X(O, types.NoneType): 4082 pass 4083 with self.assertRaises(TypeError): 4084 class X(types.NoneType, O): 4085 pass 4086 4087 class X(object): 4088 pass 4089 with self.assertRaises(TypeError): 4090 X.__bases__ = types.NoneType, 4091 with self.assertRaises(TypeError): 4092 X.__bases__ = object, types.NoneType 4093 with self.assertRaises(TypeError): 4094 X.__bases__ = types.NoneType, object 4095 with self.assertRaises(TypeError): 4096 X.__bases__ = O, types.NoneType 4097 with self.assertRaises(TypeError): 4098 X.__bases__ = types.NoneType, O 4099 4100 def test_mutable_bases_with_failing_mro(self): 4101 # Testing mutable bases with failing mro... 4102 class WorkOnce(type): 4103 def __new__(self, name, bases, ns): 4104 self.flag = 0 4105 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns) 4106 def mro(self): 4107 if self.flag > 0: 4108 raise RuntimeError, "bozo" 4109 else: 4110 self.flag += 1 4111 return type.mro(self) 4112 4113 class WorkAlways(type): 4114 def mro(self): 4115 # this is here to make sure that .mro()s aren't called 4116 # with an exception set (which was possible at one point). 4117 # An error message will be printed in a debug build. 4118 # What's a good way to test for this? 4119 return type.mro(self) 4120 4121 class C(object): 4122 pass 4123 4124 class C2(object): 4125 pass 4126 4127 class D(C): 4128 pass 4129 4130 class E(D): 4131 pass 4132 4133 class F(D): 4134 __metaclass__ = WorkOnce 4135 4136 class G(D): 4137 __metaclass__ = WorkAlways 4138 4139 # Immediate subclasses have their mro's adjusted in alphabetical 4140 # order, so E's will get adjusted before adjusting F's fails. We 4141 # check here that E's gets restored. 4142 4143 E_mro_before = E.__mro__ 4144 D_mro_before = D.__mro__ 4145 4146 try: 4147 D.__bases__ = (C2,) 4148 except RuntimeError: 4149 self.assertEqual(E.__mro__, E_mro_before) 4150 self.assertEqual(D.__mro__, D_mro_before) 4151 else: 4152 self.fail("exception not propagated") 4153 4154 def test_mutable_bases_catch_mro_conflict(self): 4155 # Testing mutable bases catch mro conflict... 4156 class A(object): 4157 pass 4158 4159 class B(object): 4160 pass 4161 4162 class C(A, B): 4163 pass 4164 4165 class D(A, B): 4166 pass 4167 4168 class E(C, D): 4169 pass 4170 4171 try: 4172 C.__bases__ = (B, A) 4173 except TypeError: 4174 pass 4175 else: 4176 self.fail("didn't catch MRO conflict") 4177 4178 def test_mutable_names(self): 4179 # Testing mutable names... 4180 class C(object): 4181 pass 4182 4183 # C.__module__ could be 'test_descr' or '__main__' 4184 mod = C.__module__ 4185 4186 C.__name__ = 'D' 4187 self.assertEqual((C.__module__, C.__name__), (mod, 'D')) 4188 4189 C.__name__ = 'D.E' 4190 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E')) 4191 4192 def test_evil_type_name(self): 4193 # A badly placed Py_DECREF in type_set_name led to arbitrary code 4194 # execution while the type structure was not in a sane state, and a 4195 # possible segmentation fault as a result. See bug #16447. 4196 class Nasty(str): 4197 def __del__(self): 4198 C.__name__ = "other" 4199 4200 class C(object): 4201 pass 4202 4203 C.__name__ = Nasty("abc") 4204 C.__name__ = "normal" 4205 4206 def test_subclass_right_op(self): 4207 # Testing correct dispatch of subclass overloading __r<op>__... 4208 4209 # This code tests various cases where right-dispatch of a subclass 4210 # should be preferred over left-dispatch of a base class. 4211 4212 # Case 1: subclass of int; this tests code in abstract.c::binary_op1() 4213 4214 class B(int): 4215 def __floordiv__(self, other): 4216 return "B.__floordiv__" 4217 def __rfloordiv__(self, other): 4218 return "B.__rfloordiv__" 4219 4220 self.assertEqual(B(1) // 1, "B.__floordiv__") 4221 self.assertEqual(1 // B(1), "B.__rfloordiv__") 4222 4223 # Case 2: subclass of object; this is just the baseline for case 3 4224 4225 class C(object): 4226 def __floordiv__(self, other): 4227 return "C.__floordiv__" 4228 def __rfloordiv__(self, other): 4229 return "C.__rfloordiv__" 4230 4231 self.assertEqual(C() // 1, "C.__floordiv__") 4232 self.assertEqual(1 // C(), "C.__rfloordiv__") 4233 4234 # Case 3: subclass of new-style class; here it gets interesting 4235 4236 class D(C): 4237 def __floordiv__(self, other): 4238 return "D.__floordiv__" 4239 def __rfloordiv__(self, other): 4240 return "D.__rfloordiv__" 4241 4242 self.assertEqual(D() // C(), "D.__floordiv__") 4243 self.assertEqual(C() // D(), "D.__rfloordiv__") 4244 4245 # Case 4: this didn't work right in 2.2.2 and 2.3a1 4246 4247 class E(C): 4248 pass 4249 4250 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__) 4251 4252 self.assertEqual(E() // 1, "C.__floordiv__") 4253 self.assertEqual(1 // E(), "C.__rfloordiv__") 4254 self.assertEqual(E() // C(), "C.__floordiv__") 4255 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail 4256 4257 @test_support.impl_detail("testing an internal kind of method object") 4258 def test_meth_class_get(self): 4259 # Testing __get__ method of METH_CLASS C methods... 4260 # Full coverage of descrobject.c::classmethod_get() 4261 4262 # Baseline 4263 arg = [1, 2, 3] 4264 res = {1: None, 2: None, 3: None} 4265 self.assertEqual(dict.fromkeys(arg), res) 4266 self.assertEqual({}.fromkeys(arg), res) 4267 4268 # Now get the descriptor 4269 descr = dict.__dict__["fromkeys"] 4270 4271 # More baseline using the descriptor directly 4272 self.assertEqual(descr.__get__(None, dict)(arg), res) 4273 self.assertEqual(descr.__get__({})(arg), res) 4274 4275 # Now check various error cases 4276 try: 4277 descr.__get__(None, None) 4278 except TypeError: 4279 pass 4280 else: 4281 self.fail("shouldn't have allowed descr.__get__(None, None)") 4282 try: 4283 descr.__get__(42) 4284 except TypeError: 4285 pass 4286 else: 4287 self.fail("shouldn't have allowed descr.__get__(42)") 4288 try: 4289 descr.__get__(None, 42) 4290 except TypeError: 4291 pass 4292 else: 4293 self.fail("shouldn't have allowed descr.__get__(None, 42)") 4294 try: 4295 descr.__get__(None, int) 4296 except TypeError: 4297 pass 4298 else: 4299 self.fail("shouldn't have allowed descr.__get__(None, int)") 4300 4301 def test_isinst_isclass(self): 4302 # Testing proxy isinstance() and isclass()... 4303 class Proxy(object): 4304 def __init__(self, obj): 4305 self.__obj = obj 4306 def __getattribute__(self, name): 4307 if name.startswith("_Proxy__"): 4308 return object.__getattribute__(self, name) 4309 else: 4310 return getattr(self.__obj, name) 4311 # Test with a classic class 4312 class C: 4313 pass 4314 a = C() 4315 pa = Proxy(a) 4316 self.assertIsInstance(a, C) # Baseline 4317 self.assertIsInstance(pa, C) # Test 4318 # Test with a classic subclass 4319 class D(C): 4320 pass 4321 a = D() 4322 pa = Proxy(a) 4323 self.assertIsInstance(a, C) # Baseline 4324 self.assertIsInstance(pa, C) # Test 4325 # Test with a new-style class 4326 class C(object): 4327 pass 4328 a = C() 4329 pa = Proxy(a) 4330 self.assertIsInstance(a, C) # Baseline 4331 self.assertIsInstance(pa, C) # Test 4332 # Test with a new-style subclass 4333 class D(C): 4334 pass 4335 a = D() 4336 pa = Proxy(a) 4337 self.assertIsInstance(a, C) # Baseline 4338 self.assertIsInstance(pa, C) # Test 4339 4340 def test_proxy_super(self): 4341 # Testing super() for a proxy object... 4342 class Proxy(object): 4343 def __init__(self, obj): 4344 self.__obj = obj 4345 def __getattribute__(self, name): 4346 if name.startswith("_Proxy__"): 4347 return object.__getattribute__(self, name) 4348 else: 4349 return getattr(self.__obj, name) 4350 4351 class B(object): 4352 def f(self): 4353 return "B.f" 4354 4355 class C(B): 4356 def f(self): 4357 return super(C, self).f() + "->C.f" 4358 4359 obj = C() 4360 p = Proxy(obj) 4361 self.assertEqual(C.__dict__["f"](p), "B.f->C.f") 4362 4363 def test_carloverre(self): 4364 # Testing prohibition of Carlo Verre's hack... 4365 try: 4366 object.__setattr__(str, "foo", 42) 4367 except TypeError: 4368 pass 4369 else: 4370 self.fail("Carlo Verre __setattr__ succeeded!") 4371 try: 4372 object.__delattr__(str, "lower") 4373 except TypeError: 4374 pass 4375 else: 4376 self.fail("Carlo Verre __delattr__ succeeded!") 4377 4378 def test_weakref_segfault(self): 4379 # Testing weakref segfault... 4380 # SF 742911 4381 import weakref 4382 4383 class Provoker: 4384 def __init__(self, referrent): 4385 self.ref = weakref.ref(referrent) 4386 4387 def __del__(self): 4388 x = self.ref() 4389 4390 class Oops(object): 4391 pass 4392 4393 o = Oops() 4394 o.whatever = Provoker(o) 4395 del o 4396 4397 def test_wrapper_segfault(self): 4398 # SF 927248: deeply nested wrappers could cause stack overflow 4399 f = lambda:None 4400 for i in xrange(1000000): 4401 f = f.__call__ 4402 f = None 4403 4404 def test_file_fault(self): 4405 # Testing sys.stdout is changed in getattr... 4406 test_stdout = sys.stdout 4407 class StdoutGuard: 4408 def __getattr__(self, attr): 4409 sys.stdout = sys.__stdout__ 4410 raise RuntimeError("Premature access to sys.stdout.%s" % attr) 4411 sys.stdout = StdoutGuard() 4412 try: 4413 print "Oops!" 4414 except RuntimeError: 4415 pass 4416 finally: 4417 sys.stdout = test_stdout 4418 4419 def test_vicious_descriptor_nonsense(self): 4420 # Testing vicious_descriptor_nonsense... 4421 4422 # A potential segfault spotted by Thomas Wouters in mail to 4423 # python-dev 2003-04-17, turned into an example & fixed by Michael 4424 # Hudson just less than four months later... 4425 4426 class Evil(object): 4427 def __hash__(self): 4428 return hash('attr') 4429 def __eq__(self, other): 4430 del C.attr 4431 return 0 4432 4433 class Descr(object): 4434 def __get__(self, ob, type=None): 4435 return 1 4436 4437 class C(object): 4438 attr = Descr() 4439 4440 c = C() 4441 c.__dict__[Evil()] = 0 4442 4443 self.assertEqual(c.attr, 1) 4444 # this makes a crash more likely: 4445 test_support.gc_collect() 4446 self.assertNotHasAttr(c, 'attr') 4447 4448 def test_init(self): 4449 # SF 1155938 4450 class Foo(object): 4451 def __init__(self): 4452 return 10 4453 try: 4454 Foo() 4455 except TypeError: 4456 pass 4457 else: 4458 self.fail("did not test __init__() for None return") 4459 4460 def test_method_wrapper(self): 4461 # Testing method-wrapper objects... 4462 # <type 'method-wrapper'> did not support any reflection before 2.5 4463 4464 l = [] 4465 self.assertEqual(l.__add__, l.__add__) 4466 self.assertEqual(l.__add__, [].__add__) 4467 self.assertNotEqual(l.__add__, [5].__add__) 4468 self.assertNotEqual(l.__add__, l.__mul__) 4469 self.assertEqual(l.__add__.__name__, '__add__') 4470 if hasattr(l.__add__, '__self__'): 4471 # CPython 4472 self.assertIs(l.__add__.__self__, l) 4473 self.assertIs(l.__add__.__objclass__, list) 4474 else: 4475 # Python implementations where [].__add__ is a normal bound method 4476 self.assertIs(l.__add__.im_self, l) 4477 self.assertIs(l.__add__.im_class, list) 4478 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__) 4479 try: 4480 hash(l.__add__) 4481 except TypeError: 4482 pass 4483 else: 4484 self.fail("no TypeError from hash([].__add__)") 4485 4486 t = () 4487 t += (7,) 4488 self.assertEqual(t.__add__, (7,).__add__) 4489 self.assertEqual(hash(t.__add__), hash((7,).__add__)) 4490 4491 def test_not_implemented(self): 4492 # Testing NotImplemented... 4493 # all binary methods should be able to return a NotImplemented 4494 import operator 4495 4496 def specialmethod(self, other): 4497 return NotImplemented 4498 4499 def check(expr, x, y): 4500 try: 4501 exec expr in {'x': x, 'y': y, 'operator': operator} 4502 except TypeError: 4503 pass 4504 else: 4505 self.fail("no TypeError from %r" % (expr,)) 4506 4507 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of 4508 # TypeErrors 4509 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger 4510 # ValueErrors instead of TypeErrors 4511 for metaclass in [type, types.ClassType]: 4512 for name, expr, iexpr in [ 4513 ('__add__', 'x + y', 'x += y'), 4514 ('__sub__', 'x - y', 'x -= y'), 4515 ('__mul__', 'x * y', 'x *= y'), 4516 ('__truediv__', 'operator.truediv(x, y)', None), 4517 ('__floordiv__', 'operator.floordiv(x, y)', None), 4518 ('__div__', 'x / y', 'x /= y'), 4519 ('__mod__', 'x % y', 'x %= y'), 4520 ('__divmod__', 'divmod(x, y)', None), 4521 ('__pow__', 'x ** y', 'x **= y'), 4522 ('__lshift__', 'x << y', 'x <<= y'), 4523 ('__rshift__', 'x >> y', 'x >>= y'), 4524 ('__and__', 'x & y', 'x &= y'), 4525 ('__or__', 'x | y', 'x |= y'), 4526 ('__xor__', 'x ^ y', 'x ^= y'), 4527 ('__coerce__', 'coerce(x, y)', None)]: 4528 if name == '__coerce__': 4529 rname = name 4530 else: 4531 rname = '__r' + name[2:] 4532 A = metaclass('A', (), {name: specialmethod}) 4533 B = metaclass('B', (), {rname: specialmethod}) 4534 a = A() 4535 b = B() 4536 check(expr, a, a) 4537 check(expr, a, b) 4538 check(expr, b, a) 4539 check(expr, b, b) 4540 check(expr, a, N1) 4541 check(expr, a, N2) 4542 check(expr, N1, b) 4543 check(expr, N2, b) 4544 if iexpr: 4545 check(iexpr, a, a) 4546 check(iexpr, a, b) 4547 check(iexpr, b, a) 4548 check(iexpr, b, b) 4549 check(iexpr, a, N1) 4550 check(iexpr, a, N2) 4551 iname = '__i' + name[2:] 4552 C = metaclass('C', (), {iname: specialmethod}) 4553 c = C() 4554 check(iexpr, c, a) 4555 check(iexpr, c, b) 4556 check(iexpr, c, N1) 4557 check(iexpr, c, N2) 4558 4559 def test_assign_slice(self): 4560 # ceval.c's assign_slice used to check for 4561 # tp->tp_as_sequence->sq_slice instead of 4562 # tp->tp_as_sequence->sq_ass_slice 4563 4564 class C(object): 4565 def __setslice__(self, start, stop, value): 4566 self.value = value 4567 4568 c = C() 4569 c[1:2] = 3 4570 self.assertEqual(c.value, 3) 4571 4572 def test_set_and_no_get(self): 4573 # See 4574 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html 4575 class Descr(object): 4576 4577 def __init__(self, name): 4578 self.name = name 4579 4580 def __set__(self, obj, value): 4581 obj.__dict__[self.name] = value 4582 descr = Descr("a") 4583 4584 class X(object): 4585 a = descr 4586 4587 x = X() 4588 self.assertIs(x.a, descr) 4589 x.a = 42 4590 self.assertEqual(x.a, 42) 4591 4592 # Also check type_getattro for correctness. 4593 class Meta(type): 4594 pass 4595 class X(object): 4596 __metaclass__ = Meta 4597 X.a = 42 4598 Meta.a = Descr("a") 4599 self.assertEqual(X.a, 42) 4600 4601 def test_getattr_hooks(self): 4602 # issue 4230 4603 4604 class Descriptor(object): 4605 counter = 0 4606 def __get__(self, obj, objtype=None): 4607 def getter(name): 4608 self.counter += 1 4609 raise AttributeError(name) 4610 return getter 4611 4612 descr = Descriptor() 4613 class A(object): 4614 __getattribute__ = descr 4615 class B(object): 4616 __getattr__ = descr 4617 class C(object): 4618 __getattribute__ = descr 4619 __getattr__ = descr 4620 4621 self.assertRaises(AttributeError, getattr, A(), "attr") 4622 self.assertEqual(descr.counter, 1) 4623 self.assertRaises(AttributeError, getattr, B(), "attr") 4624 self.assertEqual(descr.counter, 2) 4625 self.assertRaises(AttributeError, getattr, C(), "attr") 4626 self.assertEqual(descr.counter, 4) 4627 4628 class EvilGetattribute(object): 4629 # This used to segfault 4630 def __getattr__(self, name): 4631 raise AttributeError(name) 4632 def __getattribute__(self, name): 4633 del EvilGetattribute.__getattr__ 4634 for i in range(5): 4635 gc.collect() 4636 raise AttributeError(name) 4637 4638 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr") 4639 4640 def test_type___getattribute__(self): 4641 self.assertRaises(TypeError, type.__getattribute__, list, type) 4642 4643 def test_abstractmethods(self): 4644 # type pretends not to have __abstractmethods__. 4645 self.assertRaises(AttributeError, getattr, type, "__abstractmethods__") 4646 class meta(type): 4647 pass 4648 self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__") 4649 class X(object): 4650 pass 4651 with self.assertRaises(AttributeError): 4652 del X.__abstractmethods__ 4653 4654 def test_proxy_call(self): 4655 class FakeStr(object): 4656 __class__ = str 4657 4658 fake_str = FakeStr() 4659 # isinstance() reads __class__ on new style classes 4660 self.assertIsInstance(fake_str, str) 4661 4662 # call a method descriptor 4663 with self.assertRaises(TypeError): 4664 str.split(fake_str) 4665 4666 # call a slot wrapper descriptor 4667 with self.assertRaises(TypeError): 4668 str.__add__(fake_str, "abc") 4669 4670 def test_repr_as_str(self): 4671 # Issue #11603: crash or infinite loop when rebinding __str__ as 4672 # __repr__. 4673 class Foo(object): 4674 pass 4675 Foo.__repr__ = Foo.__str__ 4676 foo = Foo() 4677 self.assertRaises(RuntimeError, str, foo) 4678 self.assertRaises(RuntimeError, repr, foo) 4679 4680 def test_mixing_slot_wrappers(self): 4681 class X(dict): 4682 __setattr__ = dict.__setitem__ 4683 x = X() 4684 x.y = 42 4685 self.assertEqual(x["y"], 42) 4686 4687 def test_cycle_through_dict(self): 4688 # See bug #1469629 4689 class X(dict): 4690 def __init__(self): 4691 dict.__init__(self) 4692 self.__dict__ = self 4693 x = X() 4694 x.attr = 42 4695 wr = weakref.ref(x) 4696 del x 4697 test_support.gc_collect() 4698 self.assertIsNone(wr()) 4699 for o in gc.get_objects(): 4700 self.assertIsNot(type(o), X) 4701 4702 4703class DictProxyTests(unittest.TestCase): 4704 def setUp(self): 4705 class C(object): 4706 def meth(self): 4707 pass 4708 self.C = C 4709 4710 def test_repr(self): 4711 self.assertIn('dict_proxy({', repr(vars(self.C))) 4712 self.assertIn("'meth':", repr(vars(self.C))) 4713 4714 def test_iter_keys(self): 4715 # Testing dict-proxy iterkeys... 4716 keys = [ key for key in self.C.__dict__.iterkeys() ] 4717 keys.sort() 4718 self.assertEqual(keys, ['__dict__', '__doc__', '__module__', 4719 '__weakref__', 'meth']) 4720 4721 def test_iter_values(self): 4722 # Testing dict-proxy itervalues... 4723 values = [ values for values in self.C.__dict__.itervalues() ] 4724 self.assertEqual(len(values), 5) 4725 4726 def test_iter_items(self): 4727 # Testing dict-proxy iteritems... 4728 keys = [ key for (key, value) in self.C.__dict__.iteritems() ] 4729 keys.sort() 4730 self.assertEqual(keys, ['__dict__', '__doc__', '__module__', 4731 '__weakref__', 'meth']) 4732 4733 def test_dict_type_with_metaclass(self): 4734 # Testing type of __dict__ when __metaclass__ set... 4735 class B(object): 4736 pass 4737 class M(type): 4738 pass 4739 class C: 4740 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy 4741 __metaclass__ = M 4742 self.assertEqual(type(C.__dict__), type(B.__dict__)) 4743 4744 4745class PTypesLongInitTest(unittest.TestCase): 4746 # This is in its own TestCase so that it can be run before any other tests. 4747 def test_pytype_long_ready(self): 4748 # Testing SF bug 551412 ... 4749 4750 # This dumps core when SF bug 551412 isn't fixed -- 4751 # but only when test_descr.py is run separately. 4752 # (That can't be helped -- as soon as PyType_Ready() 4753 # is called for PyLong_Type, the bug is gone.) 4754 class UserLong(object): 4755 def __pow__(self, *args): 4756 pass 4757 try: 4758 pow(0L, UserLong(), 0L) 4759 except: 4760 pass 4761 4762 # Another segfault only when run early 4763 # (before PyType_Ready(tuple) is called) 4764 type.mro(tuple) 4765 4766 4767class PicklingTests(unittest.TestCase): 4768 4769 def test_issue24097(self): 4770 # Slot name is freed inside __getattr__ and is later used. 4771 class S(str): # Not interned 4772 pass 4773 class A(object): 4774 __slotnames__ = [S('spam')] 4775 def __getattr__(self, attr): 4776 if attr == 'spam': 4777 A.__slotnames__[:] = [S('spam')] 4778 return 42 4779 else: 4780 raise AttributeError 4781 4782 import copy_reg 4783 expected = (copy_reg.__newobj__, (A,), ({}, {'spam': 42}), None, None) 4784 self.assertEqual(A().__reduce__(2), expected) 4785 4786 4787def test_main(): 4788 deprecations = [(r'complex divmod\(\), // and % are deprecated$', 4789 DeprecationWarning)] 4790 if sys.py3kwarning: 4791 deprecations += [ 4792 ("classic (int|long) division", DeprecationWarning), 4793 ("coerce.. not supported", DeprecationWarning), 4794 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)] 4795 with test_support.check_warnings(*deprecations): 4796 # Run all local test cases, with PTypesLongInitTest first. 4797 test_support.run_unittest(PTypesLongInitTest, OperatorsTest, 4798 ClassPropertiesAndMethods, DictProxyTests, 4799 PicklingTests) 4800 4801if __name__ == "__main__": 4802 test_main() 4803