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