PageRenderTime 61ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/lib-python/modified-2.7/test/test_descr.py

https://bitbucket.org/dac_io/pypy
Python | 4677 lines | 4230 code | 269 blank | 178 comment | 272 complexity | 9cee9a9d8dd24ef7f42c0e2ea08755ca MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. import __builtin__
  2. import sys
  3. import types
  4. import unittest
  5. import popen2 # trigger early the warning from popen2.py
  6. from copy import deepcopy
  7. from test import test_support
  8. class OperatorsTest(unittest.TestCase):
  9. def __init__(self, *args, **kwargs):
  10. unittest.TestCase.__init__(self, *args, **kwargs)
  11. self.binops = {
  12. 'add': '+',
  13. 'sub': '-',
  14. 'mul': '*',
  15. 'div': '/',
  16. 'divmod': 'divmod',
  17. 'pow': '**',
  18. 'lshift': '<<',
  19. 'rshift': '>>',
  20. 'and': '&',
  21. 'xor': '^',
  22. 'or': '|',
  23. 'cmp': 'cmp',
  24. 'lt': '<',
  25. 'le': '<=',
  26. 'eq': '==',
  27. 'ne': '!=',
  28. 'gt': '>',
  29. 'ge': '>=',
  30. }
  31. for name, expr in self.binops.items():
  32. if expr.islower():
  33. expr = expr + "(a, b)"
  34. else:
  35. expr = 'a %s b' % expr
  36. self.binops[name] = expr
  37. self.unops = {
  38. 'pos': '+',
  39. 'neg': '-',
  40. 'abs': 'abs',
  41. 'invert': '~',
  42. 'int': 'int',
  43. 'long': 'long',
  44. 'float': 'float',
  45. 'oct': 'oct',
  46. 'hex': 'hex',
  47. }
  48. for name, expr in self.unops.items():
  49. if expr.islower():
  50. expr = expr + "(a)"
  51. else:
  52. expr = '%s a' % expr
  53. self.unops[name] = expr
  54. def unop_test(self, a, res, expr="len(a)", meth="__len__"):
  55. d = {'a': a}
  56. self.assertEqual(eval(expr, d), res)
  57. t = type(a)
  58. m = getattr(t, meth)
  59. # Find method in parent class
  60. while meth not in t.__dict__:
  61. t = t.__bases__[0]
  62. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  63. # method object; the getattr() below obtains its underlying function.
  64. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  65. self.assertEqual(m(a), res)
  66. bm = getattr(a, meth)
  67. self.assertEqual(bm(), res)
  68. def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
  69. d = {'a': a, 'b': b}
  70. # XXX Hack so this passes before 2.3 when -Qnew is specified.
  71. if meth == "__div__" and 1/2 == 0.5:
  72. meth = "__truediv__"
  73. if meth == '__divmod__': pass
  74. self.assertEqual(eval(expr, d), res)
  75. t = type(a)
  76. m = getattr(t, meth)
  77. while meth not in t.__dict__:
  78. t = t.__bases__[0]
  79. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  80. # method object; the getattr() below obtains its underlying function.
  81. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  82. self.assertEqual(m(a, b), res)
  83. bm = getattr(a, meth)
  84. self.assertEqual(bm(b), res)
  85. def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
  86. d = {'a': a, 'b': b, 'c': c}
  87. self.assertEqual(eval(expr, d), res)
  88. t = type(a)
  89. m = getattr(t, meth)
  90. while meth not in t.__dict__:
  91. t = t.__bases__[0]
  92. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  93. # method object; the getattr() below obtains its underlying function.
  94. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  95. self.assertEqual(m(a, b, c), res)
  96. bm = getattr(a, meth)
  97. self.assertEqual(bm(b, c), res)
  98. def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
  99. d = {'a': deepcopy(a), 'b': b}
  100. exec stmt in d
  101. self.assertEqual(d['a'], res)
  102. t = type(a)
  103. m = getattr(t, meth)
  104. while meth not in t.__dict__:
  105. t = t.__bases__[0]
  106. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  107. # method object; the getattr() below obtains its underlying function.
  108. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  109. d['a'] = deepcopy(a)
  110. m(d['a'], b)
  111. self.assertEqual(d['a'], res)
  112. d['a'] = deepcopy(a)
  113. bm = getattr(d['a'], meth)
  114. bm(b)
  115. self.assertEqual(d['a'], res)
  116. def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
  117. d = {'a': deepcopy(a), 'b': b, 'c': c}
  118. exec stmt in d
  119. self.assertEqual(d['a'], res)
  120. t = type(a)
  121. m = getattr(t, meth)
  122. while meth not in t.__dict__:
  123. t = t.__bases__[0]
  124. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  125. # method object; the getattr() below obtains its underlying function.
  126. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  127. d['a'] = deepcopy(a)
  128. m(d['a'], b, c)
  129. self.assertEqual(d['a'], res)
  130. d['a'] = deepcopy(a)
  131. bm = getattr(d['a'], meth)
  132. bm(b, c)
  133. self.assertEqual(d['a'], res)
  134. def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
  135. dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
  136. exec stmt in dictionary
  137. self.assertEqual(dictionary['a'], res)
  138. t = type(a)
  139. while meth not in t.__dict__:
  140. t = t.__bases__[0]
  141. m = getattr(t, meth)
  142. # in some implementations (e.g. PyPy), 'm' can be a regular unbound
  143. # method object; the getattr() below obtains its underlying function.
  144. self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
  145. dictionary['a'] = deepcopy(a)
  146. m(dictionary['a'], b, c, d)
  147. self.assertEqual(dictionary['a'], res)
  148. dictionary['a'] = deepcopy(a)
  149. bm = getattr(dictionary['a'], meth)
  150. bm(b, c, d)
  151. self.assertEqual(dictionary['a'], res)
  152. def test_lists(self):
  153. # Testing list operations...
  154. # Asserts are within individual test methods
  155. self.binop_test([1], [2], [1,2], "a+b", "__add__")
  156. self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
  157. self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
  158. self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
  159. self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
  160. self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
  161. self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
  162. self.unop_test([1,2,3], 3, "len(a)", "__len__")
  163. self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
  164. self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
  165. self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
  166. self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
  167. "__setslice__")
  168. def test_dicts(self):
  169. # Testing dict operations...
  170. if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts
  171. self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
  172. else:
  173. self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
  174. self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
  175. self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
  176. self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
  177. d = {1:2, 3:4}
  178. l1 = []
  179. for i in d.keys():
  180. l1.append(i)
  181. l = []
  182. for i in iter(d):
  183. l.append(i)
  184. self.assertEqual(l, l1)
  185. l = []
  186. for i in d.__iter__():
  187. l.append(i)
  188. self.assertEqual(l, l1)
  189. l = []
  190. for i in dict.__iter__(d):
  191. l.append(i)
  192. self.assertEqual(l, l1)
  193. d = {1:2, 3:4}
  194. self.unop_test(d, 2, "len(a)", "__len__")
  195. self.assertEqual(eval(repr(d), {}), d)
  196. self.assertEqual(eval(d.__repr__(), {}), d)
  197. self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
  198. "__setitem__")
  199. # Tests for unary and binary operators
  200. def number_operators(self, a, b, skip=[]):
  201. dict = {'a': a, 'b': b}
  202. for name, expr in self.binops.items():
  203. if name not in skip:
  204. name = "__%s__" % name
  205. if hasattr(a, name):
  206. res = eval(expr, dict)
  207. self.binop_test(a, b, res, expr, name)
  208. for name, expr in self.unops.items():
  209. if name not in skip:
  210. name = "__%s__" % name
  211. if hasattr(a, name):
  212. res = eval(expr, dict)
  213. self.unop_test(a, res, expr, name)
  214. def test_ints(self):
  215. # Testing int operations...
  216. self.number_operators(100, 3)
  217. # The following crashes in Python 2.2
  218. self.assertEqual((1).__nonzero__(), 1)
  219. self.assertEqual((0).__nonzero__(), 0)
  220. # This returns 'NotImplemented' in Python 2.2
  221. class C(int):
  222. def __add__(self, other):
  223. return NotImplemented
  224. self.assertEqual(C(5L), 5)
  225. try:
  226. C() + ""
  227. except TypeError:
  228. pass
  229. else:
  230. self.fail("NotImplemented should have caused TypeError")
  231. try:
  232. C(sys.maxint+1)
  233. except OverflowError:
  234. pass
  235. else:
  236. self.fail("should have raised OverflowError")
  237. def test_longs(self):
  238. # Testing long operations...
  239. self.number_operators(100L, 3L)
  240. def test_floats(self):
  241. # Testing float operations...
  242. self.number_operators(100.0, 3.0)
  243. def test_complexes(self):
  244. # Testing complex operations...
  245. self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
  246. 'int', 'long', 'float'])
  247. class Number(complex):
  248. __slots__ = ['prec']
  249. def __new__(cls, *args, **kwds):
  250. result = complex.__new__(cls, *args)
  251. result.prec = kwds.get('prec', 12)
  252. return result
  253. def __repr__(self):
  254. prec = self.prec
  255. if self.imag == 0.0:
  256. return "%.*g" % (prec, self.real)
  257. if self.real == 0.0:
  258. return "%.*gj" % (prec, self.imag)
  259. return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
  260. __str__ = __repr__
  261. a = Number(3.14, prec=6)
  262. self.assertEqual(repr(a), "3.14")
  263. self.assertEqual(a.prec, 6)
  264. a = Number(a, prec=2)
  265. self.assertEqual(repr(a), "3.1")
  266. self.assertEqual(a.prec, 2)
  267. a = Number(234.5)
  268. self.assertEqual(repr(a), "234.5")
  269. self.assertEqual(a.prec, 12)
  270. @test_support.impl_detail("the module 'xxsubtype' is internal")
  271. def test_spam_lists(self):
  272. # Testing spamlist operations...
  273. import copy, xxsubtype as spam
  274. def spamlist(l, memo=None):
  275. import xxsubtype as spam
  276. return spam.spamlist(l)
  277. # This is an ugly hack:
  278. copy._deepcopy_dispatch[spam.spamlist] = spamlist
  279. self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
  280. "__add__")
  281. self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
  282. self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
  283. self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
  284. self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
  285. "__getslice__")
  286. self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
  287. "__iadd__")
  288. self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
  289. "__imul__")
  290. self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
  291. self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
  292. "__mul__")
  293. self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
  294. "__rmul__")
  295. self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
  296. "__setitem__")
  297. self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
  298. spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
  299. # Test subclassing
  300. class C(spam.spamlist):
  301. def foo(self): return 1
  302. a = C()
  303. self.assertEqual(a, [])
  304. self.assertEqual(a.foo(), 1)
  305. a.append(100)
  306. self.assertEqual(a, [100])
  307. self.assertEqual(a.getstate(), 0)
  308. a.setstate(42)
  309. self.assertEqual(a.getstate(), 42)
  310. @test_support.impl_detail("the module 'xxsubtype' is internal")
  311. def test_spam_dicts(self):
  312. # Testing spamdict operations...
  313. import copy, xxsubtype as spam
  314. def spamdict(d, memo=None):
  315. import xxsubtype as spam
  316. sd = spam.spamdict()
  317. for k, v in d.items():
  318. sd[k] = v
  319. return sd
  320. # This is an ugly hack:
  321. copy._deepcopy_dispatch[spam.spamdict] = spamdict
  322. self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
  323. "__cmp__")
  324. self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
  325. self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
  326. self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
  327. d = spamdict({1:2,3:4})
  328. l1 = []
  329. for i in d.keys():
  330. l1.append(i)
  331. l = []
  332. for i in iter(d):
  333. l.append(i)
  334. self.assertEqual(l, l1)
  335. l = []
  336. for i in d.__iter__():
  337. l.append(i)
  338. self.assertEqual(l, l1)
  339. l = []
  340. for i in type(spamdict({})).__iter__(d):
  341. l.append(i)
  342. self.assertEqual(l, l1)
  343. straightd = {1:2, 3:4}
  344. spamd = spamdict(straightd)
  345. self.unop_test(spamd, 2, "len(a)", "__len__")
  346. self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
  347. self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
  348. "a[b]=c", "__setitem__")
  349. # Test subclassing
  350. class C(spam.spamdict):
  351. def foo(self): return 1
  352. a = C()
  353. self.assertEqual(a.items(), [])
  354. self.assertEqual(a.foo(), 1)
  355. a['foo'] = 'bar'
  356. self.assertEqual(a.items(), [('foo', 'bar')])
  357. self.assertEqual(a.getstate(), 0)
  358. a.setstate(100)
  359. self.assertEqual(a.getstate(), 100)
  360. class ClassPropertiesAndMethods(unittest.TestCase):
  361. def test_python_dicts(self):
  362. # Testing Python subclass of dict...
  363. self.assertTrue(issubclass(dict, dict))
  364. self.assertIsInstance({}, dict)
  365. d = dict()
  366. self.assertEqual(d, {})
  367. self.assertTrue(d.__class__ is dict)
  368. self.assertIsInstance(d, dict)
  369. class C(dict):
  370. state = -1
  371. def __init__(self_local, *a, **kw):
  372. if a:
  373. self.assertEqual(len(a), 1)
  374. self_local.state = a[0]
  375. if kw:
  376. for k, v in kw.items():
  377. self_local[v] = k
  378. def __getitem__(self, key):
  379. return self.get(key, 0)
  380. def __setitem__(self_local, key, value):
  381. self.assertIsInstance(key, type(0))
  382. dict.__setitem__(self_local, key, value)
  383. def setstate(self, state):
  384. self.state = state
  385. def getstate(self):
  386. return self.state
  387. self.assertTrue(issubclass(C, dict))
  388. a1 = C(12)
  389. self.assertEqual(a1.state, 12)
  390. a2 = C(foo=1, bar=2)
  391. self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
  392. a = C()
  393. self.assertEqual(a.state, -1)
  394. self.assertEqual(a.getstate(), -1)
  395. a.setstate(0)
  396. self.assertEqual(a.state, 0)
  397. self.assertEqual(a.getstate(), 0)
  398. a.setstate(10)
  399. self.assertEqual(a.state, 10)
  400. self.assertEqual(a.getstate(), 10)
  401. self.assertEqual(a[42], 0)
  402. a[42] = 24
  403. self.assertEqual(a[42], 24)
  404. N = 50
  405. for i in range(N):
  406. a[i] = C()
  407. for j in range(N):
  408. a[i][j] = i*j
  409. for i in range(N):
  410. for j in range(N):
  411. self.assertEqual(a[i][j], i*j)
  412. def test_python_lists(self):
  413. # Testing Python subclass of list...
  414. class C(list):
  415. def __getitem__(self, i):
  416. return list.__getitem__(self, i) + 100
  417. def __getslice__(self, i, j):
  418. return (i, j)
  419. a = C()
  420. a.extend([0,1,2])
  421. self.assertEqual(a[0], 100)
  422. self.assertEqual(a[1], 101)
  423. self.assertEqual(a[2], 102)
  424. self.assertEqual(a[100:200], (100,200))
  425. def test_metaclass(self):
  426. # Testing __metaclass__...
  427. class C:
  428. __metaclass__ = type
  429. def __init__(self):
  430. self.__state = 0
  431. def getstate(self):
  432. return self.__state
  433. def setstate(self, state):
  434. self.__state = state
  435. a = C()
  436. self.assertEqual(a.getstate(), 0)
  437. a.setstate(10)
  438. self.assertEqual(a.getstate(), 10)
  439. class D:
  440. class __metaclass__(type):
  441. def myself(cls): return cls
  442. self.assertEqual(D.myself(), D)
  443. d = D()
  444. self.assertEqual(d.__class__, D)
  445. class M1(type):
  446. def __new__(cls, name, bases, dict):
  447. dict['__spam__'] = 1
  448. return type.__new__(cls, name, bases, dict)
  449. class C:
  450. __metaclass__ = M1
  451. self.assertEqual(C.__spam__, 1)
  452. c = C()
  453. self.assertEqual(c.__spam__, 1)
  454. class _instance(object):
  455. pass
  456. class M2(object):
  457. @staticmethod
  458. def __new__(cls, name, bases, dict):
  459. self = object.__new__(cls)
  460. self.name = name
  461. self.bases = bases
  462. self.dict = dict
  463. return self
  464. def __call__(self):
  465. it = _instance()
  466. # Early binding of methods
  467. for key in self.dict:
  468. if key.startswith("__"):
  469. continue
  470. setattr(it, key, self.dict[key].__get__(it, self))
  471. return it
  472. class C:
  473. __metaclass__ = M2
  474. def spam(self):
  475. return 42
  476. self.assertEqual(C.name, 'C')
  477. self.assertEqual(C.bases, ())
  478. self.assertIn('spam', C.dict)
  479. c = C()
  480. self.assertEqual(c.spam(), 42)
  481. # More metaclass examples
  482. class autosuper(type):
  483. # Automatically add __super to the class
  484. # This trick only works for dynamic classes
  485. def __new__(metaclass, name, bases, dict):
  486. cls = super(autosuper, metaclass).__new__(metaclass,
  487. name, bases, dict)
  488. # Name mangling for __super removes leading underscores
  489. while name[:1] == "_":
  490. name = name[1:]
  491. if name:
  492. name = "_%s__super" % name
  493. else:
  494. name = "__super"
  495. setattr(cls, name, super(cls))
  496. return cls
  497. class A:
  498. __metaclass__ = autosuper
  499. def meth(self):
  500. return "A"
  501. class B(A):
  502. def meth(self):
  503. return "B" + self.__super.meth()
  504. class C(A):
  505. def meth(self):
  506. return "C" + self.__super.meth()
  507. class D(C, B):
  508. def meth(self):
  509. return "D" + self.__super.meth()
  510. self.assertEqual(D().meth(), "DCBA")
  511. class E(B, C):
  512. def meth(self):
  513. return "E" + self.__super.meth()
  514. self.assertEqual(E().meth(), "EBCA")
  515. class autoproperty(type):
  516. # Automatically create property attributes when methods
  517. # named _get_x and/or _set_x are found
  518. def __new__(metaclass, name, bases, dict):
  519. hits = {}
  520. for key, val in dict.iteritems():
  521. if key.startswith("_get_"):
  522. key = key[5:]
  523. get, set = hits.get(key, (None, None))
  524. get = val
  525. hits[key] = get, set
  526. elif key.startswith("_set_"):
  527. key = key[5:]
  528. get, set = hits.get(key, (None, None))
  529. set = val
  530. hits[key] = get, set
  531. for key, (get, set) in hits.iteritems():
  532. dict[key] = property(get, set)
  533. return super(autoproperty, metaclass).__new__(metaclass,
  534. name, bases, dict)
  535. class A:
  536. __metaclass__ = autoproperty
  537. def _get_x(self):
  538. return -self.__x
  539. def _set_x(self, x):
  540. self.__x = -x
  541. a = A()
  542. self.assertTrue(not hasattr(a, "x"))
  543. a.x = 12
  544. self.assertEqual(a.x, 12)
  545. self.assertEqual(a._A__x, -12)
  546. class multimetaclass(autoproperty, autosuper):
  547. # Merge of multiple cooperating metaclasses
  548. pass
  549. class A:
  550. __metaclass__ = multimetaclass
  551. def _get_x(self):
  552. return "A"
  553. class B(A):
  554. def _get_x(self):
  555. return "B" + self.__super._get_x()
  556. class C(A):
  557. def _get_x(self):
  558. return "C" + self.__super._get_x()
  559. class D(C, B):
  560. def _get_x(self):
  561. return "D" + self.__super._get_x()
  562. self.assertEqual(D().x, "DCBA")
  563. # Make sure type(x) doesn't call x.__class__.__init__
  564. class T(type):
  565. counter = 0
  566. def __init__(self, *args):
  567. T.counter += 1
  568. class C:
  569. __metaclass__ = T
  570. self.assertEqual(T.counter, 1)
  571. a = C()
  572. self.assertEqual(type(a), C)
  573. self.assertEqual(T.counter, 1)
  574. class C(object): pass
  575. c = C()
  576. try: c()
  577. except TypeError: pass
  578. else: self.fail("calling object w/o call method should raise "
  579. "TypeError")
  580. # Testing code to find most derived baseclass
  581. class A(type):
  582. def __new__(*args, **kwargs):
  583. return type.__new__(*args, **kwargs)
  584. class B(object):
  585. pass
  586. class C(object):
  587. __metaclass__ = A
  588. # The most derived metaclass of D is A rather than type.
  589. class D(B, C):
  590. pass
  591. def test_module_subclasses(self):
  592. # Testing Python subclass of module...
  593. log = []
  594. MT = type(sys)
  595. class MM(MT):
  596. def __init__(self, name):
  597. MT.__init__(self, name)
  598. def __getattribute__(self, name):
  599. log.append(("getattr", name))
  600. return MT.__getattribute__(self, name)
  601. def __setattr__(self, name, value):
  602. log.append(("setattr", name, value))
  603. MT.__setattr__(self, name, value)
  604. def __delattr__(self, name):
  605. log.append(("delattr", name))
  606. MT.__delattr__(self, name)
  607. a = MM("a")
  608. a.foo = 12
  609. x = a.foo
  610. del a.foo
  611. self.assertEqual(log, [("setattr", "foo", 12),
  612. ("getattr", "foo"),
  613. ("delattr", "foo")])
  614. # http://python.org/sf/1174712
  615. try:
  616. class Module(types.ModuleType, str):
  617. pass
  618. except TypeError:
  619. pass
  620. else:
  621. self.fail("inheriting from ModuleType and str at the same time "
  622. "should fail")
  623. def test_multiple_inheritence(self):
  624. # Testing multiple inheritance...
  625. class C(object):
  626. def __init__(self):
  627. self.__state = 0
  628. def getstate(self):
  629. return self.__state
  630. def setstate(self, state):
  631. self.__state = state
  632. a = C()
  633. self.assertEqual(a.getstate(), 0)
  634. a.setstate(10)
  635. self.assertEqual(a.getstate(), 10)
  636. class D(dict, C):
  637. def __init__(self):
  638. type({}).__init__(self)
  639. C.__init__(self)
  640. d = D()
  641. self.assertEqual(d.keys(), [])
  642. d["hello"] = "world"
  643. self.assertEqual(d.items(), [("hello", "world")])
  644. self.assertEqual(d["hello"], "world")
  645. self.assertEqual(d.getstate(), 0)
  646. d.setstate(10)
  647. self.assertEqual(d.getstate(), 10)
  648. self.assertEqual(D.__mro__, (D, dict, C, object))
  649. # SF bug #442833
  650. class Node(object):
  651. def __int__(self):
  652. return int(self.foo())
  653. def foo(self):
  654. return "23"
  655. class Frag(Node, list):
  656. def foo(self):
  657. return "42"
  658. self.assertEqual(Node().__int__(), 23)
  659. self.assertEqual(int(Node()), 23)
  660. self.assertEqual(Frag().__int__(), 42)
  661. self.assertEqual(int(Frag()), 42)
  662. # MI mixing classic and new-style classes.
  663. class A:
  664. x = 1
  665. class B(A):
  666. pass
  667. class C(A):
  668. x = 2
  669. class D(B, C):
  670. pass
  671. self.assertEqual(D.x, 1)
  672. # Classic MRO is preserved for a classic base class.
  673. class E(D, object):
  674. pass
  675. self.assertEqual(E.__mro__, (E, D, B, A, C, object))
  676. self.assertEqual(E.x, 1)
  677. # But with a mix of classic bases, their MROs are combined using
  678. # new-style MRO.
  679. class F(B, C, object):
  680. pass
  681. self.assertEqual(F.__mro__, (F, B, C, A, object))
  682. self.assertEqual(F.x, 2)
  683. # Try something else.
  684. class C:
  685. def cmethod(self):
  686. return "C a"
  687. def all_method(self):
  688. return "C b"
  689. class M1(C, object):
  690. def m1method(self):
  691. return "M1 a"
  692. def all_method(self):
  693. return "M1 b"
  694. self.assertEqual(M1.__mro__, (M1, C, object))
  695. m = M1()
  696. self.assertEqual(m.cmethod(), "C a")
  697. self.assertEqual(m.m1method(), "M1 a")
  698. self.assertEqual(m.all_method(), "M1 b")
  699. class D(C):
  700. def dmethod(self):
  701. return "D a"
  702. def all_method(self):
  703. return "D b"
  704. class M2(D, object):
  705. def m2method(self):
  706. return "M2 a"
  707. def all_method(self):
  708. return "M2 b"
  709. self.assertEqual(M2.__mro__, (M2, D, C, object))
  710. m = M2()
  711. self.assertEqual(m.cmethod(), "C a")
  712. self.assertEqual(m.dmethod(), "D a")
  713. self.assertEqual(m.m2method(), "M2 a")
  714. self.assertEqual(m.all_method(), "M2 b")
  715. class M3(M1, M2, object):
  716. def m3method(self):
  717. return "M3 a"
  718. def all_method(self):
  719. return "M3 b"
  720. self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
  721. m = M3()
  722. self.assertEqual(m.cmethod(), "C a")
  723. self.assertEqual(m.dmethod(), "D a")
  724. self.assertEqual(m.m1method(), "M1 a")
  725. self.assertEqual(m.m2method(), "M2 a")
  726. self.assertEqual(m.m3method(), "M3 a")
  727. self.assertEqual(m.all_method(), "M3 b")
  728. class Classic:
  729. pass
  730. try:
  731. class New(Classic):
  732. __metaclass__ = type
  733. except TypeError:
  734. pass
  735. else:
  736. self.fail("new class with only classic bases - shouldn't be")
  737. def test_diamond_inheritence(self):
  738. # Testing multiple inheritance special cases...
  739. class A(object):
  740. def spam(self): return "A"
  741. self.assertEqual(A().spam(), "A")
  742. class B(A):
  743. def boo(self): return "B"
  744. def spam(self): return "B"
  745. self.assertEqual(B().spam(), "B")
  746. self.assertEqual(B().boo(), "B")
  747. class C(A):
  748. def boo(self): return "C"
  749. self.assertEqual(C().spam(), "A")
  750. self.assertEqual(C().boo(), "C")
  751. class D(B, C): pass
  752. self.assertEqual(D().spam(), "B")
  753. self.assertEqual(D().boo(), "B")
  754. self.assertEqual(D.__mro__, (D, B, C, A, object))
  755. class E(C, B): pass
  756. self.assertEqual(E().spam(), "B")
  757. self.assertEqual(E().boo(), "C")
  758. self.assertEqual(E.__mro__, (E, C, B, A, object))
  759. # MRO order disagreement
  760. try:
  761. class F(D, E): pass
  762. except TypeError:
  763. pass
  764. else:
  765. self.fail("expected MRO order disagreement (F)")
  766. try:
  767. class G(E, D): pass
  768. except TypeError:
  769. pass
  770. else:
  771. self.fail("expected MRO order disagreement (G)")
  772. # see thread python-dev/2002-October/029035.html
  773. def test_ex5_from_c3_switch(self):
  774. # Testing ex5 from C3 switch discussion...
  775. class A(object): pass
  776. class B(object): pass
  777. class C(object): pass
  778. class X(A): pass
  779. class Y(A): pass
  780. class Z(X,B,Y,C): pass
  781. self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
  782. # see "A Monotonic Superclass Linearization for Dylan",
  783. # by Kim Barrett et al. (OOPSLA 1996)
  784. def test_monotonicity(self):
  785. # Testing MRO monotonicity...
  786. class Boat(object): pass
  787. class DayBoat(Boat): pass
  788. class WheelBoat(Boat): pass
  789. class EngineLess(DayBoat): pass
  790. class SmallMultihull(DayBoat): pass
  791. class PedalWheelBoat(EngineLess,WheelBoat): pass
  792. class SmallCatamaran(SmallMultihull): pass
  793. class Pedalo(PedalWheelBoat,SmallCatamaran): pass
  794. self.assertEqual(PedalWheelBoat.__mro__,
  795. (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
  796. self.assertEqual(SmallCatamaran.__mro__,
  797. (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
  798. self.assertEqual(Pedalo.__mro__,
  799. (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
  800. SmallMultihull, DayBoat, WheelBoat, Boat, object))
  801. # see "A Monotonic Superclass Linearization for Dylan",
  802. # by Kim Barrett et al. (OOPSLA 1996)
  803. def test_consistency_with_epg(self):
  804. # Testing consistency with EPG...
  805. class Pane(object): pass
  806. class ScrollingMixin(object): pass
  807. class EditingMixin(object): pass
  808. class ScrollablePane(Pane,ScrollingMixin): pass
  809. class EditablePane(Pane,EditingMixin): pass
  810. class EditableScrollablePane(ScrollablePane,EditablePane): pass
  811. self.assertEqual(EditableScrollablePane.__mro__,
  812. (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
  813. ScrollingMixin, EditingMixin, object))
  814. def test_mro_disagreement(self):
  815. # Testing error messages for MRO disagreement...
  816. mro_err_msg = """Cannot create a consistent method resolution
  817. order (MRO) for bases """
  818. def raises(exc, expected, callable, *args):
  819. try:
  820. callable(*args)
  821. except exc, msg:
  822. # the exact msg is generally considered an impl detail
  823. if test_support.check_impl_detail():
  824. if not str(msg).startswith(expected):
  825. self.fail("Message %r, expected %r" %
  826. (str(msg), expected))
  827. else:
  828. self.fail("Expected %s" % exc)
  829. class A(object): pass
  830. class B(A): pass
  831. class C(object): pass
  832. # Test some very simple errors
  833. raises(TypeError, "duplicate base class A",
  834. type, "X", (A, A), {})
  835. raises(TypeError, mro_err_msg,
  836. type, "X", (A, B), {})
  837. raises(TypeError, mro_err_msg,
  838. type, "X", (A, C, B), {})
  839. # Test a slightly more complex error
  840. class GridLayout(object): pass
  841. class HorizontalGrid(GridLayout): pass
  842. class VerticalGrid(GridLayout): pass
  843. class HVGrid(HorizontalGrid, VerticalGrid): pass
  844. class VHGrid(VerticalGrid, HorizontalGrid): pass
  845. raises(TypeError, mro_err_msg,
  846. type, "ConfusedGrid", (HVGrid, VHGrid), {})
  847. def test_object_class(self):
  848. # Testing object class...
  849. a = object()
  850. self.assertEqual(a.__class__, object)
  851. self.assertEqual(type(a), object)
  852. b = object()
  853. self.assertNotEqual(a, b)
  854. self.assertFalse(hasattr(a, "foo"))
  855. try:
  856. a.foo = 12
  857. except (AttributeError, TypeError):
  858. pass
  859. else:
  860. self.fail("object() should not allow setting a foo attribute")
  861. self.assertFalse(hasattr(object(), "__dict__"))
  862. class Cdict(object):
  863. pass
  864. x = Cdict()
  865. self.assertEqual(x.__dict__, {})
  866. x.foo = 1
  867. self.assertEqual(x.foo, 1)
  868. self.assertEqual(x.__dict__, {'foo': 1})
  869. def test_slots(self):
  870. # Testing __slots__...
  871. class C0(object):
  872. __slots__ = []
  873. x = C0()
  874. self.assertFalse(hasattr(x, "__dict__"))
  875. self.assertFalse(hasattr(x, "foo"))
  876. class C1(object):
  877. __slots__ = ['a']
  878. x = C1()
  879. self.assertFalse(hasattr(x, "__dict__"))
  880. self.assertFalse(hasattr(x, "a"))
  881. x.a = 1
  882. self.assertEqual(x.a, 1)
  883. x.a = None
  884. self.assertEqual(x.a, None)
  885. del x.a
  886. self.assertFalse(hasattr(x, "a"))
  887. class C3(object):
  888. __slots__ = ['a', 'b', 'c']
  889. x = C3()
  890. self.assertFalse(hasattr(x, "__dict__"))
  891. self.assertFalse(hasattr(x, 'a'))
  892. self.assertFalse(hasattr(x, 'b'))
  893. self.assertFalse(hasattr(x, 'c'))
  894. x.a = 1
  895. x.b = 2
  896. x.c = 3
  897. self.assertEqual(x.a, 1)
  898. self.assertEqual(x.b, 2)
  899. self.assertEqual(x.c, 3)
  900. class C4(object):
  901. """Validate name mangling"""
  902. __slots__ = ['__a']
  903. def __init__(self, value):
  904. self.__a = value
  905. def get(self):
  906. return self.__a
  907. x = C4(5)
  908. self.assertFalse(hasattr(x, '__dict__'))
  909. self.assertFalse(hasattr(x, '__a'))
  910. self.assertEqual(x.get(), 5)
  911. try:
  912. x.__a = 6
  913. except AttributeError:
  914. pass
  915. else:
  916. self.fail("Double underscored names not mangled")
  917. # Make sure slot names are proper identifiers
  918. try:
  919. class C(object):
  920. __slots__ = [None]
  921. except TypeError:
  922. pass
  923. else:
  924. self.fail("[None] slots not caught")
  925. try:
  926. class C(object):
  927. __slots__ = ["foo bar"]
  928. except TypeError:
  929. pass
  930. else:
  931. self.fail("['foo bar'] slots not caught")
  932. try:
  933. class C(object):
  934. __slots__ = ["foo\0bar"]
  935. except TypeError:
  936. pass
  937. else:
  938. self.fail("['foo\\0bar'] slots not caught")
  939. try:
  940. class C(object):
  941. __slots__ = ["1"]
  942. except TypeError:
  943. pass
  944. else:
  945. self.fail("['1'] slots not caught")
  946. try:
  947. class C(object):
  948. __slots__ = [""]
  949. except TypeError:
  950. pass
  951. else:
  952. self.fail("[''] slots not caught")
  953. class C(object):
  954. __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
  955. # XXX(nnorwitz): was there supposed to be something tested
  956. # from the class above?
  957. # Test a single string is not expanded as a sequence.
  958. class C(object):
  959. __slots__ = "abc"
  960. c = C()
  961. c.abc = 5
  962. self.assertEqual(c.abc, 5)
  963. # Test unicode slot names
  964. try:
  965. unicode
  966. except NameError:
  967. pass
  968. else:
  969. # Test a single unicode string is not expanded as a sequence.
  970. class C(object):
  971. __slots__ = unicode("abc")
  972. c = C()
  973. c.abc = 5
  974. self.assertEqual(c.abc, 5)
  975. # _unicode_to_string used to modify slots in certain circumstances
  976. slots = (unicode("foo"), unicode("bar"))
  977. class C(object):
  978. __slots__ = slots
  979. x = C()
  980. x.foo = 5
  981. self.assertEqual(x.foo, 5)
  982. self.assertEqual(type(slots[0]), unicode)
  983. # this used to leak references
  984. try:
  985. class C(object):
  986. __slots__ = [unichr(128)]
  987. except (TypeError, UnicodeEncodeError):
  988. pass
  989. else:
  990. self.fail("[unichr(128)] slots not caught")
  991. # Test leaks
  992. class Counted(object):
  993. counter = 0 # counts the number of instances alive
  994. def __init__(self):
  995. Counted.counter += 1
  996. def __del__(self):
  997. Counted.counter -= 1
  998. class C(object):
  999. __slots__ = ['a', 'b', 'c']
  1000. x = C()
  1001. x.a = Counted()
  1002. x.b = Counted()
  1003. x.c = Counted()
  1004. self.assertEqual(Counted.counter, 3)
  1005. del x
  1006. test_support.gc_collect()
  1007. self.assertEqual(Counted.counter, 0)
  1008. class D(C):
  1009. pass
  1010. x = D()
  1011. x.a = Counted()
  1012. x.z = Counted()
  1013. self.assertEqual(Counted.counter, 2)
  1014. del x
  1015. test_support.gc_collect()
  1016. self.assertEqual(Counted.counter, 0)
  1017. class E(D):
  1018. __slots__ = ['e']
  1019. x = E()
  1020. x.a = Counted()
  1021. x.z = Counted()
  1022. x.e = Counted()
  1023. self.assertEqual(Counted.counter, 3)
  1024. del x
  1025. test_support.gc_collect()
  1026. self.assertEqual(Counted.counter, 0)
  1027. # Test cyclical leaks [SF bug 519621]
  1028. class F(object):
  1029. __slots__ = ['a', 'b']
  1030. s = F()
  1031. s.a = [Counted(), s]
  1032. self.assertEqual(Counted.counter, 1)
  1033. s = None
  1034. test_support.gc_collect()
  1035. self.assertEqual(Counted.counter, 0)
  1036. # Test lookup leaks [SF bug 572567]
  1037. import gc
  1038. if test_support.check_impl_detail():
  1039. class G(object):
  1040. def __cmp__(self, other):
  1041. return 0
  1042. __hash__ = None # Silence Py3k warning
  1043. g = G()
  1044. orig_objects = len(gc.get_objects())
  1045. for i in xrange(10):
  1046. g==g
  1047. new_objects = len(gc.get_objects())
  1048. self.assertEqual(orig_objects, new_objects)
  1049. class H(object):
  1050. __slots__ = ['a', 'b']
  1051. def __init__(self):
  1052. self.a = 1
  1053. self.b = 2
  1054. def __del__(self_):
  1055. self.assertEqual(self_.a, 1)
  1056. self.assertEqual(self_.b, 2)
  1057. with test_support.captured_output('stderr') as s:
  1058. h = H()
  1059. del h
  1060. self.assertEqual(s.getvalue(), '')
  1061. class X(object):
  1062. __slots__ = "a"
  1063. with self.assertRaises(AttributeError):
  1064. del X().a
  1065. def test_slots_special(self):
  1066. # Testing __dict__ and __weakref__ in __slots__...
  1067. class D(object):
  1068. __slots__ = ["__dict__"]
  1069. a = D()
  1070. self.assertTrue(hasattr(a, "__dict__"))
  1071. self.assertFalse(hasattr(a, "__weakref__"))
  1072. a.foo = 42
  1073. self.assertEqual(a.__dict__, {"foo": 42})
  1074. class W(object):
  1075. __slots__ = ["__weakref__"]
  1076. a = W()
  1077. self.assertTrue(hasattr(a, "__weakref__"))
  1078. self.assertFalse(hasattr(a, "__dict__"))
  1079. try:
  1080. a.foo = 42
  1081. except AttributeError:
  1082. pass
  1083. else:
  1084. self.fail("shouldn't be allowed to set a.foo")
  1085. class C1(W, D):
  1086. __slots__ = []
  1087. a = C1()
  1088. self.assertTrue(hasattr(a, "__dict__"))
  1089. self.assertTrue(hasattr(a, "__weakref__"))
  1090. a.foo = 42
  1091. self.assertEqual(a.__dict__, {"foo": 42})
  1092. class C2(D, W):
  1093. __slots__ = []
  1094. a = C2()
  1095. self.assertTrue(hasattr(a, "__dict__"))
  1096. self.assertTrue(hasattr(a, "__weakref__"))
  1097. a.foo = 42
  1098. self.assertEqual(a.__dict__, {"foo": 42})
  1099. def test_slots_descriptor(self):
  1100. # Issue2115: slot descriptors did not correctly check
  1101. # the type of the given object
  1102. import abc
  1103. class MyABC:
  1104. __metaclass__ = abc.ABCMeta
  1105. __slots__ = "a"
  1106. class Unrelated(object):
  1107. pass
  1108. MyABC.register(Unrelated)
  1109. u = Unrelated()
  1110. self.assertIsInstance(u, MyABC)
  1111. # This used to crash
  1112. self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
  1113. def test_metaclass_cmp(self):
  1114. # See bug 7491.
  1115. class M(type):
  1116. def __cmp__(self, other):
  1117. return -1
  1118. class X(object):
  1119. __metaclass__ = M
  1120. self.assertTrue(X < M)
  1121. def test_dynamics(self):
  1122. # Testing class attribute propagation...
  1123. class D(object):
  1124. pass
  1125. class E(D):
  1126. pass
  1127. class F(D):
  1128. pass
  1129. D.foo = 1
  1130. self.assertEqual(D.foo, 1)
  1131. # Test that dynamic attributes are inherited
  1132. self.assertEqual(E.foo, 1)
  1133. self.assertEqual(F.foo, 1)
  1134. # Test dynamic instances
  1135. class C(object):
  1136. pass
  1137. a = C()
  1138. self.assertFalse(hasattr(a, "foobar"))
  1139. C.foobar = 2
  1140. self.assertEqual(a.foobar, 2)
  1141. C.method = lambda self: 42
  1142. self.assertEqual(a.method(), 42)
  1143. C.__repr__ = lambda self: "C()"
  1144. self.assertEqual(repr(a), "C()")
  1145. C.__int__ = lambda self: 100
  1146. self.assertEqual(int(a), 100)
  1147. self.assertEqual(a.foobar, 2)
  1148. self.assertFalse(hasattr(a, "spam"))
  1149. def mygetattr(self, name):
  1150. if name == "spam":
  1151. return "spam"
  1152. raise AttributeError
  1153. C.__getattr__ = mygetattr
  1154. self.assertEqual(a.spam, "spam")
  1155. a.new = 12
  1156. self.assertEqual(a.new, 12)
  1157. def mysetattr(self, name, value):
  1158. if name == "spam":
  1159. raise AttributeError
  1160. return object.__setattr__(self, name, value)
  1161. C.__setattr__ = mysetattr
  1162. try:
  1163. a.spam = "not spam"
  1164. except AttributeError:
  1165. pass
  1166. else:
  1167. self.fail("expected AttributeError")
  1168. self.assertEqual(a.spam, "spam")
  1169. class D(C):
  1170. pass
  1171. d = D()
  1172. d.foo = 1
  1173. self.assertEqual(d.foo, 1)
  1174. # Test handling of int*seq and seq*int
  1175. class I(int):
  1176. pass
  1177. self.assertEqual("a"*I(2), "aa")
  1178. self.assertEqual(I(2)*"a", "aa")
  1179. self.assertEqual(2*I(3), 6)
  1180. self.assertEqual(I(3)*2, 6)
  1181. self.assertEqual(I(3)*I(2), 6)
  1182. # Test handling of long*seq and seq*long
  1183. class L(long):
  1184. pass
  1185. self.assertEqual("a"*L(2L), "aa")
  1186. self.assertEqual(L(2L)*"a", "aa")
  1187. self.assertEqual(2*L(3), 6)
  1188. self.assertEqual(L(3)*2, 6)
  1189. self.assertEqual(L(3)*L(2), 6)
  1190. # Test comparison of classes with dynamic metaclasses
  1191. class dynamicmetaclass(type):
  1192. pass
  1193. class someclass:
  1194. __metaclass__ = dynamicmetaclass
  1195. self.assertNotEqual(someclass, object)
  1196. def test_errors(self):
  1197. # Testing errors...
  1198. try:
  1199. class C(list, dict):
  1200. pass
  1201. except TypeError:
  1202. pass
  1203. else:
  1204. self.fail("inheritance from both list and dict should be illegal")
  1205. try:
  1206. class C(object, None):
  1207. pass
  1208. except TypeError:
  1209. pass
  1210. else:
  1211. self.fail("inheritance from non-type should be illegal")
  1212. class Classic:
  1213. pass
  1214. try:
  1215. class C(type(len)):
  1216. pass
  1217. except TypeError:
  1218. pass
  1219. else:
  1220. self.fail("inheritance from CFunction should be illegal")
  1221. try:
  1222. class C(object):
  1223. __slots__ = 1
  1224. except TypeError:
  1225. pass
  1226. else:
  1227. self.fail("__slots__ = 1 should be illegal")
  1228. try:
  1229. class C(object):
  1230. __slots__ = [1]
  1231. except TypeError:
  1232. pass
  1233. else:
  1234. self.fail("__slots__ = [1] should be illegal")
  1235. class M1(type):
  1236. pass
  1237. class M2(type):
  1238. pass
  1239. class A1(object):
  1240. __metaclass__ = M1
  1241. class A2(object):
  1242. __metaclass__ = M2
  1243. try:
  1244. class B(A1, A2):
  1245. pass
  1246. except TypeError:
  1247. pass
  1248. else:
  1249. self.fail("finding the most derived metaclass should have failed")
  1250. def test_classmethods(self):
  1251. # Testing class methods...
  1252. class C(object):
  1253. def foo(*a): return a
  1254. goo = classmethod(foo)
  1255. c = C()
  1256. self.assertEqual(C.goo(1), (C, 1))
  1257. self.assertEqual(c.goo(1), (C, 1))
  1258. self.assertEqual(c.foo(1), (c, 1))
  1259. class D(C):
  1260. pass
  1261. d = D()
  1262. self.assertEqual(D.goo(1), (D, 1))
  1263. self.assertEqual(d.goo(1), (D, 1))
  1264. self.assertEqual(d.foo(1), (d, 1))
  1265. self.assertEqual(D.foo(d, 1), (d, 1))
  1266. # Test for a specific crash (SF bug 528132)
  1267. def f(cls, arg): return (cls, arg)
  1268. ff = classmethod(f)
  1269. self.assertEqual(ff.__get__(0, int)(42), (int, 42))
  1270. self.assertEqual(ff.__get__(0)(42), (int, 42))
  1271. # Test super() with classmethods (SF bug 535444)
  1272. self.assertEqual(C.goo.im_self, C)
  1273. self.assertEqual(D.goo.im_self, D)
  1274. self.assertEqual(super(D,D).goo.im_self, D)
  1275. self.assertEqual(super(D,d).goo.im_self, D)
  1276. self.assertEqual(super(D,D).goo(), (D,))
  1277. self.assertEqual(super(D,d).goo(), (D,))
  1278. # Verify that a non-callable will raise
  1279. meth = classmethod(1).__get__(1)
  1280. self.assertRaises(TypeError, meth)
  1281. # Verify that classmethod() doesn't allow keyword args
  1282. try:
  1283. classmethod(f, kw=1)
  1284. except TypeError:
  1285. pass
  1286. else:
  1287. self.fail("classmethod shouldn't accept keyword args")
  1288. @test_support.impl_detail("the module 'xxsubtype' is internal")
  1289. def test_classmethods_in_c(self):
  1290. # Testing C-based class methods...
  1291. import xxsubtype as spam
  1292. a = (1, 2, 3)
  1293. d = {'abc': 123}
  1294. x, a1, d1 = spam.spamlist.classmeth(*a, **d)
  1295. self.assertEqual(x, spam.spamlist)
  1296. self.assertEqual(a, a1)
  1297. self.assertEqual(d, d1)
  1298. x, a1, d1 = spam.spamlist().classmeth(*a, **d)
  1299. self.assertEqual(x, spam.spamlist)
  1300. self.assertEqual(a, a1)
  1301. self.assertEqual(d, d1)
  1302. def test_staticmethods(self):
  1303. # Testing static methods...
  1304. class C(object):
  1305. def foo(*a): return a
  1306. goo = staticmethod(foo)
  1307. c = C()
  1308. self.assertEqual(C.goo(1), (1,))
  1309. self.assertEqual(c.goo(1), (1,))
  1310. self.assertEqual(c.foo(1), (c, 1,))
  1311. class D(C):
  1312. pass
  1313. d = D()
  1314. self.assertEqual(D.goo(1), (1,))
  1315. self.assertEqual(d.goo(1), (1,))
  1316. self.assertEqual(d.foo(1), (d, 1))
  1317. self.assertEqual(D.foo(d, 1), (d, 1))
  1318. @test_support.impl_detail("the module 'xxsubtype' is internal")
  1319. def test_staticmethods_in_c(self):
  1320. # Testing C-based static methods...
  1321. import xxsubtype as spam
  1322. a = (1, 2, 3)
  1323. d = {"abc": 123}
  1324. x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
  1325. self.assertEqual(x, None)
  1326. self.assertEqual(a, a1)
  1327. self.assertEqual(d, d1)
  1328. x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
  1329. self.assertEqual(x, None)
  1330. self.assertEqual(a, a1)
  1331. self.assertEqual(d, d1)
  1332. def test_classic(self):
  1333. # Testing classic classes...
  1334. class C:
  1335. def foo(*a): return a
  1336. goo = classmethod(foo)
  1337. c = C()
  1338. self.assertEqual(C.goo(1), (C, 1))
  1339. self.assertEqual(c.goo(1), (C, 1))
  1340. self.assertEqual(c.foo(1), (c, 1))
  1341. class D(C):
  1342. pass
  1343. d = D()
  1344. self.assertEqual(D.goo(1), (D, 1))
  1345. self.assertEqual(d.goo(1), (D, 1))
  1346. self.assertEqual(d.foo(1), (d, 1))
  1347. self.assertEqual(D.foo(d, 1), (d, 1))
  1348. class E: # *not* subclassing from C
  1349. foo = C.foo
  1350. self.assertEqual(E().foo, C.foo) # i.e., unbound
  1351. self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
  1352. def test_compattr(self):
  1353. # Testing computed attributes...
  1354. class C(object):
  1355. class computed_attribute(object):
  1356. def __init__(self, get, set=None, delete=None):
  1357. self.__get = get
  1358. self.__set = set
  1359. self.__delete = delete
  1360. def __get__(self, obj, type=None):
  1361. return self.__get(obj)
  1362. def __set__(self, obj, value):
  1363. return self.__set(obj, value)
  1364. def __delete__(self, obj):
  1365. return self.__delete(obj)
  1366. def __init__(self):
  1367. self.__x = 0
  1368. def __get_x(self):
  1369. x = self.__x
  1370. self.__x = x+1
  1371. return x
  1372. def __set_x

Large files files are truncated, but you can click here to view the full file