10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport __builtin__ 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport gc 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport types 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport weakref 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom copy import deepcopy 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass OperatorsTest(unittest.TestCase): 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, *args, **kwargs): 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unittest.TestCase.__init__(self, *args, **kwargs) 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binops = { 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'add': '+', 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'sub': '-', 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'mul': '*', 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'div': '/', 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'divmod': 'divmod', 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'pow': '**', 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'lshift': '<<', 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'rshift': '>>', 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'and': '&', 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'xor': '^', 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'or': '|', 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'cmp': 'cmp', 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'lt': '<', 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'le': '<=', 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'eq': '==', 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'ne': '!=', 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'gt': '>', 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'ge': '>=', 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi } 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, expr in self.binops.items(): 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if expr.islower(): 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expr = expr + "(a, b)" 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expr = 'a %s b' % expr 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binops[name] = expr 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unops = { 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'pos': '+', 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'neg': '-', 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'abs': 'abs', 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'invert': '~', 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'int': 'int', 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'long': 'long', 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'float': 'float', 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'oct': 'oct', 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'hex': 'hex', 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi } 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, expr in self.unops.items(): 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if expr.islower(): 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expr = expr + "(a)" 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi expr = '%s a' % expr 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unops[name] = expr 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def unop_test(self, a, res, expr="len(a)", meth="__len__"): 640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'a': a} 650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(eval(expr, d), res) 660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Find method in parent class 700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m(a), res) 760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(a, meth) 770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(bm(), res) 780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def binop_test(self, a, b, res, expr="a+b", meth="__add__"): 800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'a': a, 'b': b} 810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # XXX Hack so this passes before 2.3 when -Qnew is specified. 830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if meth == "__div__" and 1/2 == 0.5: 840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi meth = "__truediv__" 850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if meth == '__divmod__': pass 870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(eval(expr, d), res) 890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m(a, b), res) 970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(a, meth) 980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(bm(b), res) 990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"): 1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'a': a, 'b': b, 'c': c} 1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(eval(expr, d), res) 1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m(a, b, c), res) 1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(a, meth) 1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(bm(b, c), res) 1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"): 1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'a': deepcopy(a), 'b': b} 1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec stmt in d 1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d['a'] = deepcopy(a) 1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m(d['a'], b) 1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d['a'] = deepcopy(a) 1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(d['a'], meth) 1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm(b) 1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"): 1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'a': deepcopy(a), 'b': b, 'c': c} 1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec stmt in d 1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d['a'] = deepcopy(a) 1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m(d['a'], b, c) 1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d['a'] = deepcopy(a) 1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(d['a'], meth) 1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm(b, c) 1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d['a'], res) 1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"): 1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d} 1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec stmt in dictionary 1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dictionary['a'], res) 1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = type(a) 1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while meth not in t.__dict__: 1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = t.__bases__[0] 1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = getattr(t, meth) 1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # in some implementations (e.g. PyPy), 'm' can be a regular unbound 1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # method object; the getattr() below obtains its underlying function. 1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth]) 1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dictionary['a'] = deepcopy(a) 1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m(dictionary['a'], b, c, d) 1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dictionary['a'], res) 1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dictionary['a'] = deepcopy(a) 1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm = getattr(dictionary['a'], meth) 1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi bm(b, c, d) 1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dictionary['a'], res) 1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_lists(self): 1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing list operations... 1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Asserts are within individual test methods 1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1], [2], [1,2], "a+b", "__add__") 1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1,2,3], 2, 1, "b in a", "__contains__") 1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1,2,3], 4, 0, "b in a", "__contains__") 1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__") 1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__") 1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setop_test([1], [2], [1,2], "a+=b", "__iadd__") 1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__") 1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test([1,2,3], 3, "len(a)", "__len__") 1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__") 1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__") 1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__") 1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", 1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__setslice__") 1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dicts(self): 1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dict operations... 1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts 1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__") 1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__") 1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__") 1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__") 1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__") 1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {1:2, 3:4} 1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l1 = [] 2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in d.keys(): 2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l1.append(i) 2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in iter(d): 2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in d.__iter__(): 2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in dict.__iter__(d): 2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {1:2, 3:4} 2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test(d, 2, "len(a)", "__len__") 2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(eval(repr(d), {}), d) 2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(eval(d.__repr__(), {}), d) 2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", 2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__setitem__") 2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Tests for unary and binary operators 2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def number_operators(self, a, b, skip=[]): 2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict = {'a': a, 'b': b} 2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, expr in self.binops.items(): 2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name not in skip: 2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = "__%s__" % name 2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(a, name): 2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi res = eval(expr, dict) 2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(a, b, res, expr, name) 2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, expr in self.unops.items(): 2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name not in skip: 2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = "__%s__" % name 2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(a, name): 2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi res = eval(expr, dict) 2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test(a, res, expr, name) 2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_ints(self): 2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing int operations... 2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.number_operators(100, 3) 2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The following crashes in Python 2.2 2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((1).__nonzero__(), 1) 2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((0).__nonzero__(), 0) 2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This returns 'NotImplemented' in Python 2.2 2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(int): 2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __add__(self, other): 2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C(5L), 5) 2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C() + "" 2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("NotImplemented should have caused TypeError") 2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C(sys.maxint+1) 2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except OverflowError: 2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("should have raised OverflowError") 2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_longs(self): 2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing long operations... 2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.number_operators(100L, 3L) 2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_floats(self): 2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing float operations... 2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.number_operators(100.0, 3.0) 2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_complexes(self): 2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing complex operations... 2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 'int', 'long', 'float']) 2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Number(complex): 2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['prec'] 2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, *args, **kwds): 2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi result = complex.__new__(cls, *args) 2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi result.prec = kwds.get('prec', 12) 2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return result 2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi prec = self.prec 2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.imag == 0.0: 2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "%.*g" % (prec, self.real) 2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.real == 0.0: 2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "%.*gj" % (prec, self.imag) 2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) 2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __str__ = __repr__ 2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = Number(3.14, prec=6) 2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "3.14") 2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.prec, 6) 2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = Number(a, prec=2) 2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "3.1") 2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.prec, 2) 2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = Number(234.5) 3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "234.5") 3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.prec, 12) 3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("the module 'xxsubtype' is internal") 3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_spam_lists(self): 3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing spamlist operations... 3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import copy, xxsubtype as spam 3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def spamlist(l, memo=None): 3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import xxsubtype as spam 3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return spam.spamlist(l) 3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This is an ugly hack: 3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi copy._deepcopy_dispatch[spam.spamlist] = spamlist 3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", 3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__add__") 3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__") 3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__") 3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__") 3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]", 3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__getslice__") 3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b", 3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__iadd__") 3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", 3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__imul__") 3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__") 3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", 3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__mul__") 3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", 3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__rmul__") 3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", 3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__setitem__") 3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]), 3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__") 3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test subclassing 3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(spam.spamlist): 3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): return 1 3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, []) 3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foo(), 1) 3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.append(100) 3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [100]) 3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 0) 3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(42) 3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 42) 3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("the module 'xxsubtype' is internal") 3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_spam_dicts(self): 3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing spamdict operations... 3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import copy, xxsubtype as spam 3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def spamdict(d, memo=None): 3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import xxsubtype as spam 3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sd = spam.spamdict() 3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for k, v in d.items(): 3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sd[k] = v 3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return sd 3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This is an ugly hack: 3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi copy._deepcopy_dispatch[spam.spamdict] = spamdict 3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", 3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "__cmp__") 3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__") 3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__") 3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__") 3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = spamdict({1:2,3:4}) 3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l1 = [] 3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in d.keys(): 3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l1.append(i) 3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in iter(d): 3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in d.__iter__(): 3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in type(spamdict({})).__iter__(d): 3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l.append(i) 3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l, l1) 3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi straightd = {1:2, 3:4} 3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spamd = spamdict(straightd) 3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test(spamd, 2, "len(a)", "__len__") 3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__") 3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}), 3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "a[b]=c", "__setitem__") 3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test subclassing 3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(spam.spamdict): 3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): return 1 3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.items(), []) 3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foo(), 1) 3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a['foo'] = 'bar' 3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.items(), [('foo', 'bar')]) 3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 0) 3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(100) 3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 100) 3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ClassPropertiesAndMethods(unittest.TestCase): 4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_python_dicts(self): 4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing Python subclass of dict... 4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(issubclass(dict, dict)) 4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance({}, dict) 4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict() 4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, {}) 4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(d.__class__ is dict) 4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(d, dict) 4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(dict): 4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi state = -1 4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self_local, *a, **kw): 4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if a: 4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(a), 1) 4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self_local.state = a[0] 4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if kw: 4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for k, v in kw.items(): 4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self_local[v] = k 4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, key): 4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.get(key, 0) 4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setitem__(self_local, key, value): 4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(key, type(0)) 4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict.__setitem__(self_local, key, value) 4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setstate(self, state): 4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.state = state 4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getstate(self): 4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.state 4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(issubclass(C, dict)) 4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a1 = C(12) 4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a1.state, 12) 4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a2 = C(foo=1, bar=2) 4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a2[1] == 'foo' and a2[2], 'bar') 4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.state, -1) 4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), -1) 4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(0) 4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.state, 0) 4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 0) 4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(10) 4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.state, 10) 4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 10) 4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[42], 0) 4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[42] = 24 4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[42], 24) 4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi N = 50 4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(N): 4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[i] = C() 4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for j in range(N): 4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[i][j] = i*j 4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(N): 4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for j in range(N): 4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[i][j], i*j) 4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_python_lists(self): 4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing Python subclass of list... 4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(list): 4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, i): 4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return list.__getitem__(self, i) + 100 4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getslice__(self, i, j): 4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return (i, j) 4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.extend([0,1,2]) 4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[0], 100) 4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[1], 101) 4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[2], 102) 4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[100:200], (100,200)) 4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_metaclass(self): 4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __metaclass__... 4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = type 4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__state = 0 4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getstate(self): 4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__state 4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setstate(self, state): 4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__state = state 4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 0) 4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(10) 4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 10) 4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D: 4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class __metaclass__(type): 4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def myself(cls): return cls 4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.myself(), D) 4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.__class__, D) 4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M1(type): 4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, name, bases, dict): 4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict['__spam__'] = 1 4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return type.__new__(cls, name, bases, dict) 4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M1 4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.__spam__, 1) 4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.__spam__, 1) 4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class _instance(object): 4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M2(object): 5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @staticmethod 5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, name, bases, dict): 5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self = object.__new__(cls) 5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.name = name 5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.bases = bases 5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.dict = dict 5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __call__(self): 5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi it = _instance() 5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Early binding of methods 5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for key in self.dict: 5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if key.startswith("__"): 5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi continue 5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(it, key, self.dict[key].__get__(it, self)) 5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return it 5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M2 5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def spam(self): 5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 42 5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.name, 'C') 5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.bases, ()) 5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('spam', C.dict) 5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.spam(), 42) 5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # More metaclass examples 5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class autosuper(type): 5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Automatically add __super to the class 5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This trick only works for dynamic classes 5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(metaclass, name, bases, dict): 5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cls = super(autosuper, metaclass).__new__(metaclass, 5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name, bases, dict) 5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Name mangling for __super removes leading underscores 5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi while name[:1] == "_": 5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = name[1:] 5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name: 5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = "_%s__super" % name 5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name = "__super" 5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(cls, name, super(cls)) 5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return cls 5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A: 5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = autosuper 5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "A" 5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B" + self.__super.meth() 5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C" + self.__super.meth() 5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C, B): 5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D" + self.__super.meth() 5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().meth(), "DCBA") 5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(B, C): 5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "E" + self.__super.meth() 5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().meth(), "EBCA") 5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class autoproperty(type): 5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Automatically create property attributes when methods 5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # named _get_x and/or _set_x are found 5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(metaclass, name, bases, dict): 5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hits = {} 5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for key, val in dict.iteritems(): 5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if key.startswith("_get_"): 5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi key = key[5:] 5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi get, set = hits.get(key, (None, None)) 5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi get = val 5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hits[key] = get, set 5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi elif key.startswith("_set_"): 5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi key = key[5:] 5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi get, set = hits.get(key, (None, None)) 5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi set = val 5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hits[key] = get, set 5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for key, (get, set) in hits.iteritems(): 5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict[key] = property(get, set) 5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(autoproperty, metaclass).__new__(metaclass, 5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name, bases, dict) 5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A: 5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = autoproperty 5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _get_x(self): 5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return -self.__x 5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _set_x(self, x): 5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__x = -x 5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = A() 5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not hasattr(a, "x")) 5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.x = 12 5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 12) 5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a._A__x, -12) 5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class multimetaclass(autoproperty, autosuper): 5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Merge of multiple cooperating metaclasses 5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A: 5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = multimetaclass 5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _get_x(self): 5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "A" 6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _get_x(self): 6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B" + self.__super._get_x() 6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _get_x(self): 6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C" + self.__super._get_x() 6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C, B): 6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def _get_x(self): 6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D" + self.__super._get_x() 6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().x, "DCBA") 6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure type(x) doesn't call x.__class__.__init__ 6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class T(type): 6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi counter = 0 6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, *args): 6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi T.counter += 1 6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = T 6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(T.counter, 1) 6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(a), C) 6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(T.counter, 1) 6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): pass 6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: c() 6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("calling object w/o call method should raise " 6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "TypeError") 6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing code to find most derived baseclass 6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(type): 6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(*args, **kwargs): 6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return type.__new__(*args, **kwargs) 6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = A 6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The most derived metaclass of D is A rather than type. 6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(B, C): 6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_module_subclasses(self): 6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing Python subclass of module... 6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log = [] 6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi MT = type(sys) 6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MM(MT): 6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, name): 6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi MT.__init__(self, name) 6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, name): 6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log.append(("getattr", name)) 6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return MT.__getattribute__(self, name) 6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setattr__(self, name, value): 6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log.append(("setattr", name, value)) 6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi MT.__setattr__(self, name, value) 6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delattr__(self, name): 6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log.append(("delattr", name)) 6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi MT.__delattr__(self, name) 6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = MM("a") 6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 12 6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = a.foo 6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a.foo 6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(log, [("setattr", "foo", 12), 6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("getattr", "foo"), 6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("delattr", "foo")]) 6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # http://python.org/sf/1174712 6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Module(types.ModuleType, str): 6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("inheriting from ModuleType and str at the same time " 6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "should fail") 6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_multiple_inheritence(self): 6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing multiple inheritance... 6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__state = 0 6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getstate(self): 6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__state 6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setstate(self, state): 6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__state = state 6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 0) 6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setstate(10) 6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getstate(), 10) 6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(dict, C): 6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type({}).__init__(self) 6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__init__(self) 6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.keys(), []) 6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d["hello"] = "world" 6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.items(), [("hello", "world")]) 7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d["hello"], "world") 7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.getstate(), 0) 7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.setstate(10) 7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.getstate(), 10) 7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.__mro__, (D, dict, C, object)) 7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF bug #442833 7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Node(object): 7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __int__(self): 7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return int(self.foo()) 7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "23" 7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Frag(Node, list): 7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "42" 7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Node().__int__(), 23) 7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(int(Node()), 23) 7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Frag().__int__(), 42) 7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(int(Frag()), 42) 7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # MI mixing classic and new-style classes. 7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A: 7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 1 7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = 2 7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(B, C): 7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.x, 1) 7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Classic MRO is preserved for a classic base class. 7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D, object): 7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.__mro__, (E, D, B, A, C, object)) 7390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.x, 1) 7400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # But with a mix of classic bases, their MROs are combined using 7420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # new-style MRO. 7430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(B, C, object): 7440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 7450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(F.__mro__, (F, B, C, A, object)) 7460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(F.x, 2) 7470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Try something else. 7490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 7500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def cmethod(self): 7510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C a" 7520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def all_method(self): 7530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C b" 7540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M1(C, object): 7560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def m1method(self): 7570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M1 a" 7580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def all_method(self): 7590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M1 b" 7600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(M1.__mro__, (M1, C, object)) 7620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = M1() 7630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.cmethod(), "C a") 7640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.m1method(), "M1 a") 7650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.all_method(), "M1 b") 7660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 7680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def dmethod(self): 7690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D a" 7700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def all_method(self): 7710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D b" 7720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M2(D, object): 7740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def m2method(self): 7750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M2 a" 7760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def all_method(self): 7770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M2 b" 7780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(M2.__mro__, (M2, D, C, object)) 7800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = M2() 7810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.cmethod(), "C a") 7820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.dmethod(), "D a") 7830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.m2method(), "M2 a") 7840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.all_method(), "M2 b") 7850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 7860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M3(M1, M2, object): 7870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def m3method(self): 7880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M3 a" 7890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def all_method(self): 7900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "M3 b" 7910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object)) 7920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = M3() 7930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.cmethod(), "C a") 7940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.dmethod(), "D a") 7950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.m1method(), "M1 a") 7960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.m2method(), "M2 a") 7970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.m3method(), "M3 a") 7980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.all_method(), "M3 b") 7990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Classic: 8010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 8030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class New(Classic): 8040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = type 8050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 8060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 8080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("new class with only classic bases - shouldn't be") 8090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_diamond_inheritence(self): 8110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing multiple inheritance special cases... 8120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 8130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def spam(self): return "A" 8140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(A().spam(), "A") 8150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 8160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def boo(self): return "B" 8170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def spam(self): return "B" 8180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(B().spam(), "B") 8190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(B().boo(), "B") 8200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 8210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def boo(self): return "C" 8220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C().spam(), "A") 8230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C().boo(), "C") 8240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(B, C): pass 8250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().spam(), "B") 8260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().boo(), "B") 8270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.__mro__, (D, B, C, A, object)) 8280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(C, B): pass 8290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().spam(), "B") 8300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().boo(), "C") 8310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.__mro__, (E, C, B, A, object)) 8320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # MRO order disagreement 8330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 8340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(D, E): pass 8350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 8360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 8380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected MRO order disagreement (F)") 8390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 8400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class G(E, D): pass 8410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 8420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 8430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 8440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected MRO order disagreement (G)") 8450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # see thread python-dev/2002-October/029035.html 8470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_ex5_from_c3_switch(self): 8480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing ex5 from C3 switch discussion... 8490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): pass 8500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): pass 8510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): pass 8520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(A): pass 8530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Y(A): pass 8540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Z(X,B,Y,C): pass 8550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object)) 8560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # see "A Monotonic Superclass Linearization for Dylan", 8580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # by Kim Barrett et al. (OOPSLA 1996) 8590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_monotonicity(self): 8600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing MRO monotonicity... 8610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Boat(object): pass 8620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DayBoat(Boat): pass 8630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class WheelBoat(Boat): pass 8640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class EngineLess(DayBoat): pass 8650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class SmallMultihull(DayBoat): pass 8660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class PedalWheelBoat(EngineLess,WheelBoat): pass 8670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class SmallCatamaran(SmallMultihull): pass 8680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Pedalo(PedalWheelBoat,SmallCatamaran): pass 8690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(PedalWheelBoat.__mro__, 8710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object)) 8720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(SmallCatamaran.__mro__, 8730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (SmallCatamaran, SmallMultihull, DayBoat, Boat, object)) 8740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Pedalo.__mro__, 8750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran, 8760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi SmallMultihull, DayBoat, WheelBoat, Boat, object)) 8770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # see "A Monotonic Superclass Linearization for Dylan", 8790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # by Kim Barrett et al. (OOPSLA 1996) 8800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_consistency_with_epg(self): 8810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing consistency with EPG... 8820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Pane(object): pass 8830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class ScrollingMixin(object): pass 8840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class EditingMixin(object): pass 8850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class ScrollablePane(Pane,ScrollingMixin): pass 8860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class EditablePane(Pane,EditingMixin): pass 8870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class EditableScrollablePane(ScrollablePane,EditablePane): pass 8880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(EditableScrollablePane.__mro__, 8900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (EditableScrollablePane, ScrollablePane, EditablePane, Pane, 8910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ScrollingMixin, EditingMixin, object)) 8920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mro_disagreement(self): 8940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing error messages for MRO disagreement... 8950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mro_err_msg = """Cannot create a consistent method resolution 8960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiorder (MRO) for bases """ 8970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 8980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def raises(exc, expected, callable, *args): 8990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 9000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi callable(*args) 9010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except exc, msg: 9020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the exact msg is generally considered an impl detail 9030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if test_support.check_impl_detail(): 9040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not str(msg).startswith(expected): 9050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Message %r, expected %r" % 9060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (str(msg), expected)) 9070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 9080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Expected %s" % exc) 9090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): pass 9110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): pass 9120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): pass 9130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test some very simple errors 9150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raises(TypeError, "duplicate base class A", 9160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type, "X", (A, A), {}) 9170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raises(TypeError, mro_err_msg, 9180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type, "X", (A, B), {}) 9190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raises(TypeError, mro_err_msg, 9200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type, "X", (A, C, B), {}) 9210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test a slightly more complex error 9220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class GridLayout(object): pass 9230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class HorizontalGrid(GridLayout): pass 9240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class VerticalGrid(GridLayout): pass 9250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class HVGrid(HorizontalGrid, VerticalGrid): pass 9260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class VHGrid(VerticalGrid, HorizontalGrid): pass 9270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raises(TypeError, mro_err_msg, 9280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type, "ConfusedGrid", (HVGrid, VHGrid), {}) 9290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_object_class(self): 9310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing object class... 9320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = object() 9330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__class__, object) 9340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(a), object) 9350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = object() 9360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(a, b) 9370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "foo")) 9380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 9390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 12 9400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, TypeError): 9410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 9420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 9430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("object() should not allow setting a foo attribute") 9440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(object(), "__dict__")) 9450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Cdict(object): 9470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 9480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = Cdict() 9490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.__dict__, {}) 9500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.foo = 1 9510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.foo, 1) 9520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.__dict__, {'foo': 1}) 9530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slots(self): 9550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __slots__... 9560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C0(object): 9570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [] 9580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C0() 9590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "__dict__")) 9600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "foo")) 9610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C1(object): 9630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a'] 9640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C1() 9650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "__dict__")) 9660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "a")) 9670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 1 9680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, 1) 9690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = None 9700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, None) 9710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x.a 9720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "a")) 9730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C3(object): 9750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a', 'b', 'c'] 9760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C3() 9770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, "__dict__")) 9780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, 'a')) 9790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, 'b')) 9800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, 'c')) 9810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 1 9820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.b = 2 9830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.c = 3 9840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, 1) 9850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.b, 2) 9860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.c, 3) 9870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 9880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C4(object): 9890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Validate name mangling""" 9900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['__a'] 9910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, value): 9920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__a = value 9930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def get(self): 9940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__a 9950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C4(5) 9960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, '__dict__')) 9970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(x, '__a')) 9980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.get(), 5) 9990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__a = 6 10010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 10020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Double underscored names not mangled") 10050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 10060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure slot names are proper identifiers 10070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [None] 10100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 10110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("[None] slots not caught") 10140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["foo bar"] 10170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 10180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("['foo bar'] slots not caught") 10210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["foo\0bar"] 10240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 10250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("['foo\\0bar'] slots not caught") 10280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["1"] 10310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 10320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("['1'] slots not caught") 10350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [""] 10380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 10390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("[''] slots not caught") 10420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["a", "a_b", "_a", "A0123456789Z"] 10440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # XXX(nnorwitz): was there supposed to be something tested 10450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # from the class above? 10460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 10470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test a single string is not expanded as a sequence. 10480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = "abc" 10500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 10510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.abc = 5 10520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.abc, 5) 10530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 10540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test unicode slot names 10550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unicode 10570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except NameError: 10580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test a single unicode string is not expanded as a sequence. 10610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = unicode("abc") 10630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 10640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.abc = 5 10650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.abc, 5) 10660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 10670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # _unicode_to_string used to modify slots in certain circumstances 10680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi slots = (unicode("foo"), unicode("bar")) 10690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = slots 10710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C() 10720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.foo = 5 10730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.foo, 5) 10740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(slots[0]), unicode) 10750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # this used to leak references 10760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 10770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [unichr(128)] 10790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (TypeError, UnicodeEncodeError): 10800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 10810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 10820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("[unichr(128)] slots not caught") 10830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 10840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test leaks 10850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Counted(object): 10860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi counter = 0 # counts the number of instances alive 10870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 10880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Counted.counter += 1 10890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 10900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Counted.counter -= 1 10910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 10920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a', 'b', 'c'] 10930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C() 10940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = Counted() 10950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.b = Counted() 10960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.c = Counted() 10970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 3) 10980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 10990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 11000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 0) 11010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 11020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 11030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = D() 11040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = Counted() 11050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.z = Counted() 11060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 2) 11070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 11080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 11090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 0) 11100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D): 11110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['e'] 11120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = E() 11130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = Counted() 11140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.z = Counted() 11150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.e = Counted() 11160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 3) 11170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 11180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 11190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 0) 11200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test cyclical leaks [SF bug 519621] 11220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(object): 11230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a', 'b'] 11240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = F() 11250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s.a = [Counted(), s] 11260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 1) 11270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = None 11280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 11290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Counted.counter, 0) 11300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test lookup leaks [SF bug 572567] 11320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(gc, 'get_objects'): 11330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class G(object): 11340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self, other): 11350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 0 11360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __hash__ = None # Silence Py3k warning 11370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi g = G() 11380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi orig_objects = len(gc.get_objects()) 11390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in xrange(10): 11400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi g==g 11410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi new_objects = len(gc.get_objects()) 11420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(orig_objects, new_objects) 11430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class H(object): 11450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a', 'b'] 11460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 11470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.a = 1 11480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.b = 2 11490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self_): 11500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(self_.a, 1) 11510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(self_.b, 2) 11520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with test_support.captured_output('stderr') as s: 11530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi h = H() 11540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del h 11550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.getvalue(), '') 11560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 11580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = "a" 11590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 11600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del X().a 11610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slots_special(self): 11630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __dict__ and __weakref__ in __slots__... 11640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): 11650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["__dict__"] 11660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = D() 11670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__dict__")) 11680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "__weakref__")) 11690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 42 11700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__dict__, {"foo": 42}) 11710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class W(object): 11730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["__weakref__"] 11740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = W() 11750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__weakref__")) 11760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "__dict__")) 11770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 11780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 42 11790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 11800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 11810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 11820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be allowed to set a.foo") 11830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C1(W, D): 11850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [] 11860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C1() 11870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__dict__")) 11880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__weakref__")) 11890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 42 11900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__dict__, {"foo": 42}) 11910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 11920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C2(D, W): 11930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [] 11940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C2() 11950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__dict__")) 11960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(a, "__weakref__")) 11970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 42 11980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__dict__, {"foo": 42}) 11990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slots_descriptor(self): 12010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Issue2115: slot descriptors did not correctly check 12020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the type of the given object 12030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import abc 12040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MyABC: 12050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = abc.ABCMeta 12060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = "a" 12070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Unrelated(object): 12090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi MyABC.register(Unrelated) 12110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = Unrelated() 12130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(u, MyABC) 12140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This used to crash 12160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, MyABC.a.__set__, u, 3) 12170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_metaclass_cmp(self): 12190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # See bug 7491. 12200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M(type): 12210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self, other): 12220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return -1 12230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 12240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M 12250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(X < M) 12260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dynamics(self): 12280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing class attribute propagation... 12290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): 12300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D): 12320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(D): 12340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.foo = 1 12360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.foo, 1) 12370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test that dynamic attributes are inherited 12380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.foo, 1) 12390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(F.foo, 1) 12400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test dynamic instances 12410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 12420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 12440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "foobar")) 12450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.foobar = 2 12460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foobar, 2) 12470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.method = lambda self: 42 12480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.method(), 42) 12490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__repr__ = lambda self: "C()" 12500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "C()") 12510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__int__ = lambda self: 100 12520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(int(a), 100) 12530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foobar, 2) 12540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "spam")) 12550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mygetattr(self, name): 12560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "spam": 12570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "spam" 12580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError 12590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__getattr__ = mygetattr 12600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.spam, "spam") 12610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.new = 12 12620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.new, 12) 12630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mysetattr(self, name, value): 12640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "spam": 12650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError 12660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return object.__setattr__(self, name, value) 12670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__setattr__ = mysetattr 12680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 12690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.spam = "not spam" 12700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 12710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 12730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected AttributeError") 12740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.spam, "spam") 12750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 12760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 12780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.foo = 1 12790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 1) 12800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test handling of int*seq and seq*int 12820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class I(int): 12830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("a"*I(2), "aa") 12850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(I(2)*"a", "aa") 12860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(2*I(3), 6) 12870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(I(3)*2, 6) 12880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(I(3)*I(2), 6) 12890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test handling of long*seq and seq*long 12910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class L(long): 12920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 12930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("a"*L(2L), "aa") 12940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L(2L)*"a", "aa") 12950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(2*L(3), 6) 12960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L(3)*2, 6) 12970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L(3)*L(2), 6) 12980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 12990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test comparison of classes with dynamic metaclasses 13000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class dynamicmetaclass(type): 13010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class someclass: 13030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = dynamicmetaclass 13040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(someclass, object) 13050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_errors(self): 13070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing errors... 13080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(list, dict): 13100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("inheritance from both list and dict should be illegal") 13150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object, None): 13180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("inheritance from non-type should be illegal") 13230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Classic: 13240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(type(len)): 13280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("inheritance from CFunction should be illegal") 13330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 13360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = 1 13370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("__slots__ = 1 should be illegal") 13410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 13440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [1] 13450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("__slots__ = [1] should be illegal") 13490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M1(type): 13510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M2(type): 13530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A1(object): 13550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M1 13560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A2(object): 13570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M2 13580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 13590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A1, A2): 13600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 13620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 13640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("finding the most derived metaclass should have failed") 13650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_classmethods(self): 13670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing class methods... 13680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 13690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(*a): return a 13700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi goo = classmethod(foo) 13710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 13720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.goo(1), (C, 1)) 13730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.goo(1), (C, 1)) 13740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.foo(1), (c, 1)) 13750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 13760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 13770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 13780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.goo(1), (D, 1)) 13790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.goo(1), (D, 1)) 13800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo(1), (d, 1)) 13810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.foo(d, 1), (d, 1)) 13820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test for a specific crash (SF bug 528132) 13830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(cls, arg): return (cls, arg) 13840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ff = classmethod(f) 13850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(ff.__get__(0, int)(42), (int, 42)) 13860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(ff.__get__(0)(42), (int, 42)) 13870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test super() with classmethods (SF bug 535444) 13890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.goo.im_self, C) 13900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.goo.im_self, D) 13910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(super(D,D).goo.im_self, D) 13920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(super(D,d).goo.im_self, D) 13930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(super(D,D).goo(), (D,)) 13940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(super(D,d).goo(), (D,)) 13950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 13960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Verify that a non-callable will raise 13970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi meth = classmethod(1).__get__(1) 13980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, meth) 13990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Verify that classmethod() doesn't allow keyword args 14010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 14020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi classmethod(f, kw=1) 14030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 14040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 14050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 14060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("classmethod shouldn't accept keyword args") 14070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("the module 'xxsubtype' is internal") 14090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_classmethods_in_c(self): 14100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing C-based class methods... 14110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import xxsubtype as spam 14120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = (1, 2, 3) 14130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {'abc': 123} 14140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, a1, d1 = spam.spamlist.classmeth(*a, **d) 14150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x, spam.spamlist) 14160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, a1) 14170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, d1) 14180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, a1, d1 = spam.spamlist().classmeth(*a, **d) 14190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x, spam.spamlist) 14200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, a1) 14210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, d1) 14220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spam_cm = spam.spamlist.__dict__['classmeth'] 14230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x2, a2, d2 = spam_cm(spam.spamlist, *a, **d) 14240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x2, spam.spamlist) 14250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a2, a1) 14260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d2, d1) 14270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class SubSpam(spam.spamlist): pass 14280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x2, a2, d2 = spam_cm(SubSpam, *a, **d) 14290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x2, SubSpam) 14300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a2, a1) 14310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d2, d1) 14320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(TypeError): 14330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spam_cm() 14340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(TypeError): 14350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spam_cm(spam.spamlist()) 14360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(TypeError): 14370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi spam_cm(list) 14380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_staticmethods(self): 14400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing static methods... 14410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 14420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(*a): return a 14430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi goo = staticmethod(foo) 14440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 14450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.goo(1), (1,)) 14460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.goo(1), (1,)) 14470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.foo(1), (c, 1,)) 14480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 14490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 14500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 14510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.goo(1), (1,)) 14520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.goo(1), (1,)) 14530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo(1), (d, 1)) 14540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.foo(d, 1), (d, 1)) 14550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("the module 'xxsubtype' is internal") 14570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_staticmethods_in_c(self): 14580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing C-based static methods... 14590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import xxsubtype as spam 14600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = (1, 2, 3) 14610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {"abc": 123} 14620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, a1, d1 = spam.spamlist.staticmeth(*a, **d) 14630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x, None) 14640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, a1) 14650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, d1) 14660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, a1, d2 = spam.spamlist().staticmeth(*a, **d) 14670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x, None) 14680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, a1) 14690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, d1) 14700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_classic(self): 14720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing classic classes... 14730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 14740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(*a): return a 14750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi goo = classmethod(foo) 14760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 14770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.goo(1), (C, 1)) 14780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.goo(1), (C, 1)) 14790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.foo(1), (c, 1)) 14800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 14810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 14820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 14830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.goo(1), (D, 1)) 14840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.goo(1), (D, 1)) 14850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo(1), (d, 1)) 14860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.foo(d, 1), (d, 1)) 14870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E: # *not* subclassing from C 14880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi foo = C.foo 14890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().foo, C.foo) # i.e., unbound 14900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method ")) 14910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 14920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_compattr(self): 14930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing computed attributes... 14940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 14950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class computed_attribute(object): 14960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, get, set=None, delete=None): 14970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__get = get 14980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__set = set 14990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__delete = delete 15000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, obj, type=None): 15010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__get(obj) 15020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __set__(self, obj, value): 15030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__set(obj, value) 15040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delete__(self, obj): 15050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__delete(obj) 15060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 15070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__x = 0 15080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get_x(self): 15090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = self.__x 15100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__x = x+1 15110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return x 15120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __set_x(self, x): 15130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__x = x 15140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delete_x(self): 15150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self.__x 15160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = computed_attribute(__get_x, __set_x, __delete_x) 15170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 15180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 0) 15190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 1) 15200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.x = 10 15210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 10) 15220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 11) 15230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a.x 15240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(a, 'x'), 0) 15250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_newslots(self): 15270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __new__ slot override... 15280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(list): 15290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls): 15300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self = list.__new__(cls) 15310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = 1 15320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 15330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 15340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = self.foo + 2 15350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 15360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foo, 3) 15370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__class__, C) 15380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 15390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 15400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = D() 15410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.foo, 3) 15420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.__class__, D) 15430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_altmro(self): 15450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing mro() and overriding it... 15460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 15470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(self): return "A" 15480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 15490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 15500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 15510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(self): return "C" 15520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(B, C): 15530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 15540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.mro(), [D, B, C, A, object]) 15550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.__mro__, (D, B, C, A, object)) 15560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().f(), "C") 15570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class PerverseMetaType(type): 15590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(cls): 15600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L = type.mro(cls) 15610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.reverse() 15620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return L 15630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(D,B,C,A): 15640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = PerverseMetaType 15650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(X.__mro__, (object, A, C, B, D, X)) 15660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(X().f(), "A") 15670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 15690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 15700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class __metaclass__(type): 15710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(self): 15720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [self, dict, object] 15730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # In CPython, the class creation above already raises 15740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # TypeError, as a protection against the fact that 15750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # instances of X would segfault it. In other Python 15760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # implementations it would be ok to let the class X 15770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # be created, but instead get a clean TypeError on the 15780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # __setitem__ below. 15790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = object.__new__(X) 15800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x[5] = 6 15810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 15820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 15830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 15840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("devious mro() return not caught") 15850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 15870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 15880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class __metaclass__(type): 15890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(self): 15900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [1] 15910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 15920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 15930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 15940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("non-class mro() return not caught") 15950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 15960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 15970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 15980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class __metaclass__(type): 15990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(self): 16000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1 16010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 16020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 16030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 16040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("non-sequence mro() return not caught") 16050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_overloading(self): 16070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing operator overloading... 16080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 16100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "Intermediate class because object doesn't have a __setattr__" 16110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(B): 16130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, name): 16140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "foo": 16150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return ("getattr", name) 16160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 16170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError 16180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setattr__(self, name, value): 16190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "foo": 16200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setattr = (name, value) 16210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 16220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return B.__setattr__(self, name, value) 16230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delattr__(self, name): 16240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "foo": 16250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.delattr = name 16260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 16270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return B.__delattr__(self, name) 16280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, key): 16300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return ("getitem", key) 16310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setitem__(self, key, value): 16320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setitem = (key, value) 16330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delitem__(self, key): 16340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.delitem = key 16350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getslice__(self, i, j): 16370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return ("getslice", i, j) 16380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setslice__(self, i, j, value): 16390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.setslice = (i, j, value) 16400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __delslice__(self, i, j): 16410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.delslice = (i, j) 16420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 16440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foo, ("getattr", "foo")) 16450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.foo = 12 16460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.setattr, ("foo", 12)) 16470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a.foo 16480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.delattr, "foo") 16490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[12], ("getitem", 12)) 16510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[12] = 21 16520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.setitem, (12, 21)) 16530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a[12] 16540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.delitem, 12) 16550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[0:10], ("getslice", 0, 10)) 16570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[0:10] = "foo" 16580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.setslice, (0, 10, "foo")) 16590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a[0:10] 16600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.delslice, (0, 10)) 16610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_methods(self): 16630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing methods... 16640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 16650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, x): 16660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.x = x 16670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 16680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.x 16690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c1 = C(1) 16700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c1.foo(), 1) 16710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 16720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi boo = C.foo 16730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi goo = c1.foo 16740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d2 = D(2) 16750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d2.foo(), 2) 16760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d2.boo(), 2) 16770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d2.goo(), 1) 16780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(object): 16790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi foo = C.foo 16800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().foo, C.foo) # i.e., unbound 16810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method ")) 16820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_special_method_lookup(self): 16840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The lookup of special methods bypasses __getattr__ and 16850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # __getattribute__, but they still can be descriptors. 16860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 16870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def run_context(manager): 16880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with manager: 16890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 16900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def iden(self): 16910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 16920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def hello(self): 16930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "hello" 16940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def empty_seq(self): 16950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [] 16960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def zero(self): 16970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 0 16980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def complex_num(self): 16990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1j 17000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def stop(self): 17010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise StopIteration 17020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def return_true(self, thing=None): 17030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return True 17040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_isinstance(obj): 17050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return isinstance(int, obj) 17060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_issubclass(obj): 17070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return issubclass(int, obj) 17080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def swallow(*args): 17090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def do_dict_missing(checker): 17110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DictSub(checker.__class__, dict): 17120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(DictSub()["hi"], 4) 17140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def some_number(self_, key): 17150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(key, "hi") 17160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 4 17170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def format_impl(self, spec): 17180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "hello" 17190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # It would be nice to have every special method tested here, but I'm 17210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # only listing the ones I can remember outside of typeobject.c, since it 17220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # does it right. 17230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi specials = [ 17240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__unicode__", unicode, hello, set(), {}), 17250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__reversed__", reversed, empty_seq, set(), {}), 17260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__length_hint__", list, zero, set(), 17270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi {"__iter__" : iden, "next" : stop}), 17280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__sizeof__", sys.getsizeof, zero, set(), {}), 17290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__instancecheck__", do_isinstance, return_true, set(), {}), 17300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__missing__", do_dict_missing, some_number, 17310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi set(("__class__",)), {}), 17320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__subclasscheck__", do_issubclass, return_true, 17330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi set(("__bases__",)), {}), 17340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__enter__", run_context, iden, set(), {"__exit__" : swallow}), 17350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__exit__", run_context, swallow, set(), {"__enter__" : iden}), 17360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__complex__", complex, complex_num, set(), {}), 17370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__format__", format, format_impl, set(), {}), 17380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("__dir__", dir, empty_seq, set(), {}), 17390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ] 17400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Checker(object): 17420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, attr, test=self): 17430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test.fail("__getattr__ called with {0}".format(attr)) 17440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, attr, test=self): 17450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if attr not in ok: 17460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test.fail("__getattribute__ called with {0}".format(attr)) 17470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return object.__getattribute__(self, attr) 17480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class SpecialDescr(object): 17490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, impl): 17500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.impl = impl 17510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, obj, owner): 17520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi record.append(1) 17530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.impl.__get__(obj, owner) 17540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MyException(Exception): 17550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class ErrDescr(object): 17570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, obj, owner): 17580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise MyException 17590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, runner, meth_impl, ok, env in specials: 17610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(Checker): 17620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for attr, obj in env.iteritems(): 17640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, attr, obj) 17650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, name, meth_impl) 17660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi runner(X()) 17670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi record = [] 17690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(Checker): 17700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for attr, obj in env.iteritems(): 17720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, attr, obj) 17730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, name, SpecialDescr(meth_impl)) 17740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi runner(X()) 17750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(record, [1], name) 17760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(Checker): 17780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for attr, obj in env.iteritems(): 17800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, attr, obj) 17810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(X, name, ErrDescr()) 17820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 17830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi runner(X()) 17840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except MyException: 17850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 17860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 17870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("{0!r} didn't raise".format(name)) 17880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_specials(self): 17900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing special operators... 17910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test operators like __hash__ for which a built-in default exists 17920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 17930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test the default behavior for static classes 17940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 17950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, i): 17960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if 0 <= i < 10: return i 17970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IndexError 17980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c1 = C() 17990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c2 = C() 18000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not not c1) # What? 18010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(id(c1), id(c2)) 18020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(c1) 18030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(c2) 18040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2))) 18050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c1, c1) 18060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(c1 != c2) 18070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not c1 != c1) 18080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not c1 == c2) 18090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Note that the module name appears in str/repr, and that varies 18100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # depending on whether this test is run standalone or from a framework. 18110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(str(c1).find('C object at ') >= 0) 18120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(c1), repr(c1)) 18130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(-1, c1) 18140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(10): 18150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(i, c1) 18160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(10, c1) 18170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test the default behavior for dynamic classes 18180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): 18190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, i): 18200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if 0 <= i < 10: return i 18210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise IndexError 18220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d1 = D() 18230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d2 = D() 18240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not not d1) 18250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(id(d1), id(d2)) 18260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(d1) 18270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(d2) 18280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2))) 18290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d1, d1) 18300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(d1, d2) 18310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not d1 != d1) 18320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not d1 == d2) 18330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Note that the module name appears in str/repr, and that varies 18340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # depending on whether this test is run standalone or from a framework. 18350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(str(d1).find('D object at ') >= 0) 18360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(d1), repr(d1)) 18370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(-1, d1) 18380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(10): 18390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(i, d1) 18400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(10, d1) 18410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test overridden behavior for static classes 18420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Proxy(object): 18430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, x): 18440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.x = x 18450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __nonzero__(self): 18460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return not not self.x 18470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __hash__(self): 18480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return hash(self.x) 18490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 18500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.x == other 18510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __ne__(self, other): 18520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.x != other 18530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self, other): 18540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return cmp(self.x, other.x) 18550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __str__(self): 18560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "Proxy:%s" % self.x 18570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 18580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "Proxy(%r)" % self.x 18590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __contains__(self, value): 18600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return value in self.x 18610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p0 = Proxy(0) 18620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p1 = Proxy(1) 18630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p_1 = Proxy(-1) 18640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(p0) 18650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not not p1) 18660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(p0), hash(0)) 18670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(p0, p0) 18680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(p0, p1) 18690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not p0 != p0) 18700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(not p0, p1) 18710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p1), -1) 18720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p0), 0) 18730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p_1), 1) 18740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(p0), "Proxy:0") 18750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(p0), "Proxy(0)") 18760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p10 = Proxy(range(10)) 18770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(-1, p10) 18780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(10): 18790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(i, p10) 18800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(10, p10) 18810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test overridden behavior for dynamic classes 18820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DProxy(object): 18830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, x): 18840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.x = x 18850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __nonzero__(self): 18860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return not not self.x 18870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __hash__(self): 18880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return hash(self.x) 18890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 18900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.x == other 18910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __ne__(self, other): 18920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.x != other 18930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self, other): 18940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return cmp(self.x, other.x) 18950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __str__(self): 18960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "DProxy:%s" % self.x 18970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 18980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "DProxy(%r)" % self.x 18990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __contains__(self, value): 19000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return value in self.x 19010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p0 = DProxy(0) 19020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p1 = DProxy(1) 19030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p_1 = DProxy(-1) 19040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(p0) 19050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(not not p1) 19060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(p0), hash(0)) 19070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(p0, p0) 19080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(p0, p1) 19090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotEqual(not p0, p0) 19100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(not p0, p1) 19110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p1), -1) 19120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p0), 0) 19130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cmp(p0, p_1), 1) 19140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(p0), "DProxy:0") 19150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(p0), "DProxy(0)") 19160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p10 = DProxy(range(10)) 19170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(-1, p10) 19180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(10): 19190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(i, p10) 19200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertNotIn(10, p10) 19210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 19220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Safety test for __cmp__ 19230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def unsafecmp(a, b): 19240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not hasattr(a, '__cmp__'): 19250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return # some types don't have a __cmp__ any more (so the 19260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # test doesn't make sense any more), or maybe they 19270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # never had a __cmp__ at all, e.g. in PyPy 19280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 19290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.__class__.__cmp__(a, b) 19300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 19310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 19320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 19330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow %s.__cmp__(%r, %r)" % ( 19340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.__class__, a, b)) 19350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 19360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp(u"123", "123") 19370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp("123", u"123") 19380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp(1, 1.0) 19390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp(1.0, 1) 19400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp(1, 1L) 19410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unsafecmp(1L, 1) 19420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 19430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("custom logic for printing to real file objects") 19440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_recursions_1(self): 19450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing recursion checks ... 19460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Letter(str): 19470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, letter): 19480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if letter == 'EPS': 19490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return str.__new__(cls) 19500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return str.__new__(cls, letter) 19510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __str__(self): 19520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not self: 19530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 'EPS' 19540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self 19550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # sys.stdout needs to be the original to trigger the recursion bug 19560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_stdout = sys.stdout 19570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.stdout = test_support.get_original_stdout() 19580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 19590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # nothing should actually be printed, this should raise an exception 19600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi print Letter('w') 19610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 19620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 19630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 19640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected a RuntimeError for print recursion") 19650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 19660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.stdout = test_stdout 19670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 19680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_recursions_2(self): 19690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Bug #1202533. 19700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 19710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 19720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__mul__ = types.MethodType(lambda self, x: self * x, None, A) 19730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 19740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A()*2 19750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 19760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 19770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 19780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected a RuntimeError") 19790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 19800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_weakrefs(self): 19810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing weak references... 19820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import weakref 19830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 19840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 19850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 19860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi r = weakref.ref(c) 19870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(r(), c) 19880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del c 19890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 19900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(r(), None) 19910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del r 19920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class NoWeak(object): 19930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['foo'] 19940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi no = NoWeak() 19950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 19960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi weakref.ref(no) 19970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError, msg: 19980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(str(msg).find("weak reference") >= 0) 19990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 20000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("weakref.ref(no) should be illegal") 20010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Weak(object): 20020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['foo', '__weakref__'] 20030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi yes = Weak() 20040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi r = weakref.ref(yes) 20050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(r(), yes) 20060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del yes 20070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 20080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(r(), None) 20090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del r 20100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_properties(self): 20120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing property... 20130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 20140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getx(self): 20150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__x 20160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setx(self, value): 20170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__x = value 20180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def delx(self): 20190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self.__x 20200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = property(getx, setx, delx, doc="I'm the x property.") 20210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 20220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "x")) 20230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.x = 42 20240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a._C__x, 42) 20250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.x, 42) 20260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a.x 20270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "x")) 20280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "_C__x")) 20290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.x.__set__(a, 100) 20300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.x.__get__(a), 100) 20310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.x.__delete__(a) 20320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(a, "x")) 20330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raw = C.__dict__['x'] 20350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(raw, property) 20360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi attrs = dir(raw) 20380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn("__doc__", attrs) 20390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn("fget", attrs) 20400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn("fset", attrs) 20410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn("fdel", attrs) 20420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(raw.__doc__, "I'm the x property.") 20440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(raw.fget is C.__dict__['getx']) 20450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(raw.fset is C.__dict__['setx']) 20460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(raw.fdel is C.__dict__['delx']) 20470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for attr in "__doc__", "fget", "fset", "fdel": 20490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 20500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(raw, attr, 42) 20510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError, msg: 20520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if str(msg).find('readonly') < 0: 20530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("when setting readonly attr %r on a property, " 20540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "got unexpected TypeError msg %r" % (attr, str(msg))) 20550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 20560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected TypeError from trying to set readonly %r " 20570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "attr on a property" % attr) 20580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): 20600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __getitem__ = property(lambda s: 1/0) 20610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 20630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 20640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in d: 20650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi str(i) 20660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ZeroDivisionError: 20670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 20680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 20690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected ZeroDivisionError from bad property") 20700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @unittest.skipIf(sys.flags.optimize >= 2, 20720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "Docstrings are omitted with -O2 and above") 20730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_properties_doc_attrib(self): 20740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(object): 20750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getter(self): 20760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "getter method" 20770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 0 20780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setter(self_, value): 20790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "setter method" 20800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 20810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi prop = property(getter) 20820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(prop.__doc__, "getter method") 20830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi prop2 = property(fset=setter) 20840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(prop2.__doc__, None) 20850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_testcapi_no_segfault(self): 20870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # this segfaulted in 2.5b2 20880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 20890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import _testcapi 20900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ImportError: 20910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 20920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 20930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 20940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p = property(_testcapi.test_with_docstring) 20950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 20960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_properties_plus(self): 20970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 20980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi foo = property(doc="hello") 20990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.getter 21000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 21010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._foo 21020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.setter 21030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self, value): 21040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._foo = abs(value) 21050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.deleter 21060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 21070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self._foo 21080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 21090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.foo.__doc__, "hello") 21100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(c, "foo")) 21110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.foo = -42 21120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(c, '_foo')) 21130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c._foo, 42) 21140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.foo, 42) 21150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del c.foo 21160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(c, '_foo')) 21170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(hasattr(c, "foo")) 21180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 21200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @C.foo.deleter 21210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 21220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 21230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self._foo 21240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 21250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 21260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 21270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.foo = 24 21280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 24) 21290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del d.foo 21300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del d.foo 21310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(object): 21330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @property 21340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 21350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._foo 21360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.setter 21370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self, value): 21380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError 21390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.setter 21400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self, value): 21410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._foo = abs(value) 21420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.deleter 21430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self, value=None): 21440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self._foo 21450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e = E() 21470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e.foo = -42 21480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(e.foo, 42) 21490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del e.foo 21500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(E): 21520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @E.foo.deleter 21530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self): 21540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del self._foo 21550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @foo.setter 21560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def foo(self, value): 21570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._foo = max(0, value) 21580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = F() 21590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.foo = -10 21600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.foo, 0) 21610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del f.foo 21620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dict_constructors(self): 21640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dict constructor ... 21650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict() 21660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, {}) 21670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict({}) 21680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, {}) 21690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict({1: 2, 'a': 'b'}) 21700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, {1: 2, 'a': 'b'}) 21710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict(d.items())) 21720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict(d.iteritems())) 21730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict({'one':1, 'two':2}) 21740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict(one=1, two=2)) 21750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict(**d)) 21760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict({"one": 1}, two=2)) 21770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict([("two", 2)], one=1)) 21780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict([("one", 100), ("two", 200)], **d)) 21790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict(**d)) 21800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for badarg in 0, 0L, 0j, "0", [0], (0,): 21820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 21830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict(badarg) 21840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 21850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 21860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 21870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if badarg == "0": 21880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # It's a sequence, and its elements are also sequences (gotta 21890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # love strings <wink>), but they aren't of length 2, so this 21900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # one seemed better as a ValueError than a TypeError. 21910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 21920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 21930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from dict(%r)" % badarg) 21940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 21950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from dict(%r)" % badarg) 21960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 21970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 21980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict({}, {}) 21990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 22000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 22010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 22020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from dict({}, {})") 22030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Mapping: 22050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Lacks a .keys() method; will be added later. 22060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict = {1:2, 3:4, 'a':1j} 22070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 22090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict(Mapping()) 22100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 22110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 22120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 22130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from dict(incomplete mapping)") 22140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Mapping.keys = lambda self: self.dict.keys() 22160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Mapping.__getitem__ = lambda self, i: self.dict[i] 22170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict(Mapping()) 22180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, Mapping.dict) 22190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Init from sequence of iterable objects, each producing a 2-sequence. 22210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class AddressBookEntry: 22220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, first, last): 22230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.first = first 22240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.last = last 22250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __iter__(self): 22260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return iter([self.first, self.last]) 22270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict([AddressBookEntry('Tim', 'Warsaw'), 22290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi AddressBookEntry('Barry', 'Peters'), 22300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi AddressBookEntry('Tim', 'Peters'), 22310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi AddressBookEntry('Barry', 'Warsaw')]) 22320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'}) 22330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = dict(zip(range(4), range(1, 5))) 22350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d, dict([(i, i+1) for i in range(4)])) 22360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Bad sequence lengths. 22380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for bad in [('tooshort',)], [('too', 'long', 'by 1')]: 22390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 22400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict(bad) 22410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 22420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 22430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 22440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no ValueError from dict(%r)" % bad) 22450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dir(self): 22470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dir() ... 22480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi junk = 12 22490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(), ['junk', 'self']) 22500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del junk 22510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Just make sure these don't blow up! 22530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir: 22540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir(arg) 22550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Try classic classes. 22570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 22580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Cdata = 1 22590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def Cmethod(self): pass 22600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__'] 22620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(C), cstuff) 22630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(C.Cmethod)) 22640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__. 22660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(c), cstuff) 22670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.cdata = 2 22690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.cmethod = lambda self: 0 22700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod']) 22710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(c.Cmethod)) 22720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(C): 22740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Adata = 1 22750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def Amethod(self): pass 22760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi astuff = ['Adata', 'Amethod'] + cstuff 22780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(A), astuff) 22790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(A.Amethod)) 22800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = A() 22810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(a), astuff) 22820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(a.Amethod)) 22830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.adata = 42 22840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.amethod = lambda self: 3 22850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(a), astuff + ['adata', 'amethod']) 22860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The same, but with new-style classes. Since these have object as a 22880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # base class, a lot more gets sucked in. 22890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def interesting(strings): 22900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [s for s in strings if not s.startswith('_')] 22910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 22930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Cdata = 1 22940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def Cmethod(self): pass 22950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cstuff = ['Cdata', 'Cmethod'] 22970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(C)), cstuff) 22980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 22990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 23000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(c)), cstuff) 23010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(C.Cmethod)) 23020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.cdata = 2 23040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.cmethod = lambda self: 0 23050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod']) 23060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(c.Cmethod)) 23070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(C): 23090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Adata = 1 23100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def Amethod(self): pass 23110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi astuff = ['Adata', 'Amethod'] + cstuff 23130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(A)), astuff) 23140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(A.Amethod)) 23150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = A() 23160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(a)), astuff) 23170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.adata = 42 23180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.amethod = lambda self: 3 23190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod']) 23200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('im_self', dir(a.Amethod)) 23210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Try a module subclass. 23230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M(type(sys)): 23240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 23250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi minstance = M("m") 23260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi minstance.b = 2 23270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi minstance.a = 1 23280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]] 23290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(names, ['a', 'b']) 23300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M2(M): 23320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getdict(self): 23330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "Not a dict!" 23340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __dict__ = property(getdict) 23350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m2instance = M2("m2") 23370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m2instance.b = 2 23380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m2instance.a = 1 23390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m2instance.__dict__, "Not a dict!") 23400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 23410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir(m2instance) 23420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 23430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 23440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Two essentially featureless objects, just inheriting stuff from 23460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # object. 23470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(NotImplemented), dir(Ellipsis)) 23480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if test_support.check_impl_detail(): 23490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # None differs in PyPy: it has a __nonzero__ 23500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dir(None), dir(Ellipsis)) 23510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Nasty test case for proxied objects 23530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Wrapper(object): 23540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, obj): 23550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__obj = obj 23560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 23570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "Wrapper(%s)" % repr(self.__obj) 23580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, key): 23590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return Wrapper(self.__obj[key]) 23600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __len__(self): 23610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return len(self.__obj) 23620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, name): 23630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return Wrapper(getattr(self.__obj, name)) 23640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 23660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getclass(self): 23670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return Wrapper(type(self)) 23680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __class__ = property(__getclass) 23690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dir(C()) # This used to segfault 23710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_supers(self): 23730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing super... 23740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 23760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 23770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "A(%r)" % a 23780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(A().meth(1), "A(1)") 23800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 23820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 23830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__super = super(B, self) 23840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 23850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B(%r)" % a + self.__super.meth(a) 23860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(B().meth(2), "B(2)A(2)") 23880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 23900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 23910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C(%r)" % a + self.__super.meth(a) 23920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C._C__super = super(C) 23930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C().meth(3), "C(3)A(3)") 23950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 23960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C, B): 23970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 23980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D(%r)" % a + super(D, self).meth(a) 23990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)") 24010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test for subclassing super 24030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class mysuper(super): 24050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, *args): 24060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(mysuper, self).__init__(*args) 24070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D): 24090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 24100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "E(%r)" % a + mysuper(E, self).meth(a) 24110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") 24130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(E): 24150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self, a): 24160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = self.__super # == mysuper(F, self) 24170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) 24180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi F._F__super = mysuper(F) 24190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") 24210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure certain errors are raised 24230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 24250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(D, 42) 24260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 24270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 24280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 24290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow super(D, 42)") 24300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 24320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(D, C()) 24330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 24340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 24350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 24360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow super(D, C())") 24370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 24390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(D).__get__(12) 24400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 24410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 24420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 24430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow super(D).__get__(12)") 24440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 24460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(D).__get__(C()) 24470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 24480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 24490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 24500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow super(D).__get__(C())") 24510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure data descriptors can be overridden and accessed via super 24530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (new feature in Python 2.3) 24540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DDbase(object): 24560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getx(self): return 42 24570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = property(getx) 24580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DDsub(DDbase): 24600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getx(self): return "hello" 24610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = property(getx) 24620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dd = DDsub() 24640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dd.x, "hello") 24650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(super(DDsub, dd).x, 42) 24660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Ensure that super() lookup of descriptor from classmethod 24680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # works (SF ID# 743627) 24690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Base(object): 24710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi aProp = property(lambda self: "foo") 24720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Sub(Base): 24740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @classmethod 24750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test(klass): 24760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(Sub,klass).aProp 24770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(Sub.test(), Base.aProp) 24790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Verify that super() doesn't allow keyword args 24810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 24820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(Base, kw=1) 24830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 24840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 24850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 24860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("super shouldn't accept keyword args") 24870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_basic_inheritance(self): 24890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing inheritance from basic types... 24900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 24910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class hexint(int): 24920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 24930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return hex(self) 24940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __add__(self, other): 24950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return hexint(int.__add__(self, other)) 24960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (Note that overriding __radd__ doesn't work, 24970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # because the int type gets first dibs.) 24980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(hexint(7) + 9), "0x10") 24990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(hexint(1000) + 7), "0x3ef") 25000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = hexint(12345) 25010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, 12345) 25020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(int(a), 12345) 25030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(int(a).__class__ is int) 25040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(a), hash(12345)) 25050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((+a).__class__ is int) 25060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a >> 0).__class__ is int) 25070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a << 0).__class__ is int) 25080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((hexint(0) << 12).__class__ is int) 25090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((hexint(0) >> 12).__class__ is int) 25100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 25110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class octlong(long): 25120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [] 25130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __str__(self): 25140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = oct(self) 25150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if s[-1] == 'L': 25160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = s[:-1] 25170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return s 25180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __add__(self, other): 25190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__class__(super(octlong, self).__add__(other)) 25200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __radd__ = __add__ 25210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(octlong(3) + 5), "010") 25220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (Note that overriding __radd__ here only seems to work 25230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # because the example uses a short int left argument.) 25240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(5 + octlong(3000)), "05675") 25250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = octlong(12345) 25260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, 12345L) 25270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(long(a), 12345L) 25280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(a), hash(12345L)) 25290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(long(a).__class__ is long) 25300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((+a).__class__ is long) 25310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((-a).__class__ is long) 25320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((-octlong(0)).__class__ is long) 25330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a >> 0).__class__ is long) 25340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a << 0).__class__ is long) 25350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a - 0).__class__ is long) 25360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 1).__class__ is long) 25370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a ** 1).__class__ is long) 25380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a // 1).__class__ is long) 25390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((1 * a).__class__ is long) 25400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a | 0).__class__ is long) 25410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a ^ 0).__class__ is long) 25420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a & -1L).__class__ is long) 25430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((octlong(0) << 12).__class__ is long) 25440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((octlong(0) >> 12).__class__ is long) 25450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(abs(octlong(0)).__class__ is long) 25460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 25470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Because octlong overrides __add__, we can't check the absence of +0 25480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # optimizations using octlong. 25490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class longclone(long): 25500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 25510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = longclone(1) 25520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a + 0).__class__ is long) 25530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((0 + a).__class__ is long) 25540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 25550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Check that negative clones don't segfault 25560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = longclone(-1) 25570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.__dict__, {}) 25580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit 25590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 25600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class precfloat(float): 25610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['prec'] 25620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, value=0.0, prec=12): 25630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.prec = int(prec) 25640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 25650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "%.*g" % (self.prec, self) 25660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(precfloat(1.1)), "1.1") 25670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = precfloat(12345) 25680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, 12345.0) 25690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(float(a), 12345.0) 25700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(float(a).__class__ is float) 25710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(a), hash(12345.0)) 25720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((+a).__class__ is float) 25730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 25740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class madcomplex(complex): 25750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 25760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "%.17gj%+.17g" % (self.imag, self.real) 25770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = madcomplex(-3, 4) 25780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "4j-3") 25790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi base = complex(-3, 4) 25800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(base.__class__, complex) 25810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, base) 25820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(complex(a), base) 25830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(complex(a).__class__, complex) 25840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = madcomplex(a) # just trying another form of the constructor 25850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(a), "4j-3") 25860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, base) 25870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(complex(a), base) 25880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(complex(a).__class__, complex) 25890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(a), hash(base)) 25900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((+a).__class__, complex) 25910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((a + 0).__class__, complex) 25920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a + 0, base) 25930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((a - 0).__class__, complex) 25940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a - 0, base) 25950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((a * 1).__class__, complex) 25960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a * 1, base) 25970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((a / 1).__class__, complex) 25980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a / 1, base) 25990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 26000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class madtuple(tuple): 26010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _rev = None 26020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def rev(self): 26030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._rev is not None: 26040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 26050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L = list(self) 26060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.reverse() 26070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rev = self.__class__(L) 26080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 26090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = madtuple((1,2,3,4,5,6,7,8,9,0)) 26100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0)) 26110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1))) 26120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0))) 26130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(512): 26140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = madtuple(range(i)) 26150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = t.rev() 26160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi v = u.rev() 26170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(v, t) 26180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = madtuple((1,2,3,4,5)) 26190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(tuple(a), (1,2,3,4,5)) 26200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(tuple(a).__class__ is tuple) 26210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(a), hash((1,2,3,4,5))) 26220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(a[:].__class__ is tuple) 26230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 1).__class__ is tuple) 26240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 0).__class__ is tuple) 26250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a + ()).__class__ is tuple) 26260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = madtuple(()) 26270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(tuple(a), ()) 26280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(tuple(a).__class__ is tuple) 26290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a + a).__class__ is tuple) 26300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 0).__class__ is tuple) 26310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 1).__class__ is tuple) 26320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((a * 2).__class__ is tuple) 26330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(a[:].__class__ is tuple) 26340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 26350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class madstring(str): 26360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _rev = None 26370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def rev(self): 26380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._rev is not None: 26390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 26400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L = list(self) 26410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.reverse() 26420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rev = self.__class__("".join(L)) 26430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 26440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = madstring("abcdefghijklmnopqrstuvwxyz") 26450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz") 26460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba")) 26470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz")) 26480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(256): 26490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = madstring("".join(map(chr, range(i)))) 26500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = s.rev() 26510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = t.rev() 26520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u, s) 26530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = madstring("12345") 26540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(s), "12345") 26550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(str(s).__class__ is str) 26560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 26570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi base = "\x00" * 5 26580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = madstring(base) 26590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s, base) 26600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(s), base) 26610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(str(s).__class__ is str) 26620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(s), hash(base)) 26630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual({s: 1}[base], 1) 26640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual({base: 1}[s], 1) 26650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((s + "").__class__ is str) 26660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s + "", base) 26670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(("" + s).__class__ is str) 26680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("" + s, base) 26690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((s * 0).__class__ is str) 26700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s * 0, "") 26710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((s * 1).__class__ is str) 26720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s * 1, base) 26730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((s * 2).__class__ is str) 26740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s * 2, base + base) 26750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s[:].__class__ is str) 26760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s[:], base) 26770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s[0:0].__class__ is str) 26780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s[0:0], "") 26790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.strip().__class__ is str) 26800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.strip(), base) 26810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.lstrip().__class__ is str) 26820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.lstrip(), base) 26830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.rstrip().__class__ is str) 26840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.rstrip(), base) 26850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi identitytab = ''.join([chr(i) for i in range(256)]) 26860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.translate(identitytab).__class__ is str) 26870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.translate(identitytab), base) 26880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.translate(identitytab, "x").__class__ is str) 26890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.translate(identitytab, "x"), base) 26900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.translate(identitytab, "\x00"), "") 26910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.replace("x", "x").__class__ is str) 26920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.replace("x", "x"), base) 26930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.ljust(len(s)).__class__ is str) 26940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.ljust(len(s)), base) 26950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.rjust(len(s)).__class__ is str) 26960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.rjust(len(s)), base) 26970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.center(len(s)).__class__ is str) 26980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.center(len(s)), base) 26990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(s.lower().__class__ is str) 27000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(s.lower(), base) 27010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class madunicode(unicode): 27030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi _rev = None 27040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def rev(self): 27050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self._rev is not None: 27060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 27070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L = list(self) 27080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.reverse() 27090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self._rev = self.__class__(u"".join(L)) 27100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self._rev 27110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = madunicode("ABCDEF") 27120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u, u"ABCDEF") 27130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.rev(), madunicode(u"FEDCBA")) 27140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF")) 27150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi base = u"12345" 27160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = madunicode(base) 27170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(unicode(u), base) 27180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(unicode(u).__class__ is unicode) 27190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(u), hash(base)) 27200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual({u: 1}[base], 1) 27210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual({base: 1}[u], 1) 27220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.strip().__class__ is unicode) 27230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.strip(), base) 27240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.lstrip().__class__ is unicode) 27250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.lstrip(), base) 27260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.rstrip().__class__ is unicode) 27270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.rstrip(), base) 27280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.replace(u"x", u"x").__class__ is unicode) 27290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.replace(u"x", u"x"), base) 27300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode) 27310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.replace(u"xy", u"xy"), base) 27320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.center(len(u)).__class__ is unicode) 27330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.center(len(u)), base) 27340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.ljust(len(u)).__class__ is unicode) 27350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.ljust(len(u)), base) 27360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.rjust(len(u)).__class__ is unicode) 27370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.rjust(len(u)), base) 27380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.lower().__class__ is unicode) 27390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.lower(), base) 27400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.upper().__class__ is unicode) 27410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.upper(), base) 27420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.capitalize().__class__ is unicode) 27430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.capitalize(), base) 27440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u.title().__class__ is unicode) 27450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.title(), base) 27460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((u + u"").__class__ is unicode) 27470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u + u"", base) 27480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((u"" + u).__class__ is unicode) 27490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u"" + u, base) 27500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((u * 0).__class__ is unicode) 27510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u * 0, u"") 27520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((u * 1).__class__ is unicode) 27530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u * 1, base) 27540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue((u * 2).__class__ is unicode) 27550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u * 2, base + base) 27560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u[:].__class__ is unicode) 27570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u[:], base) 27580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(u[0:0].__class__ is unicode) 27590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u[0:0], u"") 27600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class sublist(list): 27620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 27630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = sublist(range(5)) 27640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(5)) 27650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.append("hello") 27660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(5) + ["hello"]) 27670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[5] = 5 27680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(6)) 27690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.extend(range(6, 20)) 27700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(20)) 27710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[-5:] = [] 27720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(15)) 27730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a[10:15] 27740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(a), 10) 27750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, range(10)) 27760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(list(a), range(10)) 27770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[0], 0) 27780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[9], 9) 27790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[-10], 0) 27800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[-1], 9) 27810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a[:5], range(5)) 27820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class CountedInput(file): 27840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Counts lines read by self.readline(). 27850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.lineno is the 0-based ordinal of the last line read, up to 27870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a maximum of one greater than the number of lines in the file. 27880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.ateof is true if and only if the final "" line has been read, 27900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi at which point self.lineno stops incrementing, and further calls 27910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi to readline() continue to return "". 27920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 27930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 27940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi lineno = 0 27950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ateof = 0 27960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def readline(self): 27970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.ateof: 27980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "" 27990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = file.readline(self) 28000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Next line works too. 28010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # s = super(CountedInput, self).readline() 28020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.lineno += 1 28030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if s == "": 28040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.ateof = 1 28050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return s 28060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = file(name=test_support.TESTFN, mode='w') 28080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi lines = ['a\n', 'b\n', 'c\n'] 28090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 28100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.writelines(lines) 28110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 28120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = CountedInput(test_support.TESTFN) 28130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]): 28140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi got = f.readline() 28150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(expected, got) 28160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.lineno, i) 28170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.ateof, (i > len(lines))) 28180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 28190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 28200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 28210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f.close() 28220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 28230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 28240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.unlink(test_support.TESTFN) 28250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_keywords(self): 28270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing keyword args to basic type constructors ... 28280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(int(x=1), 1) 28290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(float(x=2), 2.0) 28300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(long(x=3), 3L) 28310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(complex(imag=42, real=666), complex(666, 42)) 28320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(object=500), '500') 28330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(unicode(string='abc', errors='strict'), u'abc') 28340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(tuple(sequence=range(3)), (0, 1, 2)) 28350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(list(sequence=(0, 1, 2)), range(3)) 28360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # note: as of Python 2.3, dict() no longer has an "items" keyword arg 28370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for constructor in (int, float, long, complex, str, unicode, 28390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi tuple, list, file): 28400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 28410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi constructor(bogus_keyword_arg=1) 28420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 28430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 28440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 28450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("expected TypeError from bogus keyword argument to %r" 28460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi % constructor) 28470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_str_subclass_as_dict_key(self): 28490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing a str subclass used as dict key .. 28500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class cistr(str): 28520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """Sublcass of str that computes __eq__ case-insensitively. 28530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Also computes a hash code of the string in canonical form. 28550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 28560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, value): 28580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.canonical = value.lower() 28590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.hashcode = hash(self.canonical) 28600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 28620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if not isinstance(other, cistr): 28630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi other = cistr(other) 28640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.canonical == other.canonical 28650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __hash__(self): 28670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.hashcode 28680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(cistr('ABC'), 'abc') 28700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual('aBc', cistr('ABC')) 28710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(cistr('ABC')), 'ABC') 28720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3} 28740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d[cistr('one')], 1) 28750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d[cistr('tWo')], 2) 28760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d[cistr('THrEE')], 3) 28770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn(cistr('ONe'), d) 28780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.get(cistr('thrEE')), 3) 28790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_classic_comparisons(self): 28810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing classic comparisons... 28820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class classic: 28830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 28840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for base in (classic, int, object): 28860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(base): 28870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, value): 28880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.value = int(value) 28890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self, other): 28900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 28910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return cmp(self.value, other.value) 28920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 28930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return cmp(self.value, other) 28940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 28950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __hash__ = None # Silence Py3k warning 28960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 28970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c1 = C(1) 28980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c2 = C(2) 28990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c3 = C(3) 29000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c1, 1) 29010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = {1: c1, 2: c2, 3: c3} 29020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for x in 1, 2, 3: 29030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for y in 1, 2, 3: 29040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) 29050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for op in "<", "<=", "==", "!=", ">", ">=": 29060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), 29070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "x=%d, y=%d" % (x, y)) 29080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y)) 29090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) 29100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 29110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_rich_comparisons(self): 29120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing rich comparisons... 29130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Z(complex): 29140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 29150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi z = Z(1) 29160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(z, 1+0j) 29170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(1+0j, z) 29180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class ZZ(complex): 29190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 29200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 29210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return abs(self - other) <= 1e-6 29220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 29230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __hash__ = None # Silence Py3k warning 29250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi zz = ZZ(1.0000003) 29260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(zz, 1+0j) 29270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(1+0j, zz) 29280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 29290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class classic: 29300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 29310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for base in (classic, int, object, list): 29320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(base): 29330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, value): 29340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.value = int(value) 29350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __cmp__(self_, other): 29360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't call __cmp__") 29370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __hash__ = None # Silence Py3k warning 29380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 29390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value == other.value 29410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value == other 29430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __ne__(self, other): 29450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value != other.value 29470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value != other 29490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __lt__(self, other): 29510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value < other.value 29530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value < other 29550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __le__(self, other): 29570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value <= other.value 29590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value <= other 29610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __gt__(self, other): 29630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value > other.value 29650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value > other 29670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __ge__(self, other): 29690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, C): 29700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value >= other.value 29710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(other, int) or isinstance(other, long): 29720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.value >= other 29730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 29740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c1 = C(1) 29750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c2 = C(2) 29760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c3 = C(3) 29770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c1, 1) 29780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = {1: c1, 2: c2, 3: c3} 29790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for x in 1, 2, 3: 29800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for y in 1, 2, 3: 29810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for op in "<", "<=", "==", "!=", ">", ">=": 29820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), 29830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "x=%d, y=%d" % (x, y)) 29840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op), 29850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "x=%d, y=%d" % (x, y)) 29860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op), 29870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "x=%d, y=%d" % (x, y)) 29880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 29890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_coercions(self): 29900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing coercions... 29910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class I(int): pass 29920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(I(0), 0) 29930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0, I(0)) 29940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class L(long): pass 29950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(L(0), 0) 29960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(L(0), 0L) 29970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0, L(0)) 29980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0L, L(0)) 29990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(float): pass 30000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(F(0), 0) 30010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(F(0), 0L) 30020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(F(0), 0.) 30030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0, F(0)) 30040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0L, F(0)) 30050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0., F(0)) 30060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(complex): pass 30070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(C(0), 0) 30080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(C(0), 0L) 30090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(C(0), 0.) 30100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(C(0), 0j) 30110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0, C(0)) 30120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0L, C(0)) 30130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0., C(0)) 30140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi coerce(0j, C(0)) 30150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 30160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_descrdoc(self): 30170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing descriptor doc strings... 30180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def check(descr, what): 30190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.__doc__, what) 30200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(file.closed, "True if the file is closed") # getset descriptor 30210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(file.name, "file name") # member descriptor 30220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 30230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_doc_descriptor(self): 30240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __doc__ descriptor... 30250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF bug 542984 30260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class DocDescr(object): 30270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, object, otype): 30280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if object: 30290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi object = object.__class__.__name__ + ' instance' 30300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if otype: 30310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi otype = otype.__name__ 30320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 'object=%s; type=%s' % (object, otype) 30330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class OldClass: 30340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __doc__ = DocDescr() 30350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class NewClass(object): 30360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __doc__ = DocDescr() 30370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass') 30380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass') 30390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass') 30400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass') 30410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 30420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_set_class(self): 30430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __class__ assignment... 30440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): pass 30450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): pass 30460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(object): pass 30470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(D, E): pass 30480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in C, D, E, F: 30490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls2 in C, D, E, F: 30500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = cls() 30510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__class__ = cls2 30520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(x.__class__ is cls2) 30530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__class__ = cls 30540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(x.__class__ is cls) 30550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def cant(x, C): 30560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 30570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__class__ = C 30580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 30590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 30600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 30610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow %r.__class__ = %r" % (x, C)) 30620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 30630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi delattr(x, "__class__") 30640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (TypeError, AttributeError): 30650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 30660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 30670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow del %r.__class__" % x) 30680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(C(), list) 30690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(list(), C) 30700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(C(), 1) 30710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(C(), object) 30720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(object(), list) 30730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(list(), object) 30740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Int(int): __slots__ = [] 30750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(2, Int) 30760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(Int(), int) 30770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(True, int) 30780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(2, bool) 30790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o = object() 30800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(o, type(1)) 30810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(o, type(None)) 30820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del o 30830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class G(object): 30840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["a", "b"] 30850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class H(object): 30860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["b", "a"] 30870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 30880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unicode 30890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except NameError: 30900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class I(object): 30910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["a", "b"] 30920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 30930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class I(object): 30940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = [unicode("a"), unicode("b")] 30950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class J(object): 30960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["c", "b"] 30970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class K(object): 30980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["a", "b", "d"] 30990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class L(H): 31000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["e"] 31010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M(I): 31020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["e"] 31030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class N(J): 31040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["__weakref__"] 31050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class P(J): 31060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["__dict__"] 31070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Q(J): 31080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class R(J): 31100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ["__dict__", "__weakref__"] 31110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)): 31130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = cls() 31140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 1 31150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__class__ = cls2 31160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(x.__class__ is cls2, 31170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "assigning %r as __class__ for %r silently failed" % (cls2, x)) 31180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, 1) 31190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__class__ = cls 31200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(x.__class__ is cls, 31210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi "assigning %r as __class__ for %r silently failed" % (cls, x)) 31220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, 1) 31230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in G, J, K, L, M, N, P, R, list, Int: 31240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls2 in G, J, K, L, M, N, P, R, list, Int: 31250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if cls is cls2: 31260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi continue 31270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(cls(), cls2) 31280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Issue5283: when __class__ changes in __del__, the wrong 31300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # type gets DECREF'd. 31310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class O(object): 31320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 31340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 31350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__class__ = O 31360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [A() for x in range(100)] 31370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del l 31380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_set_dict(self): 31400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __dict__ assignment... 31410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): pass 31420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 31430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.__dict__ = {'b': 1} 31440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.b, 1) 31450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def cant(x, dict): 31460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 31470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.__dict__ = dict 31480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, TypeError): 31490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 31510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict)) 31520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(a, None) 31530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(a, []) 31540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(a, 1) 31550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del a.__dict__ # Deleting __dict__ is allowed 31560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Base(object): 31580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def verify_dict_readonly(x): 31600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 31610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x has to be an instance of a class inheriting from Base. 31620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi """ 31630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cant(x, {}) 31640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 31650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x.__dict__ 31660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, TypeError): 31670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 31690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't allow del %r.__dict__" % x) 31700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict_descr = Base.__dict__["__dict__"] 31710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 31720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict_descr.__set__(x, {}) 31730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (AttributeError, TypeError): 31740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 31760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("dict_descr allowed access to %r's dict" % x) 31770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Classes don't allow __dict__ assignment and have readonly dicts 31790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Meta1(type, Base): 31800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Meta2(Base, type): 31820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): 31840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = Meta1 31850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(object): 31860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = Meta2 31870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in C, D, E: 31880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi verify_dict_readonly(cls) 31890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class_dict = cls.__dict__ 31900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 31910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class_dict["spam"] = "eggs" 31920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 31930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 31940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 31950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("%r's __dict__ can be modified" % cls) 31960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 31970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Modules also disallow __dict__ assignment 31980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Module1(types.ModuleType, Base): 31990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Module2(Base, types.ModuleType): 32010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for ModuleType in Module1, Module2: 32030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mod = ModuleType("spam") 32040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi verify_dict_readonly(mod) 32050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mod.__dict__["spam"] = "eggs" 32060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Exception's __dict__ can be replaced, but not deleted 32080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (at least not any more than regular exception's __dict__ can 32090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # be deleted; on CPython it is not the case, whereas on PyPy they 32100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # can, just like any other new-style instance's __dict__.) 32110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def can_delete_dict(e): 32120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 32130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del e.__dict__ 32140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (TypeError, AttributeError): 32150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return False 32160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 32170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return True 32180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Exception1(Exception, Base): 32190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Exception2(Base, Exception): 32210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for ExceptionType in Exception, Exception1, Exception2: 32230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e = ExceptionType() 32240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e.__dict__ = {"a": 1} 32250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(e.a, 1) 32260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError())) 32270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_pickles(self): 32290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing pickling and copying new-style classes and objects... 32300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import pickle, cPickle 32310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def sorteditems(d): 32330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L = d.items() 32340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.sort() 32350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return L 32360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global C 32380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 32390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, a, b): 32400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi super(C, self).__init__() 32410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.a = a 32420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.b = b 32430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 32440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C(%r, %r)" % (self.a, self.b) 32450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global C1 32470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C1(list): 32480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, a, b): 32490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(C1, cls).__new__(cls) 32500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getnewargs__(self): 32510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return (self.a, self.b) 32520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, a, b): 32530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.a = a 32540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.b = b 32550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 32560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C1(%r, %r)<%r>" % (self.a, self.b, list(self)) 32570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global C2 32590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C2(int): 32600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, a, b, val=0): 32610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(C2, cls).__new__(cls, val) 32620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getnewargs__(self): 32630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return (self.a, self.b, int(self)) 32640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, a, b, val=0): 32650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.a = a 32660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.b = b 32670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 32680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C2(%r, %r)<%r>" % (self.a, self.b, int(self)) 32690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global C3 32710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C3(object): 32720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, foo): 32730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = foo 32740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getstate__(self): 32750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.foo 32760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setstate__(self, foo): 32770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = foo 32780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global C4classic, C4 32800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C4classic: # classic 32810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C4(C4classic, object): # mixed inheritance 32830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 32840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for p in pickle, cPickle: 32860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for bin in 0, 1: 32870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in C, C1, C2: 32880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = p.dumps(cls, bin) 32890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cls2 = p.loads(s) 32900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(cls2 is cls) 32910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 32920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C1(1, 2); a.append(42); a.append(24) 32930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = C2("hello", "world", 42) 32940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = p.dumps((a, b), bin) 32950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, y = p.loads(s) 32960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.__class__, a.__class__) 32970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__)) 32980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.__class__, b.__class__) 32990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__)) 33000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(x), repr(a)) 33010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(y), repr(b)) 33020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test for __getstate__ and __setstate__ on new style class 33030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = C3(42) 33040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = p.dumps(u, bin) 33050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi v = p.loads(s) 33060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.__class__, v.__class__) 33070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.foo, v.foo) 33080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test for picklability of hybrid class 33090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u = C4() 33100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi u.foo = 42 33110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi s = p.dumps(u, bin) 33120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi v = p.loads(s) 33130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.__class__, v.__class__) 33140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(u.foo, v.foo) 33150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 33160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing copy.deepcopy() 33170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import copy 33180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in C, C1, C2: 33190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cls2 = copy.deepcopy(cls) 33200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(cls2 is cls) 33210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 33220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C1(1, 2); a.append(42); a.append(24) 33230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = C2("hello", "world", 42) 33240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x, y = copy.deepcopy((a, b)) 33250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.__class__, a.__class__) 33260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__)) 33270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.__class__, b.__class__) 33280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__)) 33290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(x), repr(a)) 33300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(y), repr(b)) 33310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 33320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_pickle_slots(self): 33330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing pickling of classes with __slots__ ... 33340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import pickle, cPickle 33350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Pickling of classes with __slots__ but without __getstate__ should fail 33360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi global B, C, D, E 33370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 33380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for base in [object, B]: 33400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(base): 33410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a'] 33420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 33430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pickle.dumps(C()) 33460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 33470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 33490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("should fail: pickle C instance - %s" % base) 33500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cPickle.dumps(C()) 33520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 33530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 33550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("should fail: cPickle C instance - %s" % base) 33560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pickle.dumps(C()) 33580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 33590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 33610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("should fail: pickle D instance - %s" % base) 33620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi cPickle.dumps(D()) 33640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 33650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 33670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("should fail: cPickle D instance - %s" % base) 33680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Give C a nice generic __getstate__ and __setstate__ 33690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(base): 33700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['a'] 33710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getstate__(self): 33720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = self.__dict__.copy() 33740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 33750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = {} 33760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for cls in self.__class__.__mro__: 33770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for sn in cls.__dict__.get('__slots__', ()): 33780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 33790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d[sn] = getattr(self, sn) 33800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 33810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return d 33830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setstate__(self, d): 33840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for k, v in d.items(): 33850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi setattr(self, k, v) 33860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 33870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 33880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Now it should work 33890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C() 33900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = pickle.loads(pickle.dumps(x)) 33910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(y, 'a'), 0) 33920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = cPickle.loads(cPickle.dumps(x)) 33930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(y, 'a'), 0) 33940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 42 33950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = pickle.loads(pickle.dumps(x)) 33960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a, 42) 33970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = cPickle.loads(cPickle.dumps(x)) 33980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a, 42) 33990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = D() 34000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 42 34010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.b = 100 34020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = pickle.loads(pickle.dumps(x)) 34030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a + y.b, 142) 34040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = cPickle.loads(cPickle.dumps(x)) 34050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a + y.b, 142) 34060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A subclass that adds a slot should also work 34070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(C): 34080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['b'] 34090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = E() 34100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 42 34110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.b = "foo" 34120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = pickle.loads(pickle.dumps(x)) 34130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a, x.a) 34140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.b, x.b) 34150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = cPickle.loads(cPickle.dumps(x)) 34160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.a, x.a) 34170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y.b, x.b) 34180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 34190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_binary_operator_override(self): 34200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing overrides of binary operations... 34210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class I(int): 34220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 34230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "I(%r)" % int(self) 34240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __add__(self, other): 34250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return I(int(self) + int(other)) 34260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __radd__ = __add__ 34270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __pow__(self, other, mod=None): 34280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if mod is None: 34290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return I(pow(int(self), int(other))) 34300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 34310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return I(pow(int(self), int(other), int(mod))) 34320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __rpow__(self, other, mod=None): 34330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if mod is None: 34340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return I(pow(int(other), int(self), mod)) 34350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 34360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return I(pow(int(other), int(self), int(mod))) 34370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 34380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(I(1) + I(2)), "I(3)") 34390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(I(1) + 2), "I(3)") 34400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(1 + I(2)), "I(3)") 34410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(I(2) ** I(3)), "I(8)") 34420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(2 ** I(3)), "I(8)") 34430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(I(2) ** 3), "I(8)") 34440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)") 34450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class S(str): 34460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 34470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.lower() == other.lower() 34480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __hash__ = None # Silence Py3k warning 34490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 34500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_subclass_propagation(self): 34510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing propagation of slot functions to subclasses... 34520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 34530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 34540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 34550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 34560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A): 34570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 34580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(B, C): 34590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 34600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 34610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi orig_hash = hash(d) # related to id(d) in platform-dependent ways 34620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__hash__ = lambda self: 42 34630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 42) 34640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__hash__ = lambda self: 314 34650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 314) 34660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi B.__hash__ = lambda self: 144 34670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 144) 34680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__hash__ = lambda self: 100 34690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 100) 34700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__hash__ = None 34710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, hash, d) 34720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del D.__hash__ 34730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 144) 34740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi B.__hash__ = None 34750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, hash, d) 34760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del B.__hash__ 34770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 314) 34780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__hash__ = None 34790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, hash, d) 34800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del C.__hash__ 34810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), 42) 34820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__hash__ = None 34830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, hash, d) 34840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del A.__hash__ 34850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(d), orig_hash) 34860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.foo = 42 34870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.bar = 42 34880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 42) 34890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.bar, 42) 34900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, name): 34910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == "foo": 34920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 24 34930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return object.__getattribute__(self, name) 34940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__getattribute__ = __getattribute__ 34950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 24) 34960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.bar, 42) 34970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, name): 34980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name in ("spam", "foo", "bar"): 34990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "hello" 35000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError, name 35010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi B.__getattr__ = __getattr__ 35020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.spam, "hello") 35030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 24) 35040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.bar, 42) 35050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del A.__getattribute__ 35060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 42) 35070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del d.foo 35080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, "hello") 35090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.bar, 42) 35100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del B.__getattr__ 35110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 35120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.foo 35130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 35140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 35160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("d.foo should be undefined now") 35170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test a nasty bug in recurse_down_subclasses() 35190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 35200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(A): 35220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del B 35240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 35250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__setitem__ = lambda *a: None # crash 35260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_buffer_inheritance(self): 35280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing that buffer interface is inherited ... 35290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import binascii 35310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF bug [#470040] ParseTuple t# vs subclasses. 35320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MyStr(str): 35340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi base = 'abc' 35360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = MyStr(base) 35370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # b2a_hex uses the buffer interface to get its argument's value, via 35380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # PyArg_ParseTuple 't#' code. 35390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base)) 35400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # It's not clear that unicode will continue to support the character 35420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # buffer interface, and this test will fail if that's taken away. 35430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MyUni(unicode): 35440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi base = u'abc' 35460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = MyUni(base) 35470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base)) 35480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class MyInt(int): 35500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = MyInt(42) 35520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 35530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi binascii.b2a_hex(m) 35540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail('subclass of int should not have a buffer interface') 35550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 35560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_str_of_str_subclass(self): 35590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __str__ defined in subclass of str ... 35600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import binascii 35610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import cStringIO 35620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class octetstring(str): 35640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __str__(self): 35650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return binascii.b2a_hex(self) 35660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __repr__(self): 35670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self + " repr" 35680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o = octetstring('A') 35700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(o), octetstring) 35710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(str(o)), str) 35720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(repr(o)), str) 35730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(ord(o), 0x41) 35740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str(o), '41') 35750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(repr(o), 'A repr') 35760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(o.__str__(), '41') 35770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(o.__repr__(), 'A repr') 35780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi capture = cStringIO.StringIO() 35800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Calling str() or not exercises different internal paths. 35810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi print >> capture, o 35820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi print >> capture, str(o) 35830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(capture.getvalue(), '41\n41\n') 35840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi capture.close() 35850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_keyword_arguments(self): 35870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing keyword arguments to __init__, __call__... 35880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(a): return a 35890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(f.__call__(a=42), 42) 35900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = [] 35910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi list.__init__(a, sequence=[0, 1, 2]) 35920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [0, 1, 2]) 35930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_recursive_call(self): 35950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing recursive __call__() by setting to instance of class... 35960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 35970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 35980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 35990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A.__call__ = A() 36000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 36010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A()() 36020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 36030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 36050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Recursion limit should have been reached for __call__()") 36060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_delete_hook(self): 36080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __del__ hook... 36090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log = [] 36100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 36110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 36120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi log.append(1) 36130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 36140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(log, []) 36150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del c 36160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 36170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(log, [1]) 36180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(object): pass 36200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 36210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: del d[0] 36220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("invalid del() didn't raise TypeError") 36240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_hash_inheritance(self): 36260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing hash of mutable subclasses... 36270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class mydict(dict): 36290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = mydict() 36310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 36320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(d) 36330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 36340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 36360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("hash() of dict subclass should fail") 36370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class mylist(list): 36390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = mylist() 36410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 36420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(d) 36430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 36440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 36460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("hash() of list subclass should fail") 36470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_str_operations(self): 36490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 'a' + 5 36500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'' + 5 doesn't raise TypeError") 36520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: ''.split('') 36540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: pass 36550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("''.split('') doesn't raise ValueError") 36560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: ''.join([0]) 36580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("''.join([0]) doesn't raise TypeError") 36600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: ''.rindex('5') 36620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: pass 36630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("''.rindex('5') doesn't raise ValueError") 36640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%(n)s' % None 36660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%(n)s' % None doesn't raise TypeError") 36680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%(n' % {} 36700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: pass 36710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%(n' % {} '' doesn't raise ValueError") 36720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%*s' % ('abc') 36740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%*s' % ('abc') doesn't raise TypeError") 36760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%*.*s' % ('abc', 5) 36780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError") 36800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%s' % (1, 2) 36820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: pass 36830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%s' % (1, 2) doesn't raise TypeError") 36840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: '%' % None 36860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: pass 36870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: self.fail("'%' % None doesn't raise ValueError") 36880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual('534253'.isdigit(), 1) 36900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual('534253x'.isdigit(), 0) 36910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual('%c' % 5, '\x05') 36920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual('%c' % '5', '5') 36930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 36940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_deepcopy_recursive(self): 36950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing deepcopy of recursive objects... 36960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Node: 36970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 36980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = Node() 36990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = Node() 37000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.b = b 37010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b.a = a 37020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi z = deepcopy(a) # This blew up before 37030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_unintialized_modules(self): 37050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing uninitialized module objects... 37060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi from types import ModuleType as M 37070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m = M.__new__(M) 37080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi str(m) 37090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(m, "__name__"), 0) 37100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(m, "__file__"), 0) 37110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(m, "foo"), 0) 37120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertFalse(m.__dict__) # None or {} are both reasonable answers 37130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi m.foo = 1 37140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(m.__dict__, {"foo": 1}) 37150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_funny_new(self): 37170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __new__ returning something unexpected... 37180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 37190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(cls, arg): 37200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(arg, str): return [1, 2, 3] 37210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi elif isinstance(arg, int): return object.__new__(D) 37220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: return object.__new__(cls) 37230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 37240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, arg): 37250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = arg 37260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C("1"), [1, 2, 3]) 37270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D("1"), [1, 2, 3]) 37280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D(None) 37290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, None) 37300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = C(1) 37310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(isinstance(d, D), True) 37320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 1) 37330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D(1) 37340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(isinstance(d, D), True) 37350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.foo, 1) 37360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_imul_bug(self): 37380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing for __imul__ problems... 37390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF bug 544647 37400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 37410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __imul__(self, other): 37420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return (self, other) 37430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = C() 37440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= 1.0 37460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, 1.0)) 37470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= 2 37490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, 2)) 37500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= 3L 37520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, 3L)) 37530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= 1L<<100 37550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, 1L<<100)) 37560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= None 37580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, None)) 37590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y = x 37600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi y *= "foo" 37610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(y, (x, "foo")) 37620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_copy_setstate(self): 37640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing that copy.*copy() correctly uses __setstate__... 37650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import copy 37660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 37670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, foo=None): 37680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = foo 37690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__foo = foo 37700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setfoo(self, foo=None): 37710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.foo = foo 37720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getfoo(self): 37730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return self.__foo 37740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getstate__(self): 37750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return [self.foo] 37760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setstate__(self_, lst): 37770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(lst), 1) 37780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self_.__foo = self_.foo = lst[0] 37790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C(42) 37800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.setfoo(24) 37810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.foo, 24) 37820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a.getfoo(), 42) 37830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = copy.copy(a) 37840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.foo, 24) 37850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.getfoo(), 24) 37860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = copy.deepcopy(a) 37870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.foo, 24) 37880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(b.getfoo(), 24) 37890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slices(self): 37910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing cases with slices and overridden __getitem__ ... 37920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 37930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Strings 37940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("hello"[:4], "hell") 37950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual("hello"[slice(4)], "hell") 37960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(str.__getitem__("hello", slice(4)), "hell") 37970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class S(str): 37980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, x): 37990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return str.__getitem__(self, x) 38000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(S("hello")[:4], "hell") 38010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(S("hello")[slice(4)], "hell") 38020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(S("hello").__getitem__(slice(4)), "hell") 38030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Tuples 38040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((1,2,3)[:2], (1,2)) 38050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((1,2,3)[slice(2)], (1,2)) 38060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2)) 38070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class T(tuple): 38080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, x): 38090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return tuple.__getitem__(self, x) 38100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(T((1,2,3))[:2], (1,2)) 38110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(T((1,2,3))[slice(2)], (1,2)) 38120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2)) 38130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Lists 38140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual([1,2,3][:2], [1,2]) 38150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual([1,2,3][slice(2)], [1,2]) 38160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2]) 38170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class L(list): 38180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getitem__(self, x): 38190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return list.__getitem__(self, x) 38200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L([1,2,3])[:2], [1,2]) 38210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L([1,2,3])[slice(2)], [1,2]) 38220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2]) 38230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Now do lists and __setitem__ 38240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = L([1,2,3]) 38250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[slice(1, 3)] = [3,2] 38260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [1,3,2]) 38270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a[slice(0, 2, 1)] = [3,1] 38280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [3,1,2]) 38290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.__setitem__(slice(1, 3), [2,1]) 38300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [3,2,1]) 38310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a.__setitem__(slice(0, 2, 1), [2,3]) 38320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a, [2,3,1]) 38330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_subtype_resurrection(self): 38350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing resurrection of new-style instance... 38360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 38380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi container = [] 38390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 38410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # resurrect the instance 38420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.container.append(self) 38430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 38450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.attr = 42 38460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # The most interesting thing here is whether this blows up, due to 38480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 38490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # bug). 38500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del c 38510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # If that didn't blow up, it's also interesting to see whether clearing 38530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # the last container slot works: that will attempt to delete c again, 38540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # which will cause c to get appended back to the container again 38550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # "during" the del. (On non-CPython implementations, however, __del__ 38560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # is typically not called again.) 38570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 38580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(C.container), 1) 38590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del C.container[-1] 38600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if test_support.check_impl_detail(): 38610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 38620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(C.container), 1) 38630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.container[-1].attr, 42) 38640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make c mortal again, so that the test framework with -l doesn't report 38660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # it as a leak. 38670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del C.__del__ 38680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slots_trash(self): 38700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing slot trash... 38710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Deallocating deeply nested slotted trash caused stack overflows 38720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class trash(object): 38730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__ = ['x'] 38740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, x): 38750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.x = x 38760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o = None 38770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in xrange(50000): 38780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o = trash(o) 38790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del o 38800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_slots_multiple_inheritance(self): 38820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF bug 575229, multiple inheritance w/ slots dumps core 38830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 38840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__=() 38850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 38860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 38870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A,B) : 38880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __slots__=() 38890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if test_support.check_impl_detail(): 38900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.__basicsize__, B.__basicsize__) 38910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(C, '__dict__')) 38920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(hasattr(C, '__weakref__')) 38930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C().x = 2 38940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 38950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_rmul(self): 38960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing correct invocation of __rmul__... 38970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF patch 592646 38980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 38990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __mul__(self, other): 39000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "mul" 39010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __rmul__(self, other): 39020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "rmul" 39030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 39040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a*2, "mul") 39050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(a*2.2, "mul") 39060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(2*a, "rmul") 39070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(2.2*a, "rmul") 39080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_ipow(self): 39100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing correct invocation of __ipow__... 39110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # [SF bug 620179] 39120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 39130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __ipow__(self, other): 39140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 39160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a **= 2 39170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mutable_bases(self): 39190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing mutable bases... 39200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # stuff that should work: 39220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 39230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C2(object): 39250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, attr): 39260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if attr == 'a': 39270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 2 39280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(C2, self).__getattribute__(attr) 39300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 39310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1 39320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 39330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D): 39350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d = D() 39370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi e = E() 39380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C,) 39390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C2,) 39400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.meth(), 1) 39410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(e.meth(), 1) 39420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.a, 2) 39430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(e.a, 2) 39440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C2.__subclasses__(), [D]) 39450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del D.__bases__ 39480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except (TypeError, AttributeError): 39490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be able to delete .__bases__") 39520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = () 39550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError, msg: 39560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if str(msg) == "a new-style class can't have only classic bases": 39570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("wrong error message for .__bases__ = ()") 39580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be able to set .__bases__ to ()") 39600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (D,) 39630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 39640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # actually, we'll have crashed by here... 39670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be able to create inheritance cycles") 39680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C, C) 39710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 39720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("didn't detect repeated base classes") 39750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (E,) 39780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 39790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be able to create inheritance cycles") 39820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # let's throw a classic class into the mix: 39840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Classic: 39850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth2(self): 39860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 3 39870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C, Classic) 39890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(d.meth2(), 3) 39910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(e.meth2(), 3) 39920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 39930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi d.a 39940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except AttributeError: 39950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 39960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 39970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("attribute should have vanished") 39980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 39990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 40000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (Classic,) 40010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 40020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("new-style class must have a new-style base") 40050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_builtin_bases(self): 40070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Make sure all the builtin types can have their base queried without 40080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # segfaulting. See issue #5787. 40090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi builtin_types = [tp for tp in __builtin__.__dict__.itervalues() 40100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if isinstance(tp, type)] 40110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for tp in builtin_types: 40120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi object.__getattribute__(tp, "__bases__") 40130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if tp is not object: 40140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(tp.__bases__), 1, tp) 40150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class L(list): 40170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 40200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 40230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 40260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi L.__bases__ = (dict,) 40270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 40280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't turn list subclass into dict subclass") 40310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 40330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi list.__bases__ = (dict,) 40340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 40350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't be able to assign to list.__bases__") 40380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 40400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C, list) 40410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 40420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi assert 0, "best_base calculation found wanting" 40450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mutable_bases_with_failing_mro(self): 40480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing mutable bases with failing mro... 40490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class WorkOnce(type): 40500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __new__(self, name, bases, ns): 40510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.flag = 0 40520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns) 40530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(self): 40540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if self.flag > 0: 40550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError, "bozo" 40560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.flag += 1 40580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return type.mro(self) 40590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class WorkAlways(type): 40610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def mro(self): 40620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # this is here to make sure that .mro()s aren't called 40630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # with an exception set (which was possible at one point). 40640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # An error message will be printed in a debug build. 40650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # What's a good way to test for this? 40660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return type.mro(self) 40670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 40690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C2(object): 40720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 40750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(D): 40780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 40790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class F(D): 40810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = WorkOnce 40820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class G(D): 40840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = WorkAlways 40850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Immediate subclasses have their mro's adjusted in alphabetical 40870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # order, so E's will get adjusted before adjusting F's fails. We 40880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # check here that E's gets restored. 40890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi E_mro_before = E.__mro__ 40910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D_mro_before = D.__mro__ 40920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 40930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 40940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi D.__bases__ = (C2,) 40950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 40960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.__mro__, E_mro_before) 40970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D.__mro__, D_mro_before) 40980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 40990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("exception not propagated") 41000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mutable_bases_catch_mro_conflict(self): 41020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing mutable bases catch mro conflict... 41030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 41040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 41070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(A, B): 41100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(A, B): 41130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(C, D): 41160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 41190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__bases__ = (B, A) 41200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 41210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 41230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("didn't catch MRO conflict") 41240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mutable_names(self): 41260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing mutable names... 41270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 41280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # C.__module__ could be 'test_descr' or '__main__' 41310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi mod = C.__module__ 41320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__name__ = 'D' 41340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((C.__module__, C.__name__), (mod, 'D')) 41350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__name__ = 'D.E' 41370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual((C.__module__, C.__name__), (mod, 'D.E')) 41380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_evil_type_name(self): 41400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A badly placed Py_DECREF in type_set_name led to arbitrary code 41410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # execution while the type structure was not in a sane state, and a 41420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # possible segmentation fault as a result. See bug #16447. 41430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Nasty(str): 41440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 41450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__name__ = "other" 41460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 41480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__name__ = Nasty("abc") 41510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C.__name__ = "normal" 41520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_subclass_right_op(self): 41540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing correct dispatch of subclass overloading __r<op>__... 41550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This code tests various cases where right-dispatch of a subclass 41570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # should be preferred over left-dispatch of a base class. 41580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Case 1: subclass of int; this tests code in abstract.c::binary_op1() 41600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(int): 41620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __floordiv__(self, other): 41630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B.__floordiv__" 41640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __rfloordiv__(self, other): 41650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B.__rfloordiv__" 41660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(B(1) // 1, "B.__floordiv__") 41680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(1 // B(1), "B.__rfloordiv__") 41690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Case 2: subclass of object; this is just the baseline for case 3 41710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 41730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __floordiv__(self, other): 41740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C.__floordiv__" 41750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __rfloordiv__(self, other): 41760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "C.__rfloordiv__" 41770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C() // 1, "C.__floordiv__") 41790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(1 // C(), "C.__rfloordiv__") 41800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Case 3: subclass of new-style class; here it gets interesting 41820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 41840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __floordiv__(self, other): 41850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D.__floordiv__" 41860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __rfloordiv__(self, other): 41870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "D.__rfloordiv__" 41880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(D() // C(), "D.__floordiv__") 41900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C() // D(), "D.__rfloordiv__") 41910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Case 4: this didn't work right in 2.2.2 and 2.3a1 41930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class E(C): 41950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 41960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E.__rfloordiv__, C.__rfloordiv__) 41980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 41990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E() // 1, "C.__floordiv__") 42000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(1 // E(), "C.__rfloordiv__") 42010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(E() // C(), "C.__floordiv__") 42020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail 42030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi @test_support.impl_detail("testing an internal kind of method object") 42050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_meth_class_get(self): 42060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing __get__ method of METH_CLASS C methods... 42070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Full coverage of descrobject.c::classmethod_get() 42080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Baseline 42100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi arg = [1, 2, 3] 42110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi res = {1: None, 2: None, 3: None} 42120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(dict.fromkeys(arg), res) 42130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual({}.fromkeys(arg), res) 42140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Now get the descriptor 42160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr = dict.__dict__["fromkeys"] 42170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # More baseline using the descriptor directly 42190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.__get__(None, dict)(arg), res) 42200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.__get__({})(arg), res) 42210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Now check various error cases 42230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 42240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr.__get__(None, None) 42250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 42260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't have allowed descr.__get__(None, None)") 42290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 42300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr.__get__(42) 42310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 42320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't have allowed descr.__get__(42)") 42350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 42360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr.__get__(None, 42) 42370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 42380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't have allowed descr.__get__(None, 42)") 42410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 42420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr.__get__(None, int) 42430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 42440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("shouldn't have allowed descr.__get__(None, int)") 42470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_isinst_isclass(self): 42490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing proxy isinstance() and isclass()... 42500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Proxy(object): 42510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, obj): 42520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__obj = obj 42530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, name): 42540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name.startswith("_Proxy__"): 42550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return object.__getattribute__(self, name) 42560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return getattr(self.__obj, name) 42580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test with a classic class 42590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 42600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 42620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pa = Proxy(a) 42630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(a, C) # Baseline 42640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(pa, C) # Test 42650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test with a classic subclass 42660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 42670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = D() 42690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pa = Proxy(a) 42700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(a, C) # Baseline 42710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(pa, C) # Test 42720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test with a new-style class 42730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 42740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = C() 42760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pa = Proxy(a) 42770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(a, C) # Baseline 42780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(pa, C) # Test 42790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Test with a new-style subclass 42800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class D(C): 42810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 42820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = D() 42830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pa = Proxy(a) 42840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(a, C) # Baseline 42850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsInstance(pa, C) # Test 42860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_proxy_super(self): 42880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing super() for a proxy object... 42890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Proxy(object): 42900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, obj): 42910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__obj = obj 42920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, name): 42930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name.startswith("_Proxy__"): 42940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return object.__getattribute__(self, name) 42950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 42960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return getattr(self.__obj, name) 42970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 42980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 42990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(self): 43000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return "B.f" 43010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(B): 43030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def f(self): 43040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return super(C, self).f() + "->C.f" 43050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi obj = C() 43070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi p = Proxy(obj) 43080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(C.__dict__["f"](p), "B.f->C.f") 43090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_carloverre(self): 43110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing prohibition of Carlo Verre's hack... 43120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 43130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi object.__setattr__(str, "foo", 42) 43140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 43150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 43160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 43170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Carlo Verre __setattr__ succeeded!") 43180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 43190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi object.__delattr__(str, "lower") 43200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 43210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 43220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 43230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("Carlo Verre __delattr__ succeeded!") 43240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_weakref_segfault(self): 43260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing weakref segfault... 43270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF 742911 43280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import weakref 43290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Provoker: 43310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, referrent): 43320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.ref = weakref.ref(referrent) 43330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __del__(self): 43350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = self.ref() 43360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Oops(object): 43380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 43390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o = Oops() 43410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi o.whatever = Provoker(o) 43420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del o 43430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_wrapper_segfault(self): 43450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF 927248: deeply nested wrappers could cause stack overflow 43460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = lambda:None 43470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in xrange(1000000): 43480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = f.__call__ 43490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi f = None 43500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_file_fault(self): 43520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing sys.stdout is changed in getattr... 43530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_stdout = sys.stdout 43540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class StdoutGuard: 43550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, attr): 43560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.stdout = sys.__stdout__ 43570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise RuntimeError("Premature access to sys.stdout.%s" % attr) 43580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.stdout = StdoutGuard() 43590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 43600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi print "Oops!" 43610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except RuntimeError: 43620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 43630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi finally: 43640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi sys.stdout = test_stdout 43650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_vicious_descriptor_nonsense(self): 43670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing vicious_descriptor_nonsense... 43680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # A potential segfault spotted by Thomas Wouters in mail to 43700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # python-dev 2003-04-17, turned into an example & fixed by Michael 43710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Hudson just less than four months later... 43720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Evil(object): 43740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __hash__(self): 43750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return hash('attr') 43760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __eq__(self, other): 43770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del C.attr 43780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 0 43790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Descr(object): 43810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, ob, type=None): 43820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 1 43830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 43850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi attr = Descr() 43860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 43880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c.__dict__[Evil()] = 0 43890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.attr, 1) 43910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # this makes a crash more likely: 43920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 43930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hasattr(c, 'attr'), False) 43940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 43950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_init(self): 43960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # SF 1155938 43970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Foo(object): 43980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 43990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return 10 44000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 44010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Foo() 44020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 44030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 44040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 44050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("did not test __init__() for None return") 44060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_method_wrapper(self): 44080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing method-wrapper objects... 44090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # <type 'method-wrapper'> did not support any reflection before 2.5 44100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi l = [] 44120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l.__add__, l.__add__) 44130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l.__add__, [].__add__) 44140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__ != [5].__add__) 44150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__ != l.__mul__) 44160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__.__name__ == '__add__') 44170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if hasattr(l.__add__, '__self__'): 44180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # CPython 44190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__.__self__ is l) 44200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__.__objclass__ is list) 44210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 44220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Python implementations where [].__add__ is a normal bound method 44230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__.im_self is l) 44240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(l.__add__.im_class is list) 44250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(l.__add__.__doc__, list.__add__.__doc__) 44260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 44270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi hash(l.__add__) 44280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 44290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 44300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 44310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from hash([].__add__)") 44320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t = () 44340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi t += (7,) 44350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(t.__add__, (7,).__add__) 44360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(hash(t.__add__), hash((7,).__add__)) 44370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_not_implemented(self): 44390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing NotImplemented... 44400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # all binary methods should be able to return a NotImplemented 44410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi import operator 44420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def specialmethod(self, other): 44440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return NotImplemented 44450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def check(expr, x, y): 44470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 44480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi exec expr in {'x': x, 'y': y, 'operator': operator} 44490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except TypeError: 44500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 44510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 44520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.fail("no TypeError from %r" % (expr,)) 44530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 44540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi N1 = sys.maxint + 1L # might trigger OverflowErrors instead of 44550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # TypeErrors 44560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger 44570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # ValueErrors instead of TypeErrors 44580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for metaclass in [type, types.ClassType]: 44590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for name, expr, iexpr in [ 44600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__add__', 'x + y', 'x += y'), 44610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__sub__', 'x - y', 'x -= y'), 44620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__mul__', 'x * y', 'x *= y'), 44630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__truediv__', 'operator.truediv(x, y)', None), 44640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__floordiv__', 'operator.floordiv(x, y)', None), 44650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__div__', 'x / y', 'x /= y'), 44660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__mod__', 'x % y', 'x %= y'), 44670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__divmod__', 'divmod(x, y)', None), 44680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__pow__', 'x ** y', 'x **= y'), 44690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__lshift__', 'x << y', 'x <<= y'), 44700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__rshift__', 'x >> y', 'x >>= y'), 44710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__and__', 'x & y', 'x &= y'), 44720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__or__', 'x | y', 'x |= y'), 44730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__xor__', 'x ^ y', 'x ^= y'), 44740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ('__coerce__', 'coerce(x, y)', None)]: 44750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if name == '__coerce__': 44760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi rname = name 44770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi else: 44780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi rname = '__r' + name[2:] 44790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi A = metaclass('A', (), {name: specialmethod}) 44800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi B = metaclass('B', (), {rname: specialmethod}) 44810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = A() 44820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi b = B() 44830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, a, a) 44840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, a, b) 44850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, b, a) 44860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, b, b) 44870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, a, N1) 44880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, a, N2) 44890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, N1, b) 44900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(expr, N2, b) 44910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if iexpr: 44920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, a, a) 44930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, a, b) 44940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, b, a) 44950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, b, b) 44960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, a, N1) 44970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, a, N2) 44980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi iname = '__i' + name[2:] 44990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi C = metaclass('C', (), {iname: specialmethod}) 45000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 45010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, c, a) 45020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, c, b) 45030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, c, N1) 45040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi check(iexpr, c, N2) 45050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_assign_slice(self): 45070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # ceval.c's assign_slice used to check for 45080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # tp->tp_as_sequence->sq_slice instead of 45090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # tp->tp_as_sequence->sq_ass_slice 45100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 45120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __setslice__(self, start, stop, value): 45130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.value = value 45140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c = C() 45160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi c[1:2] = 3 45170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(c.value, 3) 45180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_set_and_no_get(self): 45200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # See 45210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # http://mail.python.org/pipermail/python-dev/2010-January/095637.html 45220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Descr(object): 45230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self, name): 45250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.name = name 45260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __set__(self, obj, value): 45280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi obj.__dict__[self.name] = value 45290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr = Descr("a") 45300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 45320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi a = descr 45330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = X() 45350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIs(x.a, descr) 45360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.a = 42 45370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x.a, 42) 45380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Also check type_getattro for correctness. 45400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Meta(type): 45410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 45420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 45430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = Meta 45440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi X.a = 42 45450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Meta.a = Descr("a") 45460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(X.a, 42) 45470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_getattr_hooks(self): 45490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # issue 4230 45500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Descriptor(object): 45520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi counter = 0 45530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __get__(self, obj, objtype=None): 45540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def getter(name): 45550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.counter += 1 45560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError(name) 45570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return getter 45580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi descr = Descriptor() 45600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class A(object): 45610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __getattribute__ = descr 45620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 45630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __getattr__ = descr 45640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 45650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __getattribute__ = descr 45660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __getattr__ = descr 45670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, A(), "attr") 45690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.counter, 1) 45700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, B(), "attr") 45710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.counter, 2) 45720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, C(), "attr") 45730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(descr.counter, 4) 45740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class EvilGetattribute(object): 45760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This used to segfault 45770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattr__(self, name): 45780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError(name) 45790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __getattribute__(self, name): 45800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del EvilGetattribute.__getattr__ 45810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for i in range(5): 45820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi gc.collect() 45830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise AttributeError(name) 45840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr") 45860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_type___getattribute__(self): 45880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(TypeError, type.__getattribute__, list, type) 45890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 45900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_abstractmethods(self): 45910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # type pretends not to have __abstractmethods__. 45920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, type, "__abstractmethods__") 45930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class meta(type): 45940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 45950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__") 45960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(object): 45970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 45980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(AttributeError): 45990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del X.__abstractmethods__ 46000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_proxy_call(self): 46020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class FakeStr(object): 46030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __class__ = str 46040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi fake_str = FakeStr() 46060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # isinstance() reads __class__ on new style classes 46070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(isinstance(fake_str, str)) 46080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # call a method descriptor 46100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(TypeError): 46110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi str.split(fake_str) 46120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # call a slot wrapper descriptor 46140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with self.assertRaises(TypeError): 46150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi str.__add__(fake_str, "abc") 46160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_repr_as_str(self): 46180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Issue #11603: crash or infinite loop when rebinding __str__ as 46190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # __repr__. 46200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class Foo(object): 46210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 46220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi Foo.__repr__ = Foo.__str__ 46230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi foo = Foo() 46240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(RuntimeError, str, foo) 46250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertRaises(RuntimeError, repr, foo) 46260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_mixing_slot_wrappers(self): 46280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(dict): 46290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __setattr__ = dict.__setitem__ 46300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = X() 46310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.y = 42 46320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(x["y"], 42) 46330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_cycle_through_dict(self): 46350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # See bug #1469629 46360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class X(dict): 46370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __init__(self): 46380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi dict.__init__(self) 46390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.__dict__ = self 46400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x = X() 46410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi x.attr = 42 46420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi wr = weakref.ref(x) 46430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi del x 46440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.gc_collect() 46450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsNone(wr()) 46460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for o in gc.get_objects(): 46470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIsNot(type(o), X) 46480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass DictProxyTests(unittest.TestCase): 46500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def setUp(self): 46510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C(object): 46520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def meth(self): 46530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 46540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.C = C 46550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_repr(self): 46570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn('dict_proxy({', repr(vars(self.C))) 46580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertIn("'meth':", repr(vars(self.C))) 46590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_iter_keys(self): 46610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dict-proxy iterkeys... 46620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi keys = [ key for key in self.C.__dict__.iterkeys() ] 46630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi keys.sort() 46640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(keys, ['__dict__', '__doc__', '__module__', 46650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi '__weakref__', 'meth']) 46660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_iter_values(self): 46680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dict-proxy itervalues... 46690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi values = [ values for values in self.C.__dict__.itervalues() ] 46700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(len(values), 5) 46710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_iter_items(self): 46730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing dict-proxy iteritems... 46740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi keys = [ key for (key, value) in self.C.__dict__.iteritems() ] 46750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi keys.sort() 46760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(keys, ['__dict__', '__doc__', '__module__', 46770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi '__weakref__', 'meth']) 46780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_dict_type_with_metaclass(self): 46800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing type of __dict__ when __metaclass__ set... 46810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class B(object): 46820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 46830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class M(type): 46840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 46850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class C: 46860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy 46870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi __metaclass__ = M 46880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(type(C.__dict__), type(B.__dict__)) 46890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass PTypesLongInitTest(unittest.TestCase): 46920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This is in its own TestCase so that it can be run before any other tests. 46930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_pytype_long_ready(self): 46940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Testing SF bug 551412 ... 46950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 46960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # This dumps core when SF bug 551412 isn't fixed -- 46970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # but only when test_descr.py is run separately. 46980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (That can't be helped -- as soon as PyType_Ready() 46990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # is called for PyLong_Type, the bug is gone.) 47000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi class UserLong(object): 47010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def __pow__(self, *args): 47020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 47030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 47040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pow(0L, UserLong(), 0L) 47050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except: 47060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 47070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 47080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Another segfault only when run early 47090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # (before PyType_Ready(tuple) is called) 47100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi type.mro(tuple) 47110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 47120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 47130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main(): 47140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi deprecations = [(r'complex divmod\(\), // and % are deprecated$', 47150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi DeprecationWarning)] 47160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if sys.py3kwarning: 47170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi deprecations += [ 47180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("classic (int|long) division", DeprecationWarning), 47190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ("coerce.. not supported", DeprecationWarning), 47200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi (".+__(get|set|del)slice__ has been removed", DeprecationWarning)] 47210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi with test_support.check_warnings(*deprecations): 47220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi # Run all local test cases, with PTypesLongInitTest first. 47230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_support.run_unittest(PTypesLongInitTest, OperatorsTest, 47240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi ClassPropertiesAndMethods, DictProxyTests) 47250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 47260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__": 47270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi test_main() 4728