PageRenderTime 31ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/Lib/test/test_collections.py

https://gitlab.com/unofficial-mirrors/cpython
Python | 1243 lines | 1083 code | 103 blank | 57 comment | 53 complexity | 61b62e24d1d8a28452f3f8b55df0083d MD5 | raw file
  1. """Unit tests for collections.py."""
  2. import collections
  3. import copy
  4. import doctest
  5. import inspect
  6. import keyword
  7. import operator
  8. import pickle
  9. from random import choice, randrange
  10. import re
  11. import string
  12. import sys
  13. from test import support
  14. import types
  15. import unittest
  16. from collections import namedtuple, Counter, OrderedDict, _count_elements
  17. from collections import UserDict, UserString, UserList
  18. from collections import ChainMap
  19. from collections import deque
  20. from collections.abc import Awaitable, Coroutine
  21. from collections.abc import AsyncIterator, AsyncIterable, AsyncGenerator
  22. from collections.abc import Hashable, Iterable, Iterator, Generator, Reversible
  23. from collections.abc import Sized, Container, Callable, Collection
  24. from collections.abc import Set, MutableSet
  25. from collections.abc import Mapping, MutableMapping, KeysView, ItemsView, ValuesView
  26. from collections.abc import Sequence, MutableSequence
  27. from collections.abc import ByteString
  28. class TestUserObjects(unittest.TestCase):
  29. def _superset_test(self, a, b):
  30. self.assertGreaterEqual(
  31. set(dir(a)),
  32. set(dir(b)),
  33. '{a} should have all the methods of {b}'.format(
  34. a=a.__name__,
  35. b=b.__name__,
  36. ),
  37. )
  38. def test_str_protocol(self):
  39. self._superset_test(UserString, str)
  40. def test_list_protocol(self):
  41. self._superset_test(UserList, list)
  42. def test_dict_protocol(self):
  43. self._superset_test(UserDict, dict)
  44. ################################################################################
  45. ### ChainMap (helper class for configparser and the string module)
  46. ################################################################################
  47. class TestChainMap(unittest.TestCase):
  48. def test_basics(self):
  49. c = ChainMap()
  50. c['a'] = 1
  51. c['b'] = 2
  52. d = c.new_child()
  53. d['b'] = 20
  54. d['c'] = 30
  55. self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}]) # check internal state
  56. self.assertEqual(d.items(), dict(a=1, b=20, c=30).items()) # check items/iter/getitem
  57. self.assertEqual(len(d), 3) # check len
  58. for key in 'abc': # check contains
  59. self.assertIn(key, d)
  60. for k, v in dict(a=1, b=20, c=30, z=100).items(): # check get
  61. self.assertEqual(d.get(k, 100), v)
  62. del d['b'] # unmask a value
  63. self.assertEqual(d.maps, [{'c':30}, {'a':1, 'b':2}]) # check internal state
  64. self.assertEqual(d.items(), dict(a=1, b=2, c=30).items()) # check items/iter/getitem
  65. self.assertEqual(len(d), 3) # check len
  66. for key in 'abc': # check contains
  67. self.assertIn(key, d)
  68. for k, v in dict(a=1, b=2, c=30, z=100).items(): # check get
  69. self.assertEqual(d.get(k, 100), v)
  70. self.assertIn(repr(d), [ # check repr
  71. type(d).__name__ + "({'c': 30}, {'a': 1, 'b': 2})",
  72. type(d).__name__ + "({'c': 30}, {'b': 2, 'a': 1})"
  73. ])
  74. for e in d.copy(), copy.copy(d): # check shallow copies
  75. self.assertEqual(d, e)
  76. self.assertEqual(d.maps, e.maps)
  77. self.assertIsNot(d, e)
  78. self.assertIsNot(d.maps[0], e.maps[0])
  79. for m1, m2 in zip(d.maps[1:], e.maps[1:]):
  80. self.assertIs(m1, m2)
  81. # check deep copies
  82. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  83. e = pickle.loads(pickle.dumps(d, proto))
  84. self.assertEqual(d, e)
  85. self.assertEqual(d.maps, e.maps)
  86. self.assertIsNot(d, e)
  87. for m1, m2 in zip(d.maps, e.maps):
  88. self.assertIsNot(m1, m2, e)
  89. for e in [copy.deepcopy(d),
  90. eval(repr(d))
  91. ]:
  92. self.assertEqual(d, e)
  93. self.assertEqual(d.maps, e.maps)
  94. self.assertIsNot(d, e)
  95. for m1, m2 in zip(d.maps, e.maps):
  96. self.assertIsNot(m1, m2, e)
  97. f = d.new_child()
  98. f['b'] = 5
  99. self.assertEqual(f.maps, [{'b': 5}, {'c':30}, {'a':1, 'b':2}])
  100. self.assertEqual(f.parents.maps, [{'c':30}, {'a':1, 'b':2}]) # check parents
  101. self.assertEqual(f['b'], 5) # find first in chain
  102. self.assertEqual(f.parents['b'], 2) # look beyond maps[0]
  103. def test_constructor(self):
  104. self.assertEqual(ChainMap().maps, [{}]) # no-args --> one new dict
  105. self.assertEqual(ChainMap({1:2}).maps, [{1:2}]) # 1 arg --> list
  106. def test_bool(self):
  107. self.assertFalse(ChainMap())
  108. self.assertFalse(ChainMap({}, {}))
  109. self.assertTrue(ChainMap({1:2}, {}))
  110. self.assertTrue(ChainMap({}, {1:2}))
  111. def test_missing(self):
  112. class DefaultChainMap(ChainMap):
  113. def __missing__(self, key):
  114. return 999
  115. d = DefaultChainMap(dict(a=1, b=2), dict(b=20, c=30))
  116. for k, v in dict(a=1, b=2, c=30, d=999).items():
  117. self.assertEqual(d[k], v) # check __getitem__ w/missing
  118. for k, v in dict(a=1, b=2, c=30, d=77).items():
  119. self.assertEqual(d.get(k, 77), v) # check get() w/ missing
  120. for k, v in dict(a=True, b=True, c=True, d=False).items():
  121. self.assertEqual(k in d, v) # check __contains__ w/missing
  122. self.assertEqual(d.pop('a', 1001), 1, d)
  123. self.assertEqual(d.pop('a', 1002), 1002) # check pop() w/missing
  124. self.assertEqual(d.popitem(), ('b', 2)) # check popitem() w/missing
  125. with self.assertRaises(KeyError):
  126. d.popitem()
  127. def test_dict_coercion(self):
  128. d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
  129. self.assertEqual(dict(d), dict(a=1, b=2, c=30))
  130. self.assertEqual(dict(d.items()), dict(a=1, b=2, c=30))
  131. def test_new_child(self):
  132. 'Tests for changes for issue #16613.'
  133. c = ChainMap()
  134. c['a'] = 1
  135. c['b'] = 2
  136. m = {'b':20, 'c': 30}
  137. d = c.new_child(m)
  138. self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}]) # check internal state
  139. self.assertIs(m, d.maps[0])
  140. # Use a different map than a dict
  141. class lowerdict(dict):
  142. def __getitem__(self, key):
  143. if isinstance(key, str):
  144. key = key.lower()
  145. return dict.__getitem__(self, key)
  146. def __contains__(self, key):
  147. if isinstance(key, str):
  148. key = key.lower()
  149. return dict.__contains__(self, key)
  150. c = ChainMap()
  151. c['a'] = 1
  152. c['b'] = 2
  153. m = lowerdict(b=20, c=30)
  154. d = c.new_child(m)
  155. self.assertIs(m, d.maps[0])
  156. for key in 'abc': # check contains
  157. self.assertIn(key, d)
  158. for k, v in dict(a=1, B=20, C=30, z=100).items(): # check get
  159. self.assertEqual(d.get(k, 100), v)
  160. ################################################################################
  161. ### Named Tuples
  162. ################################################################################
  163. TestNT = namedtuple('TestNT', 'x y z') # type used for pickle tests
  164. class TestNamedTuple(unittest.TestCase):
  165. def test_factory(self):
  166. Point = namedtuple('Point', 'x y')
  167. self.assertEqual(Point.__name__, 'Point')
  168. self.assertEqual(Point.__slots__, ())
  169. self.assertEqual(Point.__module__, __name__)
  170. self.assertEqual(Point.__getitem__, tuple.__getitem__)
  171. self.assertEqual(Point._fields, ('x', 'y'))
  172. self.assertIn('class Point(tuple)', Point._source)
  173. self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi') # type has non-alpha char
  174. self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi') # type has keyword
  175. self.assertRaises(ValueError, namedtuple, '9abc', 'efg ghi') # type starts with digit
  176. self.assertRaises(ValueError, namedtuple, 'abc', 'efg g%hi') # field with non-alpha char
  177. self.assertRaises(ValueError, namedtuple, 'abc', 'abc class') # field has keyword
  178. self.assertRaises(ValueError, namedtuple, 'abc', '8efg 9ghi') # field starts with digit
  179. self.assertRaises(ValueError, namedtuple, 'abc', '_efg ghi') # field with leading underscore
  180. self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi') # duplicate field
  181. namedtuple('Point0', 'x1 y2') # Verify that numbers are allowed in names
  182. namedtuple('_', 'a b c') # Test leading underscores in a typename
  183. nt = namedtuple('nt', 'the quick brown fox') # check unicode input
  184. self.assertNotIn("u'", repr(nt._fields))
  185. nt = namedtuple('nt', ('the', 'quick')) # check unicode input
  186. self.assertNotIn("u'", repr(nt._fields))
  187. self.assertRaises(TypeError, Point._make, [11]) # catch too few args
  188. self.assertRaises(TypeError, Point._make, [11, 22, 33]) # catch too many args
  189. @unittest.skipIf(sys.flags.optimize >= 2,
  190. "Docstrings are omitted with -O2 and above")
  191. def test_factory_doc_attr(self):
  192. Point = namedtuple('Point', 'x y')
  193. self.assertEqual(Point.__doc__, 'Point(x, y)')
  194. @unittest.skipIf(sys.flags.optimize >= 2,
  195. "Docstrings are omitted with -O2 and above")
  196. def test_doc_writable(self):
  197. Point = namedtuple('Point', 'x y')
  198. self.assertEqual(Point.x.__doc__, 'Alias for field number 0')
  199. Point.x.__doc__ = 'docstring for Point.x'
  200. self.assertEqual(Point.x.__doc__, 'docstring for Point.x')
  201. def test_name_fixer(self):
  202. for spec, renamed in [
  203. [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char
  204. [('abc', 'class'), ('abc', '_1')], # field has keyword
  205. [('8efg', '9ghi'), ('_0', '_1')], # field starts with digit
  206. [('abc', '_efg'), ('abc', '_1')], # field with leading underscore
  207. [('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_2', 'ghi')], # duplicate field
  208. [('abc', '', 'x'), ('abc', '_1', 'x')], # fieldname is a space
  209. ]:
  210. self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed)
  211. def test_module_parameter(self):
  212. NT = namedtuple('NT', ['x', 'y'], module=collections)
  213. self.assertEqual(NT.__module__, collections)
  214. def test_instance(self):
  215. Point = namedtuple('Point', 'x y')
  216. p = Point(11, 22)
  217. self.assertEqual(p, Point(x=11, y=22))
  218. self.assertEqual(p, Point(11, y=22))
  219. self.assertEqual(p, Point(y=22, x=11))
  220. self.assertEqual(p, Point(*(11, 22)))
  221. self.assertEqual(p, Point(**dict(x=11, y=22)))
  222. self.assertRaises(TypeError, Point, 1) # too few args
  223. self.assertRaises(TypeError, Point, 1, 2, 3) # too many args
  224. self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals()) # wrong keyword argument
  225. self.assertRaises(TypeError, eval, 'Point(x=1)', locals()) # missing keyword argument
  226. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  227. self.assertNotIn('__weakref__', dir(p))
  228. self.assertEqual(p, Point._make([11, 22])) # test _make classmethod
  229. self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
  230. self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
  231. self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
  232. try:
  233. p._replace(x=1, error=2)
  234. except ValueError:
  235. pass
  236. else:
  237. self._fail('Did not detect an incorrect fieldname')
  238. # verify that field string can have commas
  239. Point = namedtuple('Point', 'x, y')
  240. p = Point(x=11, y=22)
  241. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  242. # verify that fieldspec can be a non-string sequence
  243. Point = namedtuple('Point', ('x', 'y'))
  244. p = Point(x=11, y=22)
  245. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  246. def test_tupleness(self):
  247. Point = namedtuple('Point', 'x y')
  248. p = Point(11, 22)
  249. self.assertIsInstance(p, tuple)
  250. self.assertEqual(p, (11, 22)) # matches a real tuple
  251. self.assertEqual(tuple(p), (11, 22)) # coercable to a real tuple
  252. self.assertEqual(list(p), [11, 22]) # coercable to a list
  253. self.assertEqual(max(p), 22) # iterable
  254. self.assertEqual(max(*p), 22) # star-able
  255. x, y = p
  256. self.assertEqual(p, (x, y)) # unpacks like a tuple
  257. self.assertEqual((p[0], p[1]), (11, 22)) # indexable like a tuple
  258. self.assertRaises(IndexError, p.__getitem__, 3)
  259. self.assertEqual(p.x, x)
  260. self.assertEqual(p.y, y)
  261. self.assertRaises(AttributeError, eval, 'p.z', locals())
  262. def test_odd_sizes(self):
  263. Zero = namedtuple('Zero', '')
  264. self.assertEqual(Zero(), ())
  265. self.assertEqual(Zero._make([]), ())
  266. self.assertEqual(repr(Zero()), 'Zero()')
  267. self.assertEqual(Zero()._asdict(), {})
  268. self.assertEqual(Zero()._fields, ())
  269. Dot = namedtuple('Dot', 'd')
  270. self.assertEqual(Dot(1), (1,))
  271. self.assertEqual(Dot._make([1]), (1,))
  272. self.assertEqual(Dot(1).d, 1)
  273. self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
  274. self.assertEqual(Dot(1)._asdict(), {'d':1})
  275. self.assertEqual(Dot(1)._replace(d=999), (999,))
  276. self.assertEqual(Dot(1)._fields, ('d',))
  277. n = 5000
  278. names = list(set(''.join([choice(string.ascii_letters)
  279. for j in range(10)]) for i in range(n)))
  280. n = len(names)
  281. Big = namedtuple('Big', names)
  282. b = Big(*range(n))
  283. self.assertEqual(b, tuple(range(n)))
  284. self.assertEqual(Big._make(range(n)), tuple(range(n)))
  285. for pos, name in enumerate(names):
  286. self.assertEqual(getattr(b, name), pos)
  287. repr(b) # make sure repr() doesn't blow-up
  288. d = b._asdict()
  289. d_expected = dict(zip(names, range(n)))
  290. self.assertEqual(d, d_expected)
  291. b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
  292. b2_expected = list(range(n))
  293. b2_expected[1] = 999
  294. b2_expected[-5] = 42
  295. self.assertEqual(b2, tuple(b2_expected))
  296. self.assertEqual(b._fields, tuple(names))
  297. def test_pickle(self):
  298. p = TestNT(x=10, y=20, z=30)
  299. for module in (pickle,):
  300. loads = getattr(module, 'loads')
  301. dumps = getattr(module, 'dumps')
  302. for protocol in range(-1, module.HIGHEST_PROTOCOL + 1):
  303. q = loads(dumps(p, protocol))
  304. self.assertEqual(p, q)
  305. self.assertEqual(p._fields, q._fields)
  306. self.assertNotIn(b'OrderedDict', dumps(p, protocol))
  307. def test_copy(self):
  308. p = TestNT(x=10, y=20, z=30)
  309. for copier in copy.copy, copy.deepcopy:
  310. q = copier(p)
  311. self.assertEqual(p, q)
  312. self.assertEqual(p._fields, q._fields)
  313. def test_name_conflicts(self):
  314. # Some names like "self", "cls", "tuple", "itemgetter", and "property"
  315. # failed when used as field names. Test to make sure these now work.
  316. T = namedtuple('T', 'itemgetter property self cls tuple')
  317. t = T(1, 2, 3, 4, 5)
  318. self.assertEqual(t, (1,2,3,4,5))
  319. newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50)
  320. self.assertEqual(newt, (10,20,30,40,50))
  321. # Broader test of all interesting names in a template
  322. with support.captured_stdout() as template:
  323. T = namedtuple('T', 'x', verbose=True)
  324. words = set(re.findall('[A-Za-z]+', template.getvalue()))
  325. words -= set(keyword.kwlist)
  326. T = namedtuple('T', words)
  327. # test __new__
  328. values = tuple(range(len(words)))
  329. t = T(*values)
  330. self.assertEqual(t, values)
  331. t = T(**dict(zip(T._fields, values)))
  332. self.assertEqual(t, values)
  333. # test _make
  334. t = T._make(values)
  335. self.assertEqual(t, values)
  336. # exercise __repr__
  337. repr(t)
  338. # test _asdict
  339. self.assertEqual(t._asdict(), dict(zip(T._fields, values)))
  340. # test _replace
  341. t = T._make(values)
  342. newvalues = tuple(v*10 for v in values)
  343. newt = t._replace(**dict(zip(T._fields, newvalues)))
  344. self.assertEqual(newt, newvalues)
  345. # test _fields
  346. self.assertEqual(T._fields, tuple(words))
  347. # test __getnewargs__
  348. self.assertEqual(t.__getnewargs__(), values)
  349. def test_repr(self):
  350. with support.captured_stdout() as template:
  351. A = namedtuple('A', 'x', verbose=True)
  352. self.assertEqual(repr(A(1)), 'A(x=1)')
  353. # repr should show the name of the subclass
  354. class B(A):
  355. pass
  356. self.assertEqual(repr(B(1)), 'B(x=1)')
  357. def test_source(self):
  358. # verify that _source can be run through exec()
  359. tmp = namedtuple('NTColor', 'red green blue')
  360. globals().pop('NTColor', None) # remove artifacts from other tests
  361. exec(tmp._source, globals())
  362. self.assertIn('NTColor', globals())
  363. c = NTColor(10, 20, 30)
  364. self.assertEqual((c.red, c.green, c.blue), (10, 20, 30))
  365. self.assertEqual(NTColor._fields, ('red', 'green', 'blue'))
  366. globals().pop('NTColor', None) # clean-up after this test
  367. def test_keyword_only_arguments(self):
  368. # See issue 25628
  369. with support.captured_stdout() as template:
  370. NT = namedtuple('NT', ['x', 'y'], verbose=True)
  371. self.assertIn('class NT', NT._source)
  372. with self.assertRaises(TypeError):
  373. NT = namedtuple('NT', ['x', 'y'], True)
  374. NT = namedtuple('NT', ['abc', 'def'], rename=True)
  375. self.assertEqual(NT._fields, ('abc', '_1'))
  376. with self.assertRaises(TypeError):
  377. NT = namedtuple('NT', ['abc', 'def'], False, True)
  378. def test_namedtuple_subclass_issue_24931(self):
  379. class Point(namedtuple('_Point', ['x', 'y'])):
  380. pass
  381. a = Point(3, 4)
  382. self.assertEqual(a._asdict(), OrderedDict([('x', 3), ('y', 4)]))
  383. a.w = 5
  384. self.assertEqual(a.__dict__, {'w': 5})
  385. ################################################################################
  386. ### Abstract Base Classes
  387. ################################################################################
  388. class ABCTestCase(unittest.TestCase):
  389. def validate_abstract_methods(self, abc, *names):
  390. methodstubs = dict.fromkeys(names, lambda s, *args: 0)
  391. # everything should work will all required methods are present
  392. C = type('C', (abc,), methodstubs)
  393. C()
  394. # instantiation should fail if a required method is missing
  395. for name in names:
  396. stubs = methodstubs.copy()
  397. del stubs[name]
  398. C = type('C', (abc,), stubs)
  399. self.assertRaises(TypeError, C, name)
  400. def validate_isinstance(self, abc, name):
  401. stub = lambda s, *args: 0
  402. C = type('C', (object,), {'__hash__': None})
  403. setattr(C, name, stub)
  404. self.assertIsInstance(C(), abc)
  405. self.assertTrue(issubclass(C, abc))
  406. C = type('C', (object,), {'__hash__': None})
  407. self.assertNotIsInstance(C(), abc)
  408. self.assertFalse(issubclass(C, abc))
  409. def validate_comparison(self, instance):
  410. ops = ['lt', 'gt', 'le', 'ge', 'ne', 'or', 'and', 'xor', 'sub']
  411. operators = {}
  412. for op in ops:
  413. name = '__' + op + '__'
  414. operators[name] = getattr(operator, name)
  415. class Other:
  416. def __init__(self):
  417. self.right_side = False
  418. def __eq__(self, other):
  419. self.right_side = True
  420. return True
  421. __lt__ = __eq__
  422. __gt__ = __eq__
  423. __le__ = __eq__
  424. __ge__ = __eq__
  425. __ne__ = __eq__
  426. __ror__ = __eq__
  427. __rand__ = __eq__
  428. __rxor__ = __eq__
  429. __rsub__ = __eq__
  430. for name, op in operators.items():
  431. if not hasattr(instance, name):
  432. continue
  433. other = Other()
  434. op(instance, other)
  435. self.assertTrue(other.right_side,'Right side not called for %s.%s'
  436. % (type(instance), name))
  437. def _test_gen():
  438. yield
  439. class TestOneTrickPonyABCs(ABCTestCase):
  440. def test_Awaitable(self):
  441. def gen():
  442. yield
  443. @types.coroutine
  444. def coro():
  445. yield
  446. async def new_coro():
  447. pass
  448. class Bar:
  449. def __await__(self):
  450. yield
  451. class MinimalCoro(Coroutine):
  452. def send(self, value):
  453. return value
  454. def throw(self, typ, val=None, tb=None):
  455. super().throw(typ, val, tb)
  456. def __await__(self):
  457. yield
  458. non_samples = [None, int(), gen(), object()]
  459. for x in non_samples:
  460. self.assertNotIsInstance(x, Awaitable)
  461. self.assertFalse(issubclass(type(x), Awaitable), repr(type(x)))
  462. samples = [Bar(), MinimalCoro()]
  463. for x in samples:
  464. self.assertIsInstance(x, Awaitable)
  465. self.assertTrue(issubclass(type(x), Awaitable))
  466. c = coro()
  467. # Iterable coroutines (generators with CO_ITERABLE_COROUTINE
  468. # flag don't have '__await__' method, hence can't be instances
  469. # of Awaitable. Use inspect.isawaitable to detect them.
  470. self.assertNotIsInstance(c, Awaitable)
  471. c = new_coro()
  472. self.assertIsInstance(c, Awaitable)
  473. c.close() # awoid RuntimeWarning that coro() was not awaited
  474. class CoroLike: pass
  475. Coroutine.register(CoroLike)
  476. self.assertTrue(isinstance(CoroLike(), Awaitable))
  477. self.assertTrue(issubclass(CoroLike, Awaitable))
  478. CoroLike = None
  479. support.gc_collect() # Kill CoroLike to clean-up ABCMeta cache
  480. def test_Coroutine(self):
  481. def gen():
  482. yield
  483. @types.coroutine
  484. def coro():
  485. yield
  486. async def new_coro():
  487. pass
  488. class Bar:
  489. def __await__(self):
  490. yield
  491. class MinimalCoro(Coroutine):
  492. def send(self, value):
  493. return value
  494. def throw(self, typ, val=None, tb=None):
  495. super().throw(typ, val, tb)
  496. def __await__(self):
  497. yield
  498. non_samples = [None, int(), gen(), object(), Bar()]
  499. for x in non_samples:
  500. self.assertNotIsInstance(x, Coroutine)
  501. self.assertFalse(issubclass(type(x), Coroutine), repr(type(x)))
  502. samples = [MinimalCoro()]
  503. for x in samples:
  504. self.assertIsInstance(x, Awaitable)
  505. self.assertTrue(issubclass(type(x), Awaitable))
  506. c = coro()
  507. # Iterable coroutines (generators with CO_ITERABLE_COROUTINE
  508. # flag don't have '__await__' method, hence can't be instances
  509. # of Coroutine. Use inspect.isawaitable to detect them.
  510. self.assertNotIsInstance(c, Coroutine)
  511. c = new_coro()
  512. self.assertIsInstance(c, Coroutine)
  513. c.close() # awoid RuntimeWarning that coro() was not awaited
  514. class CoroLike:
  515. def send(self, value):
  516. pass
  517. def throw(self, typ, val=None, tb=None):
  518. pass
  519. def close(self):
  520. pass
  521. def __await__(self):
  522. pass
  523. self.assertTrue(isinstance(CoroLike(), Coroutine))
  524. self.assertTrue(issubclass(CoroLike, Coroutine))
  525. class CoroLike:
  526. def send(self, value):
  527. pass
  528. def close(self):
  529. pass
  530. def __await__(self):
  531. pass
  532. self.assertFalse(isinstance(CoroLike(), Coroutine))
  533. self.assertFalse(issubclass(CoroLike, Coroutine))
  534. def test_Hashable(self):
  535. # Check some non-hashables
  536. non_samples = [bytearray(), list(), set(), dict()]
  537. for x in non_samples:
  538. self.assertNotIsInstance(x, Hashable)
  539. self.assertFalse(issubclass(type(x), Hashable), repr(type(x)))
  540. # Check some hashables
  541. samples = [None,
  542. int(), float(), complex(),
  543. str(),
  544. tuple(), frozenset(),
  545. int, list, object, type, bytes()
  546. ]
  547. for x in samples:
  548. self.assertIsInstance(x, Hashable)
  549. self.assertTrue(issubclass(type(x), Hashable), repr(type(x)))
  550. self.assertRaises(TypeError, Hashable)
  551. # Check direct subclassing
  552. class H(Hashable):
  553. def __hash__(self):
  554. return super().__hash__()
  555. self.assertEqual(hash(H()), 0)
  556. self.assertFalse(issubclass(int, H))
  557. self.validate_abstract_methods(Hashable, '__hash__')
  558. self.validate_isinstance(Hashable, '__hash__')
  559. def test_AsyncIterable(self):
  560. class AI:
  561. async def __aiter__(self):
  562. return self
  563. self.assertTrue(isinstance(AI(), AsyncIterable))
  564. self.assertTrue(issubclass(AI, AsyncIterable))
  565. # Check some non-iterables
  566. non_samples = [None, object, []]
  567. for x in non_samples:
  568. self.assertNotIsInstance(x, AsyncIterable)
  569. self.assertFalse(issubclass(type(x), AsyncIterable), repr(type(x)))
  570. self.validate_abstract_methods(AsyncIterable, '__aiter__')
  571. self.validate_isinstance(AsyncIterable, '__aiter__')
  572. def test_AsyncIterator(self):
  573. class AI:
  574. async def __aiter__(self):
  575. return self
  576. async def __anext__(self):
  577. raise StopAsyncIteration
  578. self.assertTrue(isinstance(AI(), AsyncIterator))
  579. self.assertTrue(issubclass(AI, AsyncIterator))
  580. non_samples = [None, object, []]
  581. # Check some non-iterables
  582. for x in non_samples:
  583. self.assertNotIsInstance(x, AsyncIterator)
  584. self.assertFalse(issubclass(type(x), AsyncIterator), repr(type(x)))
  585. # Similarly to regular iterators (see issue 10565)
  586. class AnextOnly:
  587. async def __anext__(self):
  588. raise StopAsyncIteration
  589. self.assertNotIsInstance(AnextOnly(), AsyncIterator)
  590. self.validate_abstract_methods(AsyncIterator, '__anext__', '__aiter__')
  591. def test_Iterable(self):
  592. # Check some non-iterables
  593. non_samples = [None, 42, 3.14, 1j]
  594. for x in non_samples:
  595. self.assertNotIsInstance(x, Iterable)
  596. self.assertFalse(issubclass(type(x), Iterable), repr(type(x)))
  597. # Check some iterables
  598. samples = [bytes(), str(),
  599. tuple(), list(), set(), frozenset(), dict(),
  600. dict().keys(), dict().items(), dict().values(),
  601. _test_gen(),
  602. (x for x in []),
  603. ]
  604. for x in samples:
  605. self.assertIsInstance(x, Iterable)
  606. self.assertTrue(issubclass(type(x), Iterable), repr(type(x)))
  607. # Check direct subclassing
  608. class I(Iterable):
  609. def __iter__(self):
  610. return super().__iter__()
  611. self.assertEqual(list(I()), [])
  612. self.assertFalse(issubclass(str, I))
  613. self.validate_abstract_methods(Iterable, '__iter__')
  614. self.validate_isinstance(Iterable, '__iter__')
  615. # Check None blocking
  616. class It:
  617. def __iter__(self): return iter([])
  618. class ItBlocked(It):
  619. __iter__ = None
  620. self.assertTrue(issubclass(It, Iterable))
  621. self.assertTrue(isinstance(It(), Iterable))
  622. self.assertFalse(issubclass(ItBlocked, Iterable))
  623. self.assertFalse(isinstance(ItBlocked(), Iterable))
  624. def test_Reversible(self):
  625. # Check some non-reversibles
  626. non_samples = [None, 42, 3.14, 1j, dict(), set(), frozenset()]
  627. for x in non_samples:
  628. self.assertNotIsInstance(x, Reversible)
  629. self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
  630. # Check some non-reversible iterables
  631. non_reversibles = [dict().keys(), dict().items(), dict().values(),
  632. Counter(), Counter().keys(), Counter().items(),
  633. Counter().values(), _test_gen(),
  634. (x for x in []), iter([]), reversed([])]
  635. for x in non_reversibles:
  636. self.assertNotIsInstance(x, Reversible)
  637. self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
  638. # Check some reversible iterables
  639. samples = [bytes(), str(), tuple(), list(), OrderedDict(),
  640. OrderedDict().keys(), OrderedDict().items(),
  641. OrderedDict().values()]
  642. for x in samples:
  643. self.assertIsInstance(x, Reversible)
  644. self.assertTrue(issubclass(type(x), Reversible), repr(type(x)))
  645. # Check also Mapping, MutableMapping, and Sequence
  646. self.assertTrue(issubclass(Sequence, Reversible), repr(Sequence))
  647. self.assertFalse(issubclass(Mapping, Reversible), repr(Mapping))
  648. self.assertFalse(issubclass(MutableMapping, Reversible), repr(MutableMapping))
  649. # Check direct subclassing
  650. class R(Reversible):
  651. def __iter__(self):
  652. return iter(list())
  653. def __reversed__(self):
  654. return iter(list())
  655. self.assertEqual(list(reversed(R())), [])
  656. self.assertFalse(issubclass(float, R))
  657. self.validate_abstract_methods(Reversible, '__reversed__', '__iter__')
  658. # Check reversible non-iterable (which is not Reversible)
  659. class RevNoIter:
  660. def __reversed__(self): return reversed([])
  661. class RevPlusIter(RevNoIter):
  662. def __iter__(self): return iter([])
  663. self.assertFalse(issubclass(RevNoIter, Reversible))
  664. self.assertFalse(isinstance(RevNoIter(), Reversible))
  665. self.assertTrue(issubclass(RevPlusIter, Reversible))
  666. self.assertTrue(isinstance(RevPlusIter(), Reversible))
  667. # Check None blocking
  668. class Rev:
  669. def __iter__(self): return iter([])
  670. def __reversed__(self): return reversed([])
  671. class RevItBlocked(Rev):
  672. __iter__ = None
  673. class RevRevBlocked(Rev):
  674. __reversed__ = None
  675. self.assertTrue(issubclass(Rev, Reversible))
  676. self.assertTrue(isinstance(Rev(), Reversible))
  677. self.assertFalse(issubclass(RevItBlocked, Reversible))
  678. self.assertFalse(isinstance(RevItBlocked(), Reversible))
  679. self.assertFalse(issubclass(RevRevBlocked, Reversible))
  680. self.assertFalse(isinstance(RevRevBlocked(), Reversible))
  681. def test_Collection(self):
  682. # Check some non-collections
  683. non_collections = [None, 42, 3.14, 1j, lambda x: 2*x]
  684. for x in non_collections:
  685. self.assertNotIsInstance(x, Collection)
  686. self.assertFalse(issubclass(type(x), Collection), repr(type(x)))
  687. # Check some non-collection iterables
  688. non_col_iterables = [_test_gen(), iter(b''), iter(bytearray()),
  689. (x for x in []), dict().values()]
  690. for x in non_col_iterables:
  691. self.assertNotIsInstance(x, Collection)
  692. self.assertFalse(issubclass(type(x), Collection), repr(type(x)))
  693. # Check some collections
  694. samples = [set(), frozenset(), dict(), bytes(), str(), tuple(),
  695. list(), dict().keys(), dict().items()]
  696. for x in samples:
  697. self.assertIsInstance(x, Collection)
  698. self.assertTrue(issubclass(type(x), Collection), repr(type(x)))
  699. # Check also Mapping, MutableMapping, etc.
  700. self.assertTrue(issubclass(Sequence, Collection), repr(Sequence))
  701. self.assertTrue(issubclass(Mapping, Collection), repr(Mapping))
  702. self.assertTrue(issubclass(MutableMapping, Collection),
  703. repr(MutableMapping))
  704. self.assertTrue(issubclass(Set, Collection), repr(Set))
  705. self.assertTrue(issubclass(MutableSet, Collection), repr(MutableSet))
  706. self.assertTrue(issubclass(Sequence, Collection), repr(MutableSet))
  707. # Check direct subclassing
  708. class Col(Collection):
  709. def __iter__(self):
  710. return iter(list())
  711. def __len__(self):
  712. return 0
  713. def __contains__(self, item):
  714. return False
  715. class DerCol(Col): pass
  716. self.assertEqual(list(iter(Col())), [])
  717. self.assertFalse(issubclass(list, Col))
  718. self.assertFalse(issubclass(set, Col))
  719. self.assertFalse(issubclass(float, Col))
  720. self.assertEqual(list(iter(DerCol())), [])
  721. self.assertFalse(issubclass(list, DerCol))
  722. self.assertFalse(issubclass(set, DerCol))
  723. self.assertFalse(issubclass(float, DerCol))
  724. self.validate_abstract_methods(Collection, '__len__', '__iter__',
  725. '__contains__')
  726. # Check sized container non-iterable (which is not Collection) etc.
  727. class ColNoIter:
  728. def __len__(self): return 0
  729. def __contains__(self, item): return False
  730. class ColNoSize:
  731. def __iter__(self): return iter([])
  732. def __contains__(self, item): return False
  733. class ColNoCont:
  734. def __iter__(self): return iter([])
  735. def __len__(self): return 0
  736. self.assertFalse(issubclass(ColNoIter, Collection))
  737. self.assertFalse(isinstance(ColNoIter(), Collection))
  738. self.assertFalse(issubclass(ColNoSize, Collection))
  739. self.assertFalse(isinstance(ColNoSize(), Collection))
  740. self.assertFalse(issubclass(ColNoCont, Collection))
  741. self.assertFalse(isinstance(ColNoCont(), Collection))
  742. # Check None blocking
  743. class SizeBlock:
  744. def __iter__(self): return iter([])
  745. def __contains__(self): return False
  746. __len__ = None
  747. class IterBlock:
  748. def __len__(self): return 0
  749. def __contains__(self): return True
  750. __iter__ = None
  751. self.assertFalse(issubclass(SizeBlock, Collection))
  752. self.assertFalse(isinstance(SizeBlock(), Collection))
  753. self.assertFalse(issubclass(IterBlock, Collection))
  754. self.assertFalse(isinstance(IterBlock(), Collection))
  755. # Check None blocking in subclass
  756. class ColImpl:
  757. def __iter__(self):
  758. return iter(list())
  759. def __len__(self):
  760. return 0
  761. def __contains__(self, item):
  762. return False
  763. class NonCol(ColImpl):
  764. __contains__ = None
  765. self.assertFalse(issubclass(NonCol, Collection))
  766. self.assertFalse(isinstance(NonCol(), Collection))
  767. def test_Iterator(self):
  768. non_samples = [None, 42, 3.14, 1j, b"", "", (), [], {}, set()]
  769. for x in non_samples:
  770. self.assertNotIsInstance(x, Iterator)
  771. self.assertFalse(issubclass(type(x), Iterator), repr(type(x)))
  772. samples = [iter(bytes()), iter(str()),
  773. iter(tuple()), iter(list()), iter(dict()),
  774. iter(set()), iter(frozenset()),
  775. iter(dict().keys()), iter(dict().items()),
  776. iter(dict().values()),
  777. _test_gen(),
  778. (x for x in []),
  779. ]
  780. for x in samples:
  781. self.assertIsInstance(x, Iterator)
  782. self.assertTrue(issubclass(type(x), Iterator), repr(type(x)))
  783. self.validate_abstract_methods(Iterator, '__next__', '__iter__')
  784. # Issue 10565
  785. class NextOnly:
  786. def __next__(self):
  787. yield 1
  788. return
  789. self.assertNotIsInstance(NextOnly(), Iterator)
  790. def test_Generator(self):
  791. class NonGen1:
  792. def __iter__(self): return self
  793. def __next__(self): return None
  794. def close(self): pass
  795. def throw(self, typ, val=None, tb=None): pass
  796. class NonGen2:
  797. def __iter__(self): return self
  798. def __next__(self): return None
  799. def close(self): pass
  800. def send(self, value): return value
  801. class NonGen3:
  802. def close(self): pass
  803. def send(self, value): return value
  804. def throw(self, typ, val=None, tb=None): pass
  805. non_samples = [
  806. None, 42, 3.14, 1j, b"", "", (), [], {}, set(),
  807. iter(()), iter([]), NonGen1(), NonGen2(), NonGen3()]
  808. for x in non_samples:
  809. self.assertNotIsInstance(x, Generator)
  810. self.assertFalse(issubclass(type(x), Generator), repr(type(x)))
  811. class Gen:
  812. def __iter__(self): return self
  813. def __next__(self): return None
  814. def close(self): pass
  815. def send(self, value): return value
  816. def throw(self, typ, val=None, tb=None): pass
  817. class MinimalGen(Generator):
  818. def send(self, value):
  819. return value
  820. def throw(self, typ, val=None, tb=None):
  821. super().throw(typ, val, tb)
  822. def gen():
  823. yield 1
  824. samples = [gen(), (lambda: (yield))(), Gen(), MinimalGen()]
  825. for x in samples:
  826. self.assertIsInstance(x, Iterator)
  827. self.assertIsInstance(x, Generator)
  828. self.assertTrue(issubclass(type(x), Generator), repr(type(x)))
  829. self.validate_abstract_methods(Generator, 'send', 'throw')
  830. # mixin tests
  831. mgen = MinimalGen()
  832. self.assertIs(mgen, iter(mgen))
  833. self.assertIs(mgen.send(None), next(mgen))
  834. self.assertEqual(2, mgen.send(2))
  835. self.assertIsNone(mgen.close())
  836. self.assertRaises(ValueError, mgen.throw, ValueError)
  837. self.assertRaisesRegex(ValueError, "^huhu$",
  838. mgen.throw, ValueError, ValueError("huhu"))
  839. self.assertRaises(StopIteration, mgen.throw, StopIteration())
  840. class FailOnClose(Generator):
  841. def send(self, value): return value
  842. def throw(self, *args): raise ValueError
  843. self.assertRaises(ValueError, FailOnClose().close)
  844. class IgnoreGeneratorExit(Generator):
  845. def send(self, value): return value
  846. def throw(self, *args): pass
  847. self.assertRaises(RuntimeError, IgnoreGeneratorExit().close)
  848. def test_AsyncGenerator(self):
  849. class NonAGen1:
  850. def __aiter__(self): return self
  851. def __anext__(self): return None
  852. def aclose(self): pass
  853. def athrow(self, typ, val=None, tb=None): pass
  854. class NonAGen2:
  855. def __aiter__(self): return self
  856. def __anext__(self): return None
  857. def aclose(self): pass
  858. def asend(self, value): return value
  859. class NonAGen3:
  860. def aclose(self): pass
  861. def asend(self, value): return value
  862. def athrow(self, typ, val=None, tb=None): pass
  863. non_samples = [
  864. None, 42, 3.14, 1j, b"", "", (), [], {}, set(),
  865. iter(()), iter([]), NonAGen1(), NonAGen2(), NonAGen3()]
  866. for x in non_samples:
  867. self.assertNotIsInstance(x, AsyncGenerator)
  868. self.assertFalse(issubclass(type(x), AsyncGenerator), repr(type(x)))
  869. class Gen:
  870. def __aiter__(self): return self
  871. async def __anext__(self): return None
  872. async def aclose(self): pass
  873. async def asend(self, value): return value
  874. async def athrow(self, typ, val=None, tb=None): pass
  875. class MinimalAGen(AsyncGenerator):
  876. async def asend(self, value):
  877. return value
  878. async def athrow(self, typ, val=None, tb=None):
  879. await super().athrow(typ, val, tb)
  880. async def gen():
  881. yield 1
  882. samples = [gen(), Gen(), MinimalAGen()]
  883. for x in samples:
  884. self.assertIsInstance(x, AsyncIterator)
  885. self.assertIsInstance(x, AsyncGenerator)
  886. self.assertTrue(issubclass(type(x), AsyncGenerator), repr(type(x)))
  887. self.validate_abstract_methods(AsyncGenerator, 'asend', 'athrow')
  888. def run_async(coro):
  889. result = None
  890. while True:
  891. try:
  892. coro.send(None)
  893. except StopIteration as ex:
  894. result = ex.args[0] if ex.args else None
  895. break
  896. return result
  897. # mixin tests
  898. mgen = MinimalAGen()
  899. self.assertIs(mgen, mgen.__aiter__())
  900. self.assertIs(run_async(mgen.asend(None)), run_async(mgen.__anext__()))
  901. self.assertEqual(2, run_async(mgen.asend(2)))
  902. self.assertIsNone(run_async(mgen.aclose()))
  903. with self.assertRaises(ValueError):
  904. run_async(mgen.athrow(ValueError))
  905. class FailOnClose(AsyncGenerator):
  906. async def asend(self, value): return value
  907. async def athrow(self, *args): raise ValueError
  908. with self.assertRaises(ValueError):
  909. run_async(FailOnClose().aclose())
  910. class IgnoreGeneratorExit(AsyncGenerator):
  911. async def asend(self, value): return value
  912. async def athrow(self, *args): pass
  913. with self.assertRaises(RuntimeError):
  914. run_async(IgnoreGeneratorExit().aclose())
  915. def test_Sized(self):
  916. non_samples = [None, 42, 3.14, 1j,
  917. _test_gen(),
  918. (x for x in []),
  919. ]
  920. for x in non_samples:
  921. self.assertNotIsInstance(x, Sized)
  922. self.assertFalse(issubclass(type(x), Sized), repr(type(x)))
  923. samples = [bytes(), str(),
  924. tuple(), list(), set(), frozenset(), dict(),
  925. dict().keys(), dict().items(), dict().values(),
  926. ]
  927. for x in samples:
  928. self.assertIsInstance(x, Sized)
  929. self.assertTrue(issubclass(type(x), Sized), repr(type(x)))
  930. self.validate_abstract_methods(Sized, '__len__')
  931. self.validate_isinstance(Sized, '__len__')
  932. def test_Container(self):
  933. non_samples = [None, 42, 3.14, 1j,
  934. _test_gen(),
  935. (x for x in []),
  936. ]
  937. for x in non_samples:
  938. self.assertNotIsInstance(x, Container)
  939. self.assertFalse(issubclass(type(x), Container), repr(type(x)))
  940. samples = [bytes(), str(),
  941. tuple(), list(), set(), frozenset(), dict(),
  942. dict().keys(), dict().items(),
  943. ]
  944. for x in samples:
  945. self.assertIsInstance(x, Container)
  946. self.assertTrue(issubclass(type(x), Container), repr(type(x)))
  947. self.validate_abstract_methods(Container, '__contains__')
  948. self.validate_isinstance(Container, '__contains__')
  949. def test_Callable(self):
  950. non_samples = [None, 42, 3.14, 1j,
  951. "", b"", (), [], {}, set(),
  952. _test_gen(),
  953. (x for x in []),
  954. ]
  955. for x in non_samples:
  956. self.assertNotIsInstance(x, Callable)
  957. self.assertFalse(issubclass(type(x), Callable), repr(type(x)))
  958. samples = [lambda: None,
  959. type, int, object,
  960. len,
  961. list.append, [].append,
  962. ]
  963. for x in samples:
  964. self.assertIsInstance(x, Callable)
  965. self.assertTrue(issubclass(type(x), Callable), repr(type(x)))
  966. self.validate_abstract_methods(Callable, '__call__')
  967. self.validate_isinstance(Callable, '__call__')
  968. def test_direct_subclassing(self):
  969. for B in Hashable, Iterable, Iterator, Reversible, Sized, Container, Callable:
  970. class C(B):
  971. pass
  972. self.assertTrue(issubclass(C, B))
  973. self.assertFalse(issubclass(int, C))
  974. def test_registration(self):
  975. for B in Hashable, Iterable, Iterator, Reversible, Sized, Container, Callable:
  976. class C:
  977. __hash__ = None # Make sure it isn't hashable by default
  978. self.assertFalse(issubclass(C, B), B.__name__)
  979. B.register(C)
  980. self.assertTrue(issubclass(C, B))
  981. class WithSet(MutableSet):
  982. def __init__(self, it=()):
  983. self.data = set(it)
  984. def __len__(self):
  985. return len(self.data)
  986. def __iter__(self):
  987. return iter(self.data)
  988. def __contains__(self, item):
  989. return item in self.data
  990. def add(self, item):
  991. self.data.add(item)
  992. def discard(self, item):
  993. self.data.discard(item)
  994. class TestCollectionABCs(ABCTestCase):
  995. # XXX For now, we only test some virtual inheritance properties.
  996. # We should also test the proper behavior of the collection ABCs
  997. # as real base classes or mix-in classes.
  998. def test_Set(self):
  999. for sample in [set, frozenset]:
  1000. self.assertIsInstance(sample(), Set)
  1001. self.assertTrue(issubclass(sample, Set))
  1002. self.validate_abstract_methods(Set, '__contains__', '__iter__', '__len__')
  1003. class MySet(Set):
  1004. def __contains__(self, x):
  1005. return False
  1006. def __len__(self):
  1007. return 0
  1008. def __iter__(self):
  1009. return iter([])
  1010. self.validate_comparison(MySet())
  1011. def test_hash_Set(self):
  1012. class OneTwoThreeSet(Set):
  1013. def __init__(self):
  1014. self.contents = [1, 2, 3]
  1015. def __contains__(self, x):
  1016. return x in self.contents
  1017. def __len__(self):
  1018. return len(self.contents)
  1019. def __iter__(self):
  1020. return iter(self.contents)
  1021. def __hash__(self):
  1022. return self._hash()
  1023. a, b = OneTwoThreeSet(), OneTwoThreeSet()
  1024. self.assertTrue(hash(a) == hash(b))
  1025. def test_isdisjoint_Set(self):
  1026. class MySet(Set):
  1027. def __init__(self, itr):
  1028. self.contents = itr
  1029. def __contains__(self, x):
  1030. return x in self.contents
  1031. def __iter__(self):
  1032. return iter(self.contents)
  1033. def __len__(self):
  1034. return len([x for x in self.contents])
  1035. s1 = MySet((1, 2, 3))
  1036. s2 = MySet((4, 5, 6))
  1037. s3 = MySet((1, 5, 6))
  1038. self.assertTrue(s1.isdisjoint(s2))
  1039. self.assertFalse(s1.isdisjoint(s3))
  1040. def test_equality_Set(self):
  1041. class MySet(Set):
  1042. def __init__(self, itr):
  1043. self.contents = itr
  1044. def __contains__(self, x):
  1045. return x in self.contents
  1046. def __iter__(self):
  1047. return iter(self.contents)
  1048. def __len__(self):
  1049. return len([x for x in self.contents])
  1050. s1 = MySet((1,))
  1051. s2 = MySet((1, 2))
  1052. s3 = MySet((3, 4))
  1053. s4 = MySet((3, 4))
  1054. self.assertTrue(s2 > s1)
  1055. self.assertTrue(s1 < s2)
  1056. self.assertFalse(s2 <= s1)
  1057. self.assertFalse(s2 <= s3)
  1058. self.assertFalse(s1 >= s2)
  1059. self.assertEqual(s3, s4)
  1060. self.assertNotEqual(s2, s3)
  1061. def test_arithmetic_Set(self):
  1062. class MySet(Set):
  1063. def __init__(self, itr):
  1064. self.contents = itr
  1065. def __contains__(self, x):
  1066. return x in self.contents
  1067. def __iter__(self):
  1068. return iter(self.contents)
  1069. def __len__(self):
  1070. return len([x for x in self.contents])
  1071. s1 = MySet((1, 2, 3))
  1072. s2 = MySet((3, 4, 5))
  1073. s3 = s1 & s2
  1074. self.assertEqual(s3, MySet((3,)))
  1075. def test_MutableSet(self):
  1076. self.assertIsInstance(set(), MutableSet)
  1077. self.assertTrue(issubclass(set, MutableSet))
  1078. self.assertNotIsInstance(frozenset(), MutableSet)
  1079. self.assertFalse(issubclass(frozenset, MutableSet))
  1080. self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__',
  1081. 'add', 'discard')
  1082. def test_issue_5647(self):
  1083. # MutableSet.__iand__ mutated the set during iteration
  1084. s = WithSet('abcd')
  1085. s &= WithSet('cdef') # This used to fail
  1086. self.assertEqual(set(s), set('cd'))
  1087. def test_issue_4920(self):
  1088. # MutableSet.pop() method did not work
  1089. class MySet(MutableSet):
  1090. __slots__=['__s']
  1091. def __init__(self,items=None):
  1092. if items is None:
  1093. items=[]
  1094. self.__s=set(