test_collections.py 92 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383
  1. """Unit tests for collections.py."""
  2. import collections
  3. import copy
  4. import doctest
  5. import inspect
  6. import operator
  7. import pickle
  8. from random import choice, randrange
  9. from itertools import product, chain, combinations
  10. import string
  11. import sys
  12. from test import support
  13. import types
  14. import unittest
  15. from collections import namedtuple, Counter, OrderedDict, _count_elements
  16. from collections import UserDict, UserString, UserList
  17. from collections import ChainMap
  18. from collections import deque
  19. from collections.abc import Awaitable, Coroutine
  20. from collections.abc import AsyncIterator, AsyncIterable, AsyncGenerator
  21. from collections.abc import Hashable, Iterable, Iterator, Generator, Reversible
  22. from collections.abc import Sized, Container, Callable, Collection
  23. from collections.abc import Set, MutableSet
  24. from collections.abc import Mapping, MutableMapping, KeysView, ItemsView, ValuesView
  25. from collections.abc import Sequence, MutableSequence
  26. from collections.abc import ByteString
  27. class TestUserObjects(unittest.TestCase):
  28. def _superset_test(self, a, b):
  29. self.assertGreaterEqual(
  30. set(dir(a)),
  31. set(dir(b)),
  32. '{a} should have all the methods of {b}'.format(
  33. a=a.__name__,
  34. b=b.__name__,
  35. ),
  36. )
  37. def _copy_test(self, obj):
  38. # Test internal copy
  39. obj_copy = obj.copy()
  40. self.assertIsNot(obj.data, obj_copy.data)
  41. self.assertEqual(obj.data, obj_copy.data)
  42. # Test copy.copy
  43. obj.test = [1234] # Make sure instance vars are also copied.
  44. obj_copy = copy.copy(obj)
  45. self.assertIsNot(obj.data, obj_copy.data)
  46. self.assertEqual(obj.data, obj_copy.data)
  47. self.assertIs(obj.test, obj_copy.test)
  48. def test_str_protocol(self):
  49. self._superset_test(UserString, str)
  50. def test_list_protocol(self):
  51. self._superset_test(UserList, list)
  52. def test_dict_protocol(self):
  53. self._superset_test(UserDict, dict)
  54. def test_list_copy(self):
  55. obj = UserList()
  56. obj.append(123)
  57. self._copy_test(obj)
  58. def test_dict_copy(self):
  59. obj = UserDict()
  60. obj[123] = "abc"
  61. self._copy_test(obj)
  62. ################################################################################
  63. ### ChainMap (helper class for configparser and the string module)
  64. ################################################################################
  65. class TestChainMap(unittest.TestCase):
  66. def test_basics(self):
  67. c = ChainMap()
  68. c['a'] = 1
  69. c['b'] = 2
  70. d = c.new_child()
  71. d['b'] = 20
  72. d['c'] = 30
  73. self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}]) # check internal state
  74. self.assertEqual(d.items(), dict(a=1, b=20, c=30).items()) # check items/iter/getitem
  75. self.assertEqual(len(d), 3) # check len
  76. for key in 'abc': # check contains
  77. self.assertIn(key, d)
  78. for k, v in dict(a=1, b=20, c=30, z=100).items(): # check get
  79. self.assertEqual(d.get(k, 100), v)
  80. del d['b'] # unmask a value
  81. self.assertEqual(d.maps, [{'c':30}, {'a':1, 'b':2}]) # check internal state
  82. self.assertEqual(d.items(), dict(a=1, b=2, c=30).items()) # check items/iter/getitem
  83. self.assertEqual(len(d), 3) # check len
  84. for key in 'abc': # check contains
  85. self.assertIn(key, d)
  86. for k, v in dict(a=1, b=2, c=30, z=100).items(): # check get
  87. self.assertEqual(d.get(k, 100), v)
  88. self.assertIn(repr(d), [ # check repr
  89. type(d).__name__ + "({'c': 30}, {'a': 1, 'b': 2})",
  90. type(d).__name__ + "({'c': 30}, {'b': 2, 'a': 1})"
  91. ])
  92. for e in d.copy(), copy.copy(d): # check shallow copies
  93. self.assertEqual(d, e)
  94. self.assertEqual(d.maps, e.maps)
  95. self.assertIsNot(d, e)
  96. self.assertIsNot(d.maps[0], e.maps[0])
  97. for m1, m2 in zip(d.maps[1:], e.maps[1:]):
  98. self.assertIs(m1, m2)
  99. # check deep copies
  100. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  101. e = pickle.loads(pickle.dumps(d, proto))
  102. self.assertEqual(d, e)
  103. self.assertEqual(d.maps, e.maps)
  104. self.assertIsNot(d, e)
  105. for m1, m2 in zip(d.maps, e.maps):
  106. self.assertIsNot(m1, m2, e)
  107. for e in [copy.deepcopy(d),
  108. eval(repr(d))
  109. ]:
  110. self.assertEqual(d, e)
  111. self.assertEqual(d.maps, e.maps)
  112. self.assertIsNot(d, e)
  113. for m1, m2 in zip(d.maps, e.maps):
  114. self.assertIsNot(m1, m2, e)
  115. f = d.new_child()
  116. f['b'] = 5
  117. self.assertEqual(f.maps, [{'b': 5}, {'c':30}, {'a':1, 'b':2}])
  118. self.assertEqual(f.parents.maps, [{'c':30}, {'a':1, 'b':2}]) # check parents
  119. self.assertEqual(f['b'], 5) # find first in chain
  120. self.assertEqual(f.parents['b'], 2) # look beyond maps[0]
  121. def test_ordering(self):
  122. # Combined order matches a series of dict updates from last to first.
  123. # This test relies on the ordering of the underlying dicts.
  124. baseline = {'music': 'bach', 'art': 'rembrandt'}
  125. adjustments = {'art': 'van gogh', 'opera': 'carmen'}
  126. cm = ChainMap(adjustments, baseline)
  127. combined = baseline.copy()
  128. combined.update(adjustments)
  129. self.assertEqual(list(combined.items()), list(cm.items()))
  130. def test_constructor(self):
  131. self.assertEqual(ChainMap().maps, [{}]) # no-args --> one new dict
  132. self.assertEqual(ChainMap({1:2}).maps, [{1:2}]) # 1 arg --> list
  133. def test_bool(self):
  134. self.assertFalse(ChainMap())
  135. self.assertFalse(ChainMap({}, {}))
  136. self.assertTrue(ChainMap({1:2}, {}))
  137. self.assertTrue(ChainMap({}, {1:2}))
  138. def test_missing(self):
  139. class DefaultChainMap(ChainMap):
  140. def __missing__(self, key):
  141. return 999
  142. d = DefaultChainMap(dict(a=1, b=2), dict(b=20, c=30))
  143. for k, v in dict(a=1, b=2, c=30, d=999).items():
  144. self.assertEqual(d[k], v) # check __getitem__ w/missing
  145. for k, v in dict(a=1, b=2, c=30, d=77).items():
  146. self.assertEqual(d.get(k, 77), v) # check get() w/ missing
  147. for k, v in dict(a=True, b=True, c=True, d=False).items():
  148. self.assertEqual(k in d, v) # check __contains__ w/missing
  149. self.assertEqual(d.pop('a', 1001), 1, d)
  150. self.assertEqual(d.pop('a', 1002), 1002) # check pop() w/missing
  151. self.assertEqual(d.popitem(), ('b', 2)) # check popitem() w/missing
  152. with self.assertRaises(KeyError):
  153. d.popitem()
  154. def test_order_preservation(self):
  155. d = ChainMap(
  156. OrderedDict(j=0, h=88888),
  157. OrderedDict(),
  158. OrderedDict(i=9999, d=4444, c=3333),
  159. OrderedDict(f=666, b=222, g=777, c=333, h=888),
  160. OrderedDict(),
  161. OrderedDict(e=55, b=22),
  162. OrderedDict(a=1, b=2, c=3, d=4, e=5),
  163. OrderedDict(),
  164. )
  165. self.assertEqual(''.join(d), 'abcdefghij')
  166. self.assertEqual(list(d.items()),
  167. [('a', 1), ('b', 222), ('c', 3333), ('d', 4444),
  168. ('e', 55), ('f', 666), ('g', 777), ('h', 88888),
  169. ('i', 9999), ('j', 0)])
  170. def test_iter_not_calling_getitem_on_maps(self):
  171. class DictWithGetItem(UserDict):
  172. def __init__(self, *args, **kwds):
  173. self.called = False
  174. UserDict.__init__(self, *args, **kwds)
  175. def __getitem__(self, item):
  176. self.called = True
  177. UserDict.__getitem__(self, item)
  178. d = DictWithGetItem(a=1)
  179. c = ChainMap(d)
  180. d.called = False
  181. set(c) # iterate over chain map
  182. self.assertFalse(d.called, '__getitem__ was called')
  183. def test_dict_coercion(self):
  184. d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
  185. self.assertEqual(dict(d), dict(a=1, b=2, c=30))
  186. self.assertEqual(dict(d.items()), dict(a=1, b=2, c=30))
  187. def test_new_child(self):
  188. 'Tests for changes for issue #16613.'
  189. c = ChainMap()
  190. c['a'] = 1
  191. c['b'] = 2
  192. m = {'b':20, 'c': 30}
  193. d = c.new_child(m)
  194. self.assertEqual(d.maps, [{'b':20, 'c':30}, {'a':1, 'b':2}]) # check internal state
  195. self.assertIs(m, d.maps[0])
  196. # Use a different map than a dict
  197. class lowerdict(dict):
  198. def __getitem__(self, key):
  199. if isinstance(key, str):
  200. key = key.lower()
  201. return dict.__getitem__(self, key)
  202. def __contains__(self, key):
  203. if isinstance(key, str):
  204. key = key.lower()
  205. return dict.__contains__(self, key)
  206. c = ChainMap()
  207. c['a'] = 1
  208. c['b'] = 2
  209. m = lowerdict(b=20, c=30)
  210. d = c.new_child(m)
  211. self.assertIs(m, d.maps[0])
  212. for key in 'abc': # check contains
  213. self.assertIn(key, d)
  214. for k, v in dict(a=1, B=20, C=30, z=100).items(): # check get
  215. self.assertEqual(d.get(k, 100), v)
  216. c = ChainMap({'a': 1, 'b': 2})
  217. d = c.new_child(b=20, c=30)
  218. self.assertEqual(d.maps, [{'b': 20, 'c': 30}, {'a': 1, 'b': 2}])
  219. def test_union_operators(self):
  220. cm1 = ChainMap(dict(a=1, b=2), dict(c=3, d=4))
  221. cm2 = ChainMap(dict(a=10, e=5), dict(b=20, d=4))
  222. cm3 = cm1.copy()
  223. d = dict(a=10, c=30)
  224. pairs = [('c', 3), ('p',0)]
  225. tmp = cm1 | cm2 # testing between chainmaps
  226. self.assertEqual(tmp.maps, [cm1.maps[0] | dict(cm2), *cm1.maps[1:]])
  227. cm1 |= cm2
  228. self.assertEqual(tmp, cm1)
  229. tmp = cm2 | d # testing between chainmap and mapping
  230. self.assertEqual(tmp.maps, [cm2.maps[0] | d, *cm2.maps[1:]])
  231. self.assertEqual((d | cm2).maps, [d | dict(cm2)])
  232. cm2 |= d
  233. self.assertEqual(tmp, cm2)
  234. # testing behavior between chainmap and iterable key-value pairs
  235. with self.assertRaises(TypeError):
  236. cm3 | pairs
  237. tmp = cm3.copy()
  238. cm3 |= pairs
  239. self.assertEqual(cm3.maps, [tmp.maps[0] | dict(pairs), *tmp.maps[1:]])
  240. # testing proper return types for ChainMap and it's subclasses
  241. class Subclass(ChainMap):
  242. pass
  243. class SubclassRor(ChainMap):
  244. def __ror__(self, other):
  245. return super().__ror__(other)
  246. tmp = ChainMap() | ChainMap()
  247. self.assertIs(type(tmp), ChainMap)
  248. self.assertIs(type(tmp.maps[0]), dict)
  249. tmp = ChainMap() | Subclass()
  250. self.assertIs(type(tmp), ChainMap)
  251. self.assertIs(type(tmp.maps[0]), dict)
  252. tmp = Subclass() | ChainMap()
  253. self.assertIs(type(tmp), Subclass)
  254. self.assertIs(type(tmp.maps[0]), dict)
  255. tmp = ChainMap() | SubclassRor()
  256. self.assertIs(type(tmp), SubclassRor)
  257. self.assertIs(type(tmp.maps[0]), dict)
  258. ################################################################################
  259. ### Named Tuples
  260. ################################################################################
  261. TestNT = namedtuple('TestNT', 'x y z') # type used for pickle tests
  262. class TestNamedTuple(unittest.TestCase):
  263. def test_factory(self):
  264. Point = namedtuple('Point', 'x y')
  265. self.assertEqual(Point.__name__, 'Point')
  266. self.assertEqual(Point.__slots__, ())
  267. self.assertEqual(Point.__module__, __name__)
  268. self.assertEqual(Point.__getitem__, tuple.__getitem__)
  269. self.assertEqual(Point._fields, ('x', 'y'))
  270. self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi') # type has non-alpha char
  271. self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi') # type has keyword
  272. self.assertRaises(ValueError, namedtuple, '9abc', 'efg ghi') # type starts with digit
  273. self.assertRaises(ValueError, namedtuple, 'abc', 'efg g%hi') # field with non-alpha char
  274. self.assertRaises(ValueError, namedtuple, 'abc', 'abc class') # field has keyword
  275. self.assertRaises(ValueError, namedtuple, 'abc', '8efg 9ghi') # field starts with digit
  276. self.assertRaises(ValueError, namedtuple, 'abc', '_efg ghi') # field with leading underscore
  277. self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi') # duplicate field
  278. namedtuple('Point0', 'x1 y2') # Verify that numbers are allowed in names
  279. namedtuple('_', 'a b c') # Test leading underscores in a typename
  280. nt = namedtuple('nt', 'the quick brown fox') # check unicode input
  281. self.assertNotIn("u'", repr(nt._fields))
  282. nt = namedtuple('nt', ('the', 'quick')) # check unicode input
  283. self.assertNotIn("u'", repr(nt._fields))
  284. self.assertRaises(TypeError, Point._make, [11]) # catch too few args
  285. self.assertRaises(TypeError, Point._make, [11, 22, 33]) # catch too many args
  286. def test_defaults(self):
  287. Point = namedtuple('Point', 'x y', defaults=(10, 20)) # 2 defaults
  288. self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
  289. self.assertEqual(Point(1, 2), (1, 2))
  290. self.assertEqual(Point(1), (1, 20))
  291. self.assertEqual(Point(), (10, 20))
  292. Point = namedtuple('Point', 'x y', defaults=(20,)) # 1 default
  293. self.assertEqual(Point._field_defaults, {'y': 20})
  294. self.assertEqual(Point(1, 2), (1, 2))
  295. self.assertEqual(Point(1), (1, 20))
  296. Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults
  297. self.assertEqual(Point._field_defaults, {})
  298. self.assertEqual(Point(1, 2), (1, 2))
  299. with self.assertRaises(TypeError):
  300. Point(1)
  301. with self.assertRaises(TypeError): # catch too few args
  302. Point()
  303. with self.assertRaises(TypeError): # catch too many args
  304. Point(1, 2, 3)
  305. with self.assertRaises(TypeError): # too many defaults
  306. Point = namedtuple('Point', 'x y', defaults=(10, 20, 30))
  307. with self.assertRaises(TypeError): # non-iterable defaults
  308. Point = namedtuple('Point', 'x y', defaults=10)
  309. with self.assertRaises(TypeError): # another non-iterable default
  310. Point = namedtuple('Point', 'x y', defaults=False)
  311. Point = namedtuple('Point', 'x y', defaults=None) # default is None
  312. self.assertEqual(Point._field_defaults, {})
  313. self.assertIsNone(Point.__new__.__defaults__, None)
  314. self.assertEqual(Point(10, 20), (10, 20))
  315. with self.assertRaises(TypeError): # catch too few args
  316. Point(10)
  317. Point = namedtuple('Point', 'x y', defaults=[10, 20]) # allow non-tuple iterable
  318. self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
  319. self.assertEqual(Point.__new__.__defaults__, (10, 20))
  320. self.assertEqual(Point(1, 2), (1, 2))
  321. self.assertEqual(Point(1), (1, 20))
  322. self.assertEqual(Point(), (10, 20))
  323. Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator
  324. self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
  325. self.assertEqual(Point.__new__.__defaults__, (10, 20))
  326. self.assertEqual(Point(1, 2), (1, 2))
  327. self.assertEqual(Point(1), (1, 20))
  328. self.assertEqual(Point(), (10, 20))
  329. def test_readonly(self):
  330. Point = namedtuple('Point', 'x y')
  331. p = Point(11, 22)
  332. with self.assertRaises(AttributeError):
  333. p.x = 33
  334. with self.assertRaises(AttributeError):
  335. del p.x
  336. with self.assertRaises(TypeError):
  337. p[0] = 33
  338. with self.assertRaises(TypeError):
  339. del p[0]
  340. self.assertEqual(p.x, 11)
  341. self.assertEqual(p[0], 11)
  342. @unittest.skipIf(sys.flags.optimize >= 2,
  343. "Docstrings are omitted with -O2 and above")
  344. def test_factory_doc_attr(self):
  345. Point = namedtuple('Point', 'x y')
  346. self.assertEqual(Point.__doc__, 'Point(x, y)')
  347. Point.__doc__ = '2D point'
  348. self.assertEqual(Point.__doc__, '2D point')
  349. @unittest.skipIf(sys.flags.optimize >= 2,
  350. "Docstrings are omitted with -O2 and above")
  351. def test_field_doc(self):
  352. Point = namedtuple('Point', 'x y')
  353. self.assertEqual(Point.x.__doc__, 'Alias for field number 0')
  354. self.assertEqual(Point.y.__doc__, 'Alias for field number 1')
  355. Point.x.__doc__ = 'docstring for Point.x'
  356. self.assertEqual(Point.x.__doc__, 'docstring for Point.x')
  357. # namedtuple can mutate doc of descriptors independently
  358. Vector = namedtuple('Vector', 'x y')
  359. self.assertEqual(Vector.x.__doc__, 'Alias for field number 0')
  360. Vector.x.__doc__ = 'docstring for Vector.x'
  361. self.assertEqual(Vector.x.__doc__, 'docstring for Vector.x')
  362. @support.cpython_only
  363. @unittest.skipIf(sys.flags.optimize >= 2,
  364. "Docstrings are omitted with -O2 and above")
  365. def test_field_doc_reuse(self):
  366. P = namedtuple('P', ['m', 'n'])
  367. Q = namedtuple('Q', ['o', 'p'])
  368. self.assertIs(P.m.__doc__, Q.o.__doc__)
  369. self.assertIs(P.n.__doc__, Q.p.__doc__)
  370. @support.cpython_only
  371. def test_field_repr(self):
  372. Point = namedtuple('Point', 'x y')
  373. self.assertEqual(repr(Point.x), "_tuplegetter(0, 'Alias for field number 0')")
  374. self.assertEqual(repr(Point.y), "_tuplegetter(1, 'Alias for field number 1')")
  375. Point.x.__doc__ = 'The x-coordinate'
  376. Point.y.__doc__ = 'The y-coordinate'
  377. self.assertEqual(repr(Point.x), "_tuplegetter(0, 'The x-coordinate')")
  378. self.assertEqual(repr(Point.y), "_tuplegetter(1, 'The y-coordinate')")
  379. def test_name_fixer(self):
  380. for spec, renamed in [
  381. [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char
  382. [('abc', 'class'), ('abc', '_1')], # field has keyword
  383. [('8efg', '9ghi'), ('_0', '_1')], # field starts with digit
  384. [('abc', '_efg'), ('abc', '_1')], # field with leading underscore
  385. [('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_2', 'ghi')], # duplicate field
  386. [('abc', '', 'x'), ('abc', '_1', 'x')], # fieldname is a space
  387. ]:
  388. self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed)
  389. def test_module_parameter(self):
  390. NT = namedtuple('NT', ['x', 'y'], module=collections)
  391. self.assertEqual(NT.__module__, collections)
  392. def test_instance(self):
  393. Point = namedtuple('Point', 'x y')
  394. p = Point(11, 22)
  395. self.assertEqual(p, Point(x=11, y=22))
  396. self.assertEqual(p, Point(11, y=22))
  397. self.assertEqual(p, Point(y=22, x=11))
  398. self.assertEqual(p, Point(*(11, 22)))
  399. self.assertEqual(p, Point(**dict(x=11, y=22)))
  400. self.assertRaises(TypeError, Point, 1) # too few args
  401. self.assertRaises(TypeError, Point, 1, 2, 3) # too many args
  402. with self.assertRaises(TypeError): # wrong keyword argument
  403. Point(XXX=1, y=2)
  404. with self.assertRaises(TypeError): # missing keyword argument
  405. Point(x=1)
  406. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  407. self.assertNotIn('__weakref__', dir(p))
  408. self.assertEqual(p, Point._make([11, 22])) # test _make classmethod
  409. self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
  410. self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
  411. self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
  412. try:
  413. p._replace(x=1, error=2)
  414. except ValueError:
  415. pass
  416. else:
  417. self._fail('Did not detect an incorrect fieldname')
  418. # verify that field string can have commas
  419. Point = namedtuple('Point', 'x, y')
  420. p = Point(x=11, y=22)
  421. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  422. # verify that fieldspec can be a non-string sequence
  423. Point = namedtuple('Point', ('x', 'y'))
  424. p = Point(x=11, y=22)
  425. self.assertEqual(repr(p), 'Point(x=11, y=22)')
  426. def test_tupleness(self):
  427. Point = namedtuple('Point', 'x y')
  428. p = Point(11, 22)
  429. self.assertIsInstance(p, tuple)
  430. self.assertEqual(p, (11, 22)) # matches a real tuple
  431. self.assertEqual(tuple(p), (11, 22)) # coercible to a real tuple
  432. self.assertEqual(list(p), [11, 22]) # coercible to a list
  433. self.assertEqual(max(p), 22) # iterable
  434. self.assertEqual(max(*p), 22) # star-able
  435. x, y = p
  436. self.assertEqual(p, (x, y)) # unpacks like a tuple
  437. self.assertEqual((p[0], p[1]), (11, 22)) # indexable like a tuple
  438. with self.assertRaises(IndexError):
  439. p[3]
  440. self.assertEqual(p[-1], 22)
  441. self.assertEqual(hash(p), hash((11, 22)))
  442. self.assertEqual(p.x, x)
  443. self.assertEqual(p.y, y)
  444. with self.assertRaises(AttributeError):
  445. p.z
  446. def test_odd_sizes(self):
  447. Zero = namedtuple('Zero', '')
  448. self.assertEqual(Zero(), ())
  449. self.assertEqual(Zero._make([]), ())
  450. self.assertEqual(repr(Zero()), 'Zero()')
  451. self.assertEqual(Zero()._asdict(), {})
  452. self.assertEqual(Zero()._fields, ())
  453. Dot = namedtuple('Dot', 'd')
  454. self.assertEqual(Dot(1), (1,))
  455. self.assertEqual(Dot._make([1]), (1,))
  456. self.assertEqual(Dot(1).d, 1)
  457. self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
  458. self.assertEqual(Dot(1)._asdict(), {'d':1})
  459. self.assertEqual(Dot(1)._replace(d=999), (999,))
  460. self.assertEqual(Dot(1)._fields, ('d',))
  461. n = 5000
  462. names = list(set(''.join([choice(string.ascii_letters)
  463. for j in range(10)]) for i in range(n)))
  464. n = len(names)
  465. Big = namedtuple('Big', names)
  466. b = Big(*range(n))
  467. self.assertEqual(b, tuple(range(n)))
  468. self.assertEqual(Big._make(range(n)), tuple(range(n)))
  469. for pos, name in enumerate(names):
  470. self.assertEqual(getattr(b, name), pos)
  471. repr(b) # make sure repr() doesn't blow-up
  472. d = b._asdict()
  473. d_expected = dict(zip(names, range(n)))
  474. self.assertEqual(d, d_expected)
  475. b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
  476. b2_expected = list(range(n))
  477. b2_expected[1] = 999
  478. b2_expected[-5] = 42
  479. self.assertEqual(b2, tuple(b2_expected))
  480. self.assertEqual(b._fields, tuple(names))
  481. def test_pickle(self):
  482. p = TestNT(x=10, y=20, z=30)
  483. for module in (pickle,):
  484. loads = getattr(module, 'loads')
  485. dumps = getattr(module, 'dumps')
  486. for protocol in range(-1, module.HIGHEST_PROTOCOL + 1):
  487. q = loads(dumps(p, protocol))
  488. self.assertEqual(p, q)
  489. self.assertEqual(p._fields, q._fields)
  490. self.assertNotIn(b'OrderedDict', dumps(p, protocol))
  491. def test_copy(self):
  492. p = TestNT(x=10, y=20, z=30)
  493. for copier in copy.copy, copy.deepcopy:
  494. q = copier(p)
  495. self.assertEqual(p, q)
  496. self.assertEqual(p._fields, q._fields)
  497. def test_name_conflicts(self):
  498. # Some names like "self", "cls", "tuple", "itemgetter", and "property"
  499. # failed when used as field names. Test to make sure these now work.
  500. T = namedtuple('T', 'itemgetter property self cls tuple')
  501. t = T(1, 2, 3, 4, 5)
  502. self.assertEqual(t, (1,2,3,4,5))
  503. newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50)
  504. self.assertEqual(newt, (10,20,30,40,50))
  505. # Broader test of all interesting names taken from the code, old
  506. # template, and an example
  507. words = {'Alias', 'At', 'AttributeError', 'Build', 'Bypass', 'Create',
  508. 'Encountered', 'Expected', 'Field', 'For', 'Got', 'Helper',
  509. 'IronPython', 'Jython', 'KeyError', 'Make', 'Modify', 'Note',
  510. 'OrderedDict', 'Point', 'Return', 'Returns', 'Type', 'TypeError',
  511. 'Used', 'Validate', 'ValueError', 'Variables', 'a', 'accessible', 'add',
  512. 'added', 'all', 'also', 'an', 'arg_list', 'args', 'arguments',
  513. 'automatically', 'be', 'build', 'builtins', 'but', 'by', 'cannot',
  514. 'class_namespace', 'classmethod', 'cls', 'collections', 'convert',
  515. 'copy', 'created', 'creation', 'd', 'debugging', 'defined', 'dict',
  516. 'dictionary', 'doc', 'docstring', 'docstrings', 'duplicate', 'effect',
  517. 'either', 'enumerate', 'environments', 'error', 'example', 'exec', 'f',
  518. 'f_globals', 'field', 'field_names', 'fields', 'formatted', 'frame',
  519. 'function', 'functions', 'generate', 'get', 'getter', 'got', 'greater',
  520. 'has', 'help', 'identifiers', 'index', 'indexable', 'instance',
  521. 'instantiate', 'interning', 'introspection', 'isidentifier',
  522. 'isinstance', 'itemgetter', 'iterable', 'join', 'keyword', 'keywords',
  523. 'kwds', 'len', 'like', 'list', 'map', 'maps', 'message', 'metadata',
  524. 'method', 'methods', 'module', 'module_name', 'must', 'name', 'named',
  525. 'namedtuple', 'namedtuple_', 'names', 'namespace', 'needs', 'new',
  526. 'nicely', 'num_fields', 'number', 'object', 'of', 'operator', 'option',
  527. 'p', 'particular', 'pickle', 'pickling', 'plain', 'pop', 'positional',
  528. 'property', 'r', 'regular', 'rename', 'replace', 'replacing', 'repr',
  529. 'repr_fmt', 'representation', 'result', 'reuse_itemgetter', 's', 'seen',
  530. 'self', 'sequence', 'set', 'side', 'specified', 'split', 'start',
  531. 'startswith', 'step', 'str', 'string', 'strings', 'subclass', 'sys',
  532. 'targets', 'than', 'the', 'their', 'this', 'to', 'tuple', 'tuple_new',
  533. 'type', 'typename', 'underscore', 'unexpected', 'unpack', 'up', 'use',
  534. 'used', 'user', 'valid', 'values', 'variable', 'verbose', 'where',
  535. 'which', 'work', 'x', 'y', 'z', 'zip'}
  536. T = namedtuple('T', words)
  537. # test __new__
  538. values = tuple(range(len(words)))
  539. t = T(*values)
  540. self.assertEqual(t, values)
  541. t = T(**dict(zip(T._fields, values)))
  542. self.assertEqual(t, values)
  543. # test _make
  544. t = T._make(values)
  545. self.assertEqual(t, values)
  546. # exercise __repr__
  547. repr(t)
  548. # test _asdict
  549. self.assertEqual(t._asdict(), dict(zip(T._fields, values)))
  550. # test _replace
  551. t = T._make(values)
  552. newvalues = tuple(v*10 for v in values)
  553. newt = t._replace(**dict(zip(T._fields, newvalues)))
  554. self.assertEqual(newt, newvalues)
  555. # test _fields
  556. self.assertEqual(T._fields, tuple(words))
  557. # test __getnewargs__
  558. self.assertEqual(t.__getnewargs__(), values)
  559. def test_repr(self):
  560. A = namedtuple('A', 'x')
  561. self.assertEqual(repr(A(1)), 'A(x=1)')
  562. # repr should show the name of the subclass
  563. class B(A):
  564. pass
  565. self.assertEqual(repr(B(1)), 'B(x=1)')
  566. def test_keyword_only_arguments(self):
  567. # See issue 25628
  568. with self.assertRaises(TypeError):
  569. NT = namedtuple('NT', ['x', 'y'], True)
  570. NT = namedtuple('NT', ['abc', 'def'], rename=True)
  571. self.assertEqual(NT._fields, ('abc', '_1'))
  572. with self.assertRaises(TypeError):
  573. NT = namedtuple('NT', ['abc', 'def'], False, True)
  574. def test_namedtuple_subclass_issue_24931(self):
  575. class Point(namedtuple('_Point', ['x', 'y'])):
  576. pass
  577. a = Point(3, 4)
  578. self.assertEqual(a._asdict(), OrderedDict([('x', 3), ('y', 4)]))
  579. a.w = 5
  580. self.assertEqual(a.__dict__, {'w': 5})
  581. @support.cpython_only
  582. def test_field_descriptor(self):
  583. Point = namedtuple('Point', 'x y')
  584. p = Point(11, 22)
  585. self.assertTrue(inspect.isdatadescriptor(Point.x))
  586. self.assertEqual(Point.x.__get__(p), 11)
  587. self.assertRaises(AttributeError, Point.x.__set__, p, 33)
  588. self.assertRaises(AttributeError, Point.x.__delete__, p)
  589. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  590. with self.subTest(proto=proto):
  591. class NewPoint(tuple):
  592. x = pickle.loads(pickle.dumps(Point.x, proto))
  593. y = pickle.loads(pickle.dumps(Point.y, proto))
  594. np = NewPoint([1, 2])
  595. self.assertEqual(np.x, 1)
  596. self.assertEqual(np.y, 2)
  597. def test_new_builtins_issue_43102(self):
  598. obj = namedtuple('C', ())
  599. new_func = obj.__new__
  600. self.assertEqual(new_func.__globals__['__builtins__'], {})
  601. self.assertEqual(new_func.__builtins__, {})
  602. def test_match_args(self):
  603. Point = namedtuple('Point', 'x y')
  604. self.assertEqual(Point.__match_args__, ('x', 'y'))
  605. def test_non_generic_subscript(self):
  606. # For backward compatibility, subscription works
  607. # on arbitrary named tuple types.
  608. Group = collections.namedtuple('Group', 'key group')
  609. A = Group[int, list[int]]
  610. self.assertEqual(A.__origin__, Group)
  611. self.assertEqual(A.__parameters__, ())
  612. self.assertEqual(A.__args__, (int, list[int]))
  613. a = A(1, [2])
  614. self.assertIs(type(a), Group)
  615. self.assertEqual(a, (1, [2]))
  616. ################################################################################
  617. ### Abstract Base Classes
  618. ################################################################################
  619. class ABCTestCase(unittest.TestCase):
  620. def validate_abstract_methods(self, abc, *names):
  621. methodstubs = dict.fromkeys(names, lambda s, *args: 0)
  622. # everything should work will all required methods are present
  623. C = type('C', (abc,), methodstubs)
  624. C()
  625. # instantiation should fail if a required method is missing
  626. for name in names:
  627. stubs = methodstubs.copy()
  628. del stubs[name]
  629. C = type('C', (abc,), stubs)
  630. self.assertRaises(TypeError, C, name)
  631. def validate_isinstance(self, abc, name):
  632. stub = lambda s, *args: 0
  633. C = type('C', (object,), {'__hash__': None})
  634. setattr(C, name, stub)
  635. self.assertIsInstance(C(), abc)
  636. self.assertTrue(issubclass(C, abc))
  637. C = type('C', (object,), {'__hash__': None})
  638. self.assertNotIsInstance(C(), abc)
  639. self.assertFalse(issubclass(C, abc))
  640. def validate_comparison(self, instance):
  641. ops = ['lt', 'gt', 'le', 'ge', 'ne', 'or', 'and', 'xor', 'sub']
  642. operators = {}
  643. for op in ops:
  644. name = '__' + op + '__'
  645. operators[name] = getattr(operator, name)
  646. class Other:
  647. def __init__(self):
  648. self.right_side = False
  649. def __eq__(self, other):
  650. self.right_side = True
  651. return True
  652. __lt__ = __eq__
  653. __gt__ = __eq__
  654. __le__ = __eq__
  655. __ge__ = __eq__
  656. __ne__ = __eq__
  657. __ror__ = __eq__
  658. __rand__ = __eq__
  659. __rxor__ = __eq__
  660. __rsub__ = __eq__
  661. for name, op in operators.items():
  662. if not hasattr(instance, name):
  663. continue
  664. other = Other()
  665. op(instance, other)
  666. self.assertTrue(other.right_side,'Right side not called for %s.%s'
  667. % (type(instance), name))
  668. def _test_gen():
  669. yield
  670. class TestOneTrickPonyABCs(ABCTestCase):
  671. def test_Awaitable(self):
  672. def gen():
  673. yield
  674. @types.coroutine
  675. def coro():
  676. yield
  677. async def new_coro():
  678. pass
  679. class Bar:
  680. def __await__(self):
  681. yield
  682. class MinimalCoro(Coroutine):
  683. def send(self, value):
  684. return value
  685. def throw(self, typ, val=None, tb=None):
  686. super().throw(typ, val, tb)
  687. def __await__(self):
  688. yield
  689. self.validate_abstract_methods(Awaitable, '__await__')
  690. non_samples = [None, int(), gen(), object()]
  691. for x in non_samples:
  692. self.assertNotIsInstance(x, Awaitable)
  693. self.assertFalse(issubclass(type(x), Awaitable), repr(type(x)))
  694. samples = [Bar(), MinimalCoro()]
  695. for x in samples:
  696. self.assertIsInstance(x, Awaitable)
  697. self.assertTrue(issubclass(type(x), Awaitable))
  698. c = coro()
  699. # Iterable coroutines (generators with CO_ITERABLE_COROUTINE
  700. # flag don't have '__await__' method, hence can't be instances
  701. # of Awaitable. Use inspect.isawaitable to detect them.
  702. self.assertNotIsInstance(c, Awaitable)
  703. c = new_coro()
  704. self.assertIsInstance(c, Awaitable)
  705. c.close() # avoid RuntimeWarning that coro() was not awaited
  706. class CoroLike: pass
  707. Coroutine.register(CoroLike)
  708. self.assertTrue(isinstance(CoroLike(), Awaitable))
  709. self.assertTrue(issubclass(CoroLike, Awaitable))
  710. CoroLike = None
  711. support.gc_collect() # Kill CoroLike to clean-up ABCMeta cache
  712. def test_Coroutine(self):
  713. def gen():
  714. yield
  715. @types.coroutine
  716. def coro():
  717. yield
  718. async def new_coro():
  719. pass
  720. class Bar:
  721. def __await__(self):
  722. yield
  723. class MinimalCoro(Coroutine):
  724. def send(self, value):
  725. return value
  726. def throw(self, typ, val=None, tb=None):
  727. super().throw(typ, val, tb)
  728. def __await__(self):
  729. yield
  730. self.validate_abstract_methods(Coroutine, '__await__', 'send', 'throw')
  731. non_samples = [None, int(), gen(), object(), Bar()]
  732. for x in non_samples:
  733. self.assertNotIsInstance(x, Coroutine)
  734. self.assertFalse(issubclass(type(x), Coroutine), repr(type(x)))
  735. samples = [MinimalCoro()]
  736. for x in samples:
  737. self.assertIsInstance(x, Awaitable)
  738. self.assertTrue(issubclass(type(x), Awaitable))
  739. c = coro()
  740. # Iterable coroutines (generators with CO_ITERABLE_COROUTINE
  741. # flag don't have '__await__' method, hence can't be instances
  742. # of Coroutine. Use inspect.isawaitable to detect them.
  743. self.assertNotIsInstance(c, Coroutine)
  744. c = new_coro()
  745. self.assertIsInstance(c, Coroutine)
  746. c.close() # avoid RuntimeWarning that coro() was not awaited
  747. class CoroLike:
  748. def send(self, value):
  749. pass
  750. def throw(self, typ, val=None, tb=None):
  751. pass
  752. def close(self):
  753. pass
  754. def __await__(self):
  755. pass
  756. self.assertTrue(isinstance(CoroLike(), Coroutine))
  757. self.assertTrue(issubclass(CoroLike, Coroutine))
  758. class CoroLike:
  759. def send(self, value):
  760. pass
  761. def close(self):
  762. pass
  763. def __await__(self):
  764. pass
  765. self.assertFalse(isinstance(CoroLike(), Coroutine))
  766. self.assertFalse(issubclass(CoroLike, Coroutine))
  767. def test_Hashable(self):
  768. # Check some non-hashables
  769. non_samples = [bytearray(), list(), set(), dict()]
  770. for x in non_samples:
  771. self.assertNotIsInstance(x, Hashable)
  772. self.assertFalse(issubclass(type(x), Hashable), repr(type(x)))
  773. # Check some hashables
  774. samples = [None,
  775. int(), float(), complex(),
  776. str(),
  777. tuple(), frozenset(),
  778. int, list, object, type, bytes()
  779. ]
  780. for x in samples:
  781. self.assertIsInstance(x, Hashable)
  782. self.assertTrue(issubclass(type(x), Hashable), repr(type(x)))
  783. self.assertRaises(TypeError, Hashable)
  784. # Check direct subclassing
  785. class H(Hashable):
  786. def __hash__(self):
  787. return super().__hash__()
  788. self.assertEqual(hash(H()), 0)
  789. self.assertFalse(issubclass(int, H))
  790. self.validate_abstract_methods(Hashable, '__hash__')
  791. self.validate_isinstance(Hashable, '__hash__')
  792. def test_AsyncIterable(self):
  793. class AI:
  794. def __aiter__(self):
  795. return self
  796. self.assertTrue(isinstance(AI(), AsyncIterable))
  797. self.assertTrue(issubclass(AI, AsyncIterable))
  798. # Check some non-iterables
  799. non_samples = [None, object, []]
  800. for x in non_samples:
  801. self.assertNotIsInstance(x, AsyncIterable)
  802. self.assertFalse(issubclass(type(x), AsyncIterable), repr(type(x)))
  803. self.validate_abstract_methods(AsyncIterable, '__aiter__')
  804. self.validate_isinstance(AsyncIterable, '__aiter__')
  805. def test_AsyncIterator(self):
  806. class AI:
  807. def __aiter__(self):
  808. return self
  809. async def __anext__(self):
  810. raise StopAsyncIteration
  811. self.assertTrue(isinstance(AI(), AsyncIterator))
  812. self.assertTrue(issubclass(AI, AsyncIterator))
  813. non_samples = [None, object, []]
  814. # Check some non-iterables
  815. for x in non_samples:
  816. self.assertNotIsInstance(x, AsyncIterator)
  817. self.assertFalse(issubclass(type(x), AsyncIterator), repr(type(x)))
  818. # Similarly to regular iterators (see issue 10565)
  819. class AnextOnly:
  820. async def __anext__(self):
  821. raise StopAsyncIteration
  822. self.assertNotIsInstance(AnextOnly(), AsyncIterator)
  823. self.validate_abstract_methods(AsyncIterator, '__anext__', '__aiter__')
  824. def test_Iterable(self):
  825. # Check some non-iterables
  826. non_samples = [None, 42, 3.14, 1j]
  827. for x in non_samples:
  828. self.assertNotIsInstance(x, Iterable)
  829. self.assertFalse(issubclass(type(x), Iterable), repr(type(x)))
  830. # Check some iterables
  831. samples = [bytes(), str(),
  832. tuple(), list(), set(), frozenset(), dict(),
  833. dict().keys(), dict().items(), dict().values(),
  834. _test_gen(),
  835. (x for x in []),
  836. ]
  837. for x in samples:
  838. self.assertIsInstance(x, Iterable)
  839. self.assertTrue(issubclass(type(x), Iterable), repr(type(x)))
  840. # Check direct subclassing
  841. class I(Iterable):
  842. def __iter__(self):
  843. return super().__iter__()
  844. self.assertEqual(list(I()), [])
  845. self.assertFalse(issubclass(str, I))
  846. self.validate_abstract_methods(Iterable, '__iter__')
  847. self.validate_isinstance(Iterable, '__iter__')
  848. # Check None blocking
  849. class It:
  850. def __iter__(self): return iter([])
  851. class ItBlocked(It):
  852. __iter__ = None
  853. self.assertTrue(issubclass(It, Iterable))
  854. self.assertTrue(isinstance(It(), Iterable))
  855. self.assertFalse(issubclass(ItBlocked, Iterable))
  856. self.assertFalse(isinstance(ItBlocked(), Iterable))
  857. def test_Reversible(self):
  858. # Check some non-reversibles
  859. non_samples = [None, 42, 3.14, 1j, set(), frozenset()]
  860. for x in non_samples:
  861. self.assertNotIsInstance(x, Reversible)
  862. self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
  863. # Check some non-reversible iterables
  864. non_reversibles = [_test_gen(), (x for x in []), iter([]), reversed([])]
  865. for x in non_reversibles:
  866. self.assertNotIsInstance(x, Reversible)
  867. self.assertFalse(issubclass(type(x), Reversible), repr(type(x)))
  868. # Check some reversible iterables
  869. samples = [bytes(), str(), tuple(), list(), OrderedDict(),
  870. OrderedDict().keys(), OrderedDict().items(),
  871. OrderedDict().values(), Counter(), Counter().keys(),
  872. Counter().items(), Counter().values(), dict(),
  873. dict().keys(), dict().items(), dict().values()]
  874. for x in samples:
  875. self.assertIsInstance(x, Reversible)
  876. self.assertTrue(issubclass(type(x), Reversible), repr(type(x)))
  877. # Check also Mapping, MutableMapping, and Sequence
  878. self.assertTrue(issubclass(Sequence, Reversible), repr(Sequence))
  879. self.assertFalse(issubclass(Mapping, Reversible), repr(Mapping))
  880. self.assertFalse(issubclass(MutableMapping, Reversible), repr(MutableMapping))
  881. # Check direct subclassing
  882. class R(Reversible):
  883. def __iter__(self):
  884. return iter(list())
  885. def __reversed__(self):
  886. return iter(list())
  887. self.assertEqual(list(reversed(R())), [])
  888. self.assertFalse(issubclass(float, R))
  889. self.validate_abstract_methods(Reversible, '__reversed__', '__iter__')
  890. # Check reversible non-iterable (which is not Reversible)
  891. class RevNoIter:
  892. def __reversed__(self): return reversed([])
  893. class RevPlusIter(RevNoIter):
  894. def __iter__(self): return iter([])
  895. self.assertFalse(issubclass(RevNoIter, Reversible))
  896. self.assertFalse(isinstance(RevNoIter(), Reversible))
  897. self.assertTrue(issubclass(RevPlusIter, Reversible))
  898. self.assertTrue(isinstance(RevPlusIter(), Reversible))
  899. # Check None blocking
  900. class Rev:
  901. def __iter__(self): return iter([])
  902. def __reversed__(self): return reversed([])
  903. class RevItBlocked(Rev):
  904. __iter__ = None
  905. class RevRevBlocked(Rev):
  906. __reversed__ = None
  907. self.assertTrue(issubclass(Rev, Reversible))
  908. self.assertTrue(isinstance(Rev(), Reversible))
  909. self.assertFalse(issubclass(RevItBlocked, Reversible))
  910. self.assertFalse(isinstance(RevItBlocked(), Reversible))
  911. self.assertFalse(issubclass(RevRevBlocked, Reversible))
  912. self.assertFalse(isinstance(RevRevBlocked(), Reversible))
  913. def test_Collection(self):
  914. # Check some non-collections
  915. non_collections = [None, 42, 3.14, 1j, lambda x: 2*x]
  916. for x in non_collections:
  917. self.assertNotIsInstance(x, Collection)
  918. self.assertFalse(issubclass(type(x), Collection), repr(type(x)))
  919. # Check some non-collection iterables
  920. non_col_iterables = [_test_gen(), iter(b''), iter(bytearray()),
  921. (x for x in [])]
  922. for x in non_col_iterables:
  923. self.assertNotIsInstance(x, Collection)
  924. self.assertFalse(issubclass(type(x), Collection), repr(type(x)))
  925. # Check some collections
  926. samples = [set(), frozenset(), dict(), bytes(), str(), tuple(),
  927. list(), dict().keys(), dict().items(), dict().values()]
  928. for x in samples:
  929. self.assertIsInstance(x, Collection)
  930. self.assertTrue(issubclass(type(x), Collection), repr(type(x)))
  931. # Check also Mapping, MutableMapping, etc.
  932. self.assertTrue(issubclass(Sequence, Collection), repr(Sequence))
  933. self.assertTrue(issubclass(Mapping, Collection), repr(Mapping))
  934. self.assertTrue(issubclass(MutableMapping, Collection),
  935. repr(MutableMapping))
  936. self.assertTrue(issubclass(Set, Collection), repr(Set))
  937. self.assertTrue(issubclass(MutableSet, Collection), repr(MutableSet))
  938. self.assertTrue(issubclass(Sequence, Collection), repr(MutableSet))
  939. # Check direct subclassing
  940. class Col(Collection):
  941. def __iter__(self):
  942. return iter(list())
  943. def __len__(self):
  944. return 0
  945. def __contains__(self, item):
  946. return False
  947. class DerCol(Col): pass
  948. self.assertEqual(list(iter(Col())), [])
  949. self.assertFalse(issubclass(list, Col))
  950. self.assertFalse(issubclass(set, Col))
  951. self.assertFalse(issubclass(float, Col))
  952. self.assertEqual(list(iter(DerCol())), [])
  953. self.assertFalse(issubclass(list, DerCol))
  954. self.assertFalse(issubclass(set, DerCol))
  955. self.assertFalse(issubclass(float, DerCol))
  956. self.validate_abstract_methods(Collection, '__len__', '__iter__',
  957. '__contains__')
  958. # Check sized container non-iterable (which is not Collection) etc.
  959. class ColNoIter:
  960. def __len__(self): return 0
  961. def __contains__(self, item): return False
  962. class ColNoSize:
  963. def __iter__(self): return iter([])
  964. def __contains__(self, item): return False
  965. class ColNoCont:
  966. def __iter__(self): return iter([])
  967. def __len__(self): return 0
  968. self.assertFalse(issubclass(ColNoIter, Collection))
  969. self.assertFalse(isinstance(ColNoIter(), Collection))
  970. self.assertFalse(issubclass(ColNoSize, Collection))
  971. self.assertFalse(isinstance(ColNoSize(), Collection))
  972. self.assertFalse(issubclass(ColNoCont, Collection))
  973. self.assertFalse(isinstance(ColNoCont(), Collection))
  974. # Check None blocking
  975. class SizeBlock:
  976. def __iter__(self): return iter([])
  977. def __contains__(self): return False
  978. __len__ = None
  979. class IterBlock:
  980. def __len__(self): return 0
  981. def __contains__(self): return True
  982. __iter__ = None
  983. self.assertFalse(issubclass(SizeBlock, Collection))
  984. self.assertFalse(isinstance(SizeBlock(), Collection))
  985. self.assertFalse(issubclass(IterBlock, Collection))
  986. self.assertFalse(isinstance(IterBlock(), Collection))
  987. # Check None blocking in subclass
  988. class ColImpl:
  989. def __iter__(self):
  990. return iter(list())
  991. def __len__(self):
  992. return 0
  993. def __contains__(self, item):
  994. return False
  995. class NonCol(ColImpl):
  996. __contains__ = None
  997. self.assertFalse(issubclass(NonCol, Collection))
  998. self.assertFalse(isinstance(NonCol(), Collection))
  999. def test_Iterator(self):
  1000. non_samples = [None, 42, 3.14, 1j, b"", "", (), [], {}, set()]
  1001. for x in non_samples:
  1002. self.assertNotIsInstance(x, Iterator)
  1003. self.assertFalse(issubclass(type(x), Iterator), repr(type(x)))
  1004. samples = [iter(bytes()), iter(str()),
  1005. iter(tuple()), iter(list()), iter(dict()),
  1006. iter(set()), iter(frozenset()),
  1007. iter(dict().keys()), iter(dict().items()),
  1008. iter(dict().values()),
  1009. _test_gen(),
  1010. (x for x in []),
  1011. ]
  1012. for x in samples:
  1013. self.assertIsInstance(x, Iterator)
  1014. self.assertTrue(issubclass(type(x), Iterator), repr(type(x)))
  1015. self.validate_abstract_methods(Iterator, '__next__', '__iter__')
  1016. # Issue 10565
  1017. class NextOnly:
  1018. def __next__(self):
  1019. yield 1
  1020. return
  1021. self.assertNotIsInstance(NextOnly(), Iterator)
  1022. def test_Generator(self):
  1023. class NonGen1:
  1024. def __iter__(self): return self
  1025. def __next__(self): return None
  1026. def close(self): pass
  1027. def throw(self, typ, val=None, tb=None): pass
  1028. class NonGen2:
  1029. def __iter__(self): return self
  1030. def __next__(self): return None
  1031. def close(self): pass
  1032. def send(self, value): return value
  1033. class NonGen3:
  1034. def close(self): pass
  1035. def send(self, value): return value
  1036. def throw(self, typ, val=None, tb=None): pass
  1037. non_samples = [
  1038. None, 42, 3.14, 1j, b"", "", (), [], {}, set(),
  1039. iter(()), iter([]), NonGen1(), NonGen2(), NonGen3()]
  1040. for x in non_samples:
  1041. self.assertNotIsInstance(x, Generator)
  1042. self.assertFalse(issubclass(type(x), Generator), repr(type(x)))
  1043. class Gen:
  1044. def __iter__(self): return self
  1045. def __next__(self): return None
  1046. def close(self): pass
  1047. def send(self, value): return value
  1048. def throw(self, typ, val=None, tb=None): pass
  1049. class MinimalGen(Generator):
  1050. def send(self, value):
  1051. return value
  1052. def throw(self, typ, val=None, tb=None):
  1053. super().throw(typ, val, tb)
  1054. def gen():
  1055. yield 1
  1056. samples = [gen(), (lambda: (yield))(), Gen(), MinimalGen()]
  1057. for x in samples:
  1058. self.assertIsInstance(x, Iterator)
  1059. self.assertIsInstance(x, Generator)
  1060. self.assertTrue(issubclass(type(x), Generator), repr(type(x)))
  1061. self.validate_abstract_methods(Generator, 'send', 'throw')
  1062. # mixin tests
  1063. mgen = MinimalGen()
  1064. self.assertIs(mgen, iter(mgen))
  1065. self.assertIs(mgen.send(None), next(mgen))
  1066. self.assertEqual(2, mgen.send(2))
  1067. self.assertIsNone(mgen.close())
  1068. self.assertRaises(ValueError, mgen.throw, ValueError)
  1069. self.assertRaisesRegex(ValueError, "^huhu$",
  1070. mgen.throw, ValueError, ValueError("huhu"))
  1071. self.assertRaises(StopIteration, mgen.throw, StopIteration())
  1072. class FailOnClose(Generator):
  1073. def send(self, value): return value
  1074. def throw(self, *args): raise ValueError
  1075. self.assertRaises(ValueError, FailOnClose().close)
  1076. class IgnoreGeneratorExit(Generator):
  1077. def send(self, value): return value
  1078. def throw(self, *args): pass
  1079. self.assertRaises(RuntimeError, IgnoreGeneratorExit().close)
  1080. def test_AsyncGenerator(self):
  1081. class NonAGen1:
  1082. def __aiter__(self): return self
  1083. def __anext__(self): return None
  1084. def aclose(self): pass
  1085. def athrow(self, typ, val=None, tb=None): pass
  1086. class NonAGen2:
  1087. def __aiter__(self): return self
  1088. def __anext__(self): return None
  1089. def aclose(self): pass
  1090. def asend(self, value): return value
  1091. class NonAGen3:
  1092. def aclose(self): pass
  1093. def asend(self, value): return value
  1094. def athrow(self, typ, val=None, tb=None): pass
  1095. non_samples = [
  1096. None, 42, 3.14, 1j, b"", "", (), [], {}, set(),
  1097. iter(()), iter([]), NonAGen1(), NonAGen2(), NonAGen3()]
  1098. for x in non_samples:
  1099. self.assertNotIsInstance(x, AsyncGenerator)
  1100. self.assertFalse(issubclass(type(x), AsyncGenerator), repr(type(x)))
  1101. class Gen:
  1102. def __aiter__(self): return self
  1103. async def __anext__(self): return None
  1104. async def aclose(self): pass
  1105. async def asend(self, value): return value
  1106. async def athrow(self, typ, val=None, tb=None): pass
  1107. class MinimalAGen(AsyncGenerator):
  1108. async def asend(self, value):
  1109. return value
  1110. async def athrow(self, typ, val=None, tb=None):
  1111. await super().athrow(typ, val, tb)
  1112. async def gen():
  1113. yield 1
  1114. samples = [gen(), Gen(), MinimalAGen()]
  1115. for x in samples:
  1116. self.assertIsInstance(x, AsyncIterator)
  1117. self.assertIsInstance(x, AsyncGenerator)
  1118. self.assertTrue(issubclass(type(x), AsyncGenerator), repr(type(x)))
  1119. self.validate_abstract_methods(AsyncGenerator, 'asend', 'athrow')
  1120. def run_async(coro):
  1121. result = None
  1122. while True:
  1123. try:
  1124. coro.send(None)
  1125. except StopIteration as ex:
  1126. result = ex.args[0] if ex.args else None
  1127. break
  1128. return result
  1129. # mixin tests
  1130. mgen = MinimalAGen()
  1131. self.assertIs(mgen, mgen.__aiter__())
  1132. self.assertIs(run_async(mgen.asend(None)), run_async(mgen.__anext__()))
  1133. self.assertEqual(2, run_async(mgen.asend(2)))
  1134. self.assertIsNone(run_async(mgen.aclose()))
  1135. with self.assertRaises(ValueError):
  1136. run_async(mgen.athrow(ValueError))
  1137. class FailOnClose(AsyncGenerator):
  1138. async def asend(self, value): return value
  1139. async def athrow(self, *args): raise ValueError
  1140. with self.assertRaises(ValueError):
  1141. run_async(FailOnClose().aclose())
  1142. class IgnoreGeneratorExit(AsyncGenerator):
  1143. async def asend(self, value): return value
  1144. async def athrow(self, *args): pass
  1145. with self.assertRaises(RuntimeError):
  1146. run_async(IgnoreGeneratorExit().aclose())
  1147. def test_Sized(self):
  1148. non_samples = [None, 42, 3.14, 1j,
  1149. _test_gen(),
  1150. (x for x in []),
  1151. ]
  1152. for x in non_samples:
  1153. self.assertNotIsInstance(x, Sized)
  1154. self.assertFalse(issubclass(type(x), Sized), repr(type(x)))
  1155. samples = [bytes(), str(),
  1156. tuple(), list(), set(), frozenset(), dict(),
  1157. dict().keys(), dict().items(), dict().values(),
  1158. ]
  1159. for x in samples:
  1160. self.assertIsInstance(x, Sized)
  1161. self.assertTrue(issubclass(type(x), Sized), repr(type(x)))
  1162. self.validate_abstract_methods(Sized, '__len__')
  1163. self.validate_isinstance(Sized, '__len__')
  1164. def test_Container(self):
  1165. non_samples = [None, 42, 3.14, 1j,
  1166. _test_gen(),
  1167. (x for x in []),
  1168. ]
  1169. for x in non_samples:
  1170. self.assertNotIsInstance(x, Container)
  1171. self.assertFalse(issubclass(type(x), Container), repr(type(x)))
  1172. samples = [bytes(), str(),
  1173. tuple(), list(), set(), frozenset(), dict(),
  1174. dict().keys(), dict().items(),
  1175. ]
  1176. for x in samples:
  1177. self.assertIsInstance(x, Container)
  1178. self.assertTrue(issubclass(type(x), Container), repr(type(x)))
  1179. self.validate_abstract_methods(Container, '__contains__')
  1180. self.validate_isinstance(Container, '__contains__')
  1181. def test_Callable(self):
  1182. non_samples = [None, 42, 3.14, 1j,
  1183. "", b"", (), [], {}, set(),
  1184. _test_gen(),
  1185. (x for x in []),
  1186. ]
  1187. for x in non_samples:
  1188. self.assertNotIsInstance(x, Callable)
  1189. self.assertFalse(issubclass(type(x), Callable), repr(type(x)))
  1190. samples = [lambda: None,
  1191. type, int, object,
  1192. len,
  1193. list.append, [].append,
  1194. ]
  1195. for x in samples:
  1196. self.assertIsInstance(x, Callable)
  1197. self.assertTrue(issubclass(type(x), Callable), repr(type(x)))
  1198. self.validate_abstract_methods(Callable, '__call__')
  1199. self.validate_isinstance(Callable, '__call__')
  1200. def test_direct_subclassing(self):
  1201. for B in Hashable, Iterable, Iterator, Reversible, Sized, Container, Callable:
  1202. class C(B):
  1203. pass
  1204. self.assertTrue(issubclass(C, B))
  1205. self.assertFalse(issubclass(int, C))
  1206. def test_registration(self):
  1207. for B in Hashable, Iterable, Iterator, Reversible, Sized, Container, Callable:
  1208. class C:
  1209. __hash__ = None # Make sure it isn't hashable by default
  1210. self.assertFalse(issubclass(C, B), B.__name__)
  1211. B.register(C)
  1212. self.assertTrue(issubclass(C, B))
  1213. class WithSet(MutableSet):
  1214. def __init__(self, it=()):
  1215. self.data = set(it)
  1216. def __len__(self):
  1217. return len(self.data)
  1218. def __iter__(self):
  1219. return iter(self.data)
  1220. def __contains__(self, item):
  1221. return item in self.data
  1222. def add(self, item):
  1223. self.data.add(item)
  1224. def discard(self, item):
  1225. self.data.discard(item)
  1226. class TestCollectionABCs(ABCTestCase):
  1227. # XXX For now, we only test some virtual inheritance properties.
  1228. # We should also test the proper behavior of the collection ABCs
  1229. # as real base classes or mix-in classes.
  1230. def test_Set(self):
  1231. for sample in [set, frozenset]:
  1232. self.assertIsInstance(sample(), Set)
  1233. self.assertTrue(issubclass(sample, Set))
  1234. self.validate_abstract_methods(Set, '__contains__', '__iter__', '__len__')
  1235. class MySet(Set):
  1236. def __contains__(self, x):
  1237. return False
  1238. def __len__(self):
  1239. return 0
  1240. def __iter__(self):
  1241. return iter([])
  1242. self.validate_comparison(MySet())
  1243. def test_hash_Set(self):
  1244. class OneTwoThreeSet(Set):
  1245. def __init__(self):
  1246. self.contents = [1, 2, 3]
  1247. def __contains__(self, x):
  1248. return x in self.contents
  1249. def __len__(self):
  1250. return len(self.contents)
  1251. def __iter__(self):
  1252. return iter(self.contents)
  1253. def __hash__(self):
  1254. return self._hash()
  1255. a, b = OneTwoThreeSet(), OneTwoThreeSet()
  1256. self.assertTrue(hash(a) == hash(b))
  1257. def test_isdisjoint_Set(self):
  1258. class MySet(Set):
  1259. def __init__(self, itr):
  1260. self.contents = itr
  1261. def __contains__(self, x):
  1262. return x in self.contents
  1263. def __iter__(self):
  1264. return iter(self.contents)
  1265. def __len__(self):
  1266. return len([x for x in self.contents])
  1267. s1 = MySet((1, 2, 3))
  1268. s2 = MySet((4, 5, 6))
  1269. s3 = MySet((1, 5, 6))
  1270. self.assertTrue(s1.isdisjoint(s2))
  1271. self.assertFalse(s1.isdisjoint(s3))
  1272. def test_equality_Set(self):
  1273. class MySet(Set):
  1274. def __init__(self, itr):
  1275. self.contents = itr
  1276. def __contains__(self, x):
  1277. return x in self.contents
  1278. def __iter__(self):
  1279. return iter(self.contents)
  1280. def __len__(self):
  1281. return len([x for x in self.contents])
  1282. s1 = MySet((1,))
  1283. s2 = MySet((1, 2))
  1284. s3 = MySet((3, 4))
  1285. s4 = MySet((3, 4))
  1286. self.assertTrue(s2 > s1)
  1287. self.assertTrue(s1 < s2)
  1288. self.assertFalse(s2 <= s1)
  1289. self.assertFalse(s2 <= s3)
  1290. self.assertFalse(s1 >= s2)
  1291. self.assertEqual(s3, s4)
  1292. self.assertNotEqual(s2, s3)
  1293. def test_arithmetic_Set(self):
  1294. class MySet(Set):
  1295. def __init__(self, itr):
  1296. self.contents = itr
  1297. def __contains__(self, x):
  1298. return x in self.contents
  1299. def __iter__(self):
  1300. return iter(self.contents)
  1301. def __len__(self):
  1302. return len([x for x in self.contents])
  1303. s1 = MySet((1, 2, 3))
  1304. s2 = MySet((3, 4, 5))
  1305. s3 = s1 & s2
  1306. self.assertEqual(s3, MySet((3,)))
  1307. def test_MutableSet(self):
  1308. self.assertIsInstance(set(), MutableSet)
  1309. self.assertTrue(issubclass(set, MutableSet))
  1310. self.assertNotIsInstance(frozenset(), MutableSet)
  1311. self.assertFalse(issubclass(frozenset, MutableSet))
  1312. self.validate_abstract_methods(MutableSet, '__contains__', '__iter__', '__len__',
  1313. 'add', 'discard')
  1314. def test_issue_5647(self):
  1315. # MutableSet.__iand__ mutated the set during iteration
  1316. s = WithSet('abcd')
  1317. s &= WithSet('cdef') # This used to fail
  1318. self.assertEqual(set(s), set('cd'))
  1319. def test_issue_4920(self):
  1320. # MutableSet.pop() method did not work
  1321. class MySet(MutableSet):
  1322. __slots__=['__s']
  1323. def __init__(self,items=None):
  1324. if items is None:
  1325. items=[]
  1326. self.__s=set(items)
  1327. def __contains__(self,v):
  1328. return v in self.__s
  1329. def __iter__(self):
  1330. return iter(self.__s)
  1331. def __len__(self):
  1332. return len(self.__s)
  1333. def add(self,v):
  1334. result=v not in self.__s
  1335. self.__s.add(v)
  1336. return result
  1337. def discard(self,v):
  1338. result=v in self.__s
  1339. self.__s.discard(v)
  1340. return result
  1341. def __repr__(self):
  1342. return "MySet(%s)" % repr(list(self))
  1343. items = [5,43,2,1]
  1344. s = MySet(items)
  1345. r = s.pop()
  1346. self.assertEqual(len(s), len(items) - 1)
  1347. self.assertNotIn(r, s)
  1348. self.assertIn(r, items)
  1349. def test_issue8750(self):
  1350. empty = WithSet()
  1351. full = WithSet(range(10))
  1352. s = WithSet(full)
  1353. s -= s
  1354. self.assertEqual(s, empty)
  1355. s = WithSet(full)
  1356. s ^= s
  1357. self.assertEqual(s, empty)
  1358. s = WithSet(full)
  1359. s &= s
  1360. self.assertEqual(s, full)
  1361. s |= s
  1362. self.assertEqual(s, full)
  1363. def test_issue16373(self):
  1364. # Recursion error comparing comparable and noncomparable
  1365. # Set instances
  1366. class MyComparableSet(Set):
  1367. def __contains__(self, x):
  1368. return False
  1369. def __len__(self):
  1370. return 0
  1371. def __iter__(self):
  1372. return iter([])
  1373. class MyNonComparableSet(Set):
  1374. def __contains__(self, x):
  1375. return False
  1376. def __len__(self):
  1377. return 0
  1378. def __iter__(self):
  1379. return iter([])
  1380. def __le__(self, x):
  1381. return NotImplemented
  1382. def __lt__(self, x):
  1383. return NotImplemented
  1384. cs = MyComparableSet()
  1385. ncs = MyNonComparableSet()
  1386. self.assertFalse(ncs < cs)
  1387. self.assertTrue(ncs <= cs)
  1388. self.assertFalse(ncs > cs)
  1389. self.assertTrue(ncs >= cs)
  1390. def test_issue26915(self):
  1391. # Container membership test should check identity first
  1392. class CustomSequence(Sequence):
  1393. def __init__(self, seq):
  1394. self._seq = seq
  1395. def __getitem__(self, index):
  1396. return self._seq[index]
  1397. def __len__(self):
  1398. return len(self._seq)
  1399. nan = float('nan')
  1400. obj = support.NEVER_EQ
  1401. seq = CustomSequence([nan, obj, nan])
  1402. containers = [
  1403. seq,
  1404. ItemsView({1: nan, 2: obj}),
  1405. KeysView({1: nan, 2: obj}),
  1406. ValuesView({1: nan, 2: obj})
  1407. ]
  1408. for container in containers:
  1409. for elem in container:
  1410. self.assertIn(elem, container)
  1411. self.assertEqual(seq.index(nan), 0)
  1412. self.assertEqual(seq.index(obj), 1)
  1413. self.assertEqual(seq.count(nan), 2)
  1414. self.assertEqual(seq.count(obj), 1)
  1415. def assertSameSet(self, s1, s2):
  1416. # coerce both to a real set then check equality
  1417. self.assertSetEqual(set(s1), set(s2))
  1418. def test_Set_from_iterable(self):
  1419. """Verify _from_iterable overridden to an instance method works."""
  1420. class SetUsingInstanceFromIterable(MutableSet):
  1421. def __init__(self, values, created_by):
  1422. if not created_by:
  1423. raise ValueError(f'created_by must be specified')
  1424. self.created_by = created_by
  1425. self._values = set(values)
  1426. def _from_iterable(self, values):
  1427. return type(self)(values, 'from_iterable')
  1428. def __contains__(self, value):
  1429. return value in self._values
  1430. def __iter__(self):
  1431. yield from self._values
  1432. def __len__(self):
  1433. return len(self._values)
  1434. def add(self, value):
  1435. self._values.add(value)
  1436. def discard(self, value):
  1437. self._values.discard(value)
  1438. impl = SetUsingInstanceFromIterable([1, 2, 3], 'test')
  1439. actual = impl - {1}
  1440. self.assertIsInstance(actual, SetUsingInstanceFromIterable)
  1441. self.assertEqual('from_iterable', actual.created_by)
  1442. self.assertEqual({2, 3}, actual)
  1443. actual = impl | {4}
  1444. self.assertIsInstance(actual, SetUsingInstanceFromIterable)
  1445. self.assertEqual('from_iterable', actual.created_by)
  1446. self.assertEqual({1, 2, 3, 4}, actual)
  1447. actual = impl & {2}
  1448. self.assertIsInstance(actual, SetUsingInstanceFromIterable)
  1449. self.assertEqual('from_iterable', actual.created_by)
  1450. self.assertEqual({2}, actual)
  1451. actual = impl ^ {3, 4}
  1452. self.assertIsInstance(actual, SetUsingInstanceFromIterable)
  1453. self.assertEqual('from_iterable', actual.created_by)
  1454. self.assertEqual({1, 2, 4}, actual)
  1455. # NOTE: ixor'ing with a list is important here: internally, __ixor__
  1456. # only calls _from_iterable if the other value isn't already a Set.
  1457. impl ^= [3, 4]
  1458. self.assertIsInstance(impl, SetUsingInstanceFromIterable)
  1459. self.assertEqual('test', impl.created_by)
  1460. self.assertEqual({1, 2, 4}, impl)
  1461. def test_Set_interoperability_with_real_sets(self):
  1462. # Issue: 8743
  1463. class ListSet(Set):
  1464. def __init__(self, elements=()):
  1465. self.data = []
  1466. for elem in elements:
  1467. if elem not in self.data:
  1468. self.data.append(elem)
  1469. def __contains__(self, elem):
  1470. return elem in self.data
  1471. def __iter__(self):
  1472. return iter(self.data)
  1473. def __len__(self):
  1474. return len(self.data)
  1475. def __repr__(self):
  1476. return 'Set({!r})'.format(self.data)
  1477. r1 = set('abc')
  1478. r2 = set('bcd')
  1479. r3 = set('abcde')
  1480. f1 = ListSet('abc')
  1481. f2 = ListSet('bcd')
  1482. f3 = ListSet('abcde')
  1483. l1 = list('abccba')
  1484. l2 = list('bcddcb')
  1485. l3 = list('abcdeedcba')
  1486. target = r1 & r2
  1487. self.assertSameSet(f1 & f2, target)
  1488. self.assertSameSet(f1 & r2, target)
  1489. self.assertSameSet(r2 & f1, target)
  1490. self.assertSameSet(f1 & l2, target)
  1491. target = r1 | r2
  1492. self.assertSameSet(f1 | f2, target)
  1493. self.assertSameSet(f1 | r2, target)
  1494. self.assertSameSet(r2 | f1, target)
  1495. self.assertSameSet(f1 | l2, target)
  1496. fwd_target = r1 - r2
  1497. rev_target = r2 - r1
  1498. self.assertSameSet(f1 - f2, fwd_target)
  1499. self.assertSameSet(f2 - f1, rev_target)
  1500. self.assertSameSet(f1 - r2, fwd_target)
  1501. self.assertSameSet(f2 - r1, rev_target)
  1502. self.assertSameSet(r1 - f2, fwd_target)
  1503. self.assertSameSet(r2 - f1, rev_target)
  1504. self.assertSameSet(f1 - l2, fwd_target)
  1505. self.assertSameSet(f2 - l1, rev_target)
  1506. target = r1 ^ r2
  1507. self.assertSameSet(f1 ^ f2, target)
  1508. self.assertSameSet(f1 ^ r2, target)
  1509. self.assertSameSet(r2 ^ f1, target)
  1510. self.assertSameSet(f1 ^ l2, target)
  1511. # Don't change the following to use assertLess or other
  1512. # "more specific" unittest assertions. The current
  1513. # assertTrue/assertFalse style makes the pattern of test
  1514. # case combinations clear and allows us to know for sure
  1515. # the exact operator being invoked.
  1516. # proper subset
  1517. self.assertTrue(f1 < f3)
  1518. self.assertFalse(f1 < f1)
  1519. self.assertFalse(f1 < f2)
  1520. self.assertTrue(r1 < f3)
  1521. self.assertFalse(r1 < f1)
  1522. self.assertFalse(r1 < f2)
  1523. self.assertTrue(r1 < r3)
  1524. self.assertFalse(r1 < r1)
  1525. self.assertFalse(r1 < r2)
  1526. with self.assertRaises(TypeError):
  1527. f1 < l3
  1528. with self.assertRaises(TypeError):
  1529. f1 < l1
  1530. with self.assertRaises(TypeError):
  1531. f1 < l2
  1532. # any subset
  1533. self.assertTrue(f1 <= f3)
  1534. self.assertTrue(f1 <= f1)
  1535. self.assertFalse(f1 <= f2)
  1536. self.assertTrue(r1 <= f3)
  1537. self.assertTrue(r1 <= f1)
  1538. self.assertFalse(r1 <= f2)
  1539. self.assertTrue(r1 <= r3)
  1540. self.assertTrue(r1 <= r1)
  1541. self.assertFalse(r1 <= r2)
  1542. with self.assertRaises(TypeError):
  1543. f1 <= l3
  1544. with self.assertRaises(TypeError):
  1545. f1 <= l1
  1546. with self.assertRaises(TypeError):
  1547. f1 <= l2
  1548. # proper superset
  1549. self.assertTrue(f3 > f1)
  1550. self.assertFalse(f1 > f1)
  1551. self.assertFalse(f2 > f1)
  1552. self.assertTrue(r3 > r1)
  1553. self.assertFalse(f1 > r1)
  1554. self.assertFalse(f2 > r1)
  1555. self.assertTrue(r3 > r1)
  1556. self.assertFalse(r1 > r1)
  1557. self.assertFalse(r2 > r1)
  1558. with self.assertRaises(TypeError):
  1559. f1 > l3
  1560. with self.assertRaises(TypeError):
  1561. f1 > l1
  1562. with self.assertRaises(TypeError):
  1563. f1 > l2
  1564. # any superset
  1565. self.assertTrue(f3 >= f1)
  1566. self.assertTrue(f1 >= f1)
  1567. self.assertFalse(f2 >= f1)
  1568. self.assertTrue(r3 >= r1)
  1569. self.assertTrue(f1 >= r1)
  1570. self.assertFalse(f2 >= r1)
  1571. self.assertTrue(r3 >= r1)
  1572. self.assertTrue(r1 >= r1)
  1573. self.assertFalse(r2 >= r1)
  1574. with self.assertRaises(TypeError):
  1575. f1 >= l3
  1576. with self.assertRaises(TypeError):
  1577. f1 >=l1
  1578. with self.assertRaises(TypeError):
  1579. f1 >= l2
  1580. # equality
  1581. self.assertTrue(f1 == f1)
  1582. self.assertTrue(r1 == f1)
  1583. self.assertTrue(f1 == r1)
  1584. self.assertFalse(f1 == f3)
  1585. self.assertFalse(r1 == f3)
  1586. self.assertFalse(f1 == r3)
  1587. self.assertFalse(f1 == l3)
  1588. self.assertFalse(f1 == l1)
  1589. self.assertFalse(f1 == l2)
  1590. # inequality
  1591. self.assertFalse(f1 != f1)
  1592. self.assertFalse(r1 != f1)
  1593. self.assertFalse(f1 != r1)
  1594. self.assertTrue(f1 != f3)
  1595. self.assertTrue(r1 != f3)
  1596. self.assertTrue(f1 != r3)
  1597. self.assertTrue(f1 != l3)
  1598. self.assertTrue(f1 != l1)
  1599. self.assertTrue(f1 != l2)
  1600. def test_Set_hash_matches_frozenset(self):
  1601. sets = [
  1602. {}, {1}, {None}, {-1}, {0.0}, {"abc"}, {1, 2, 3},
  1603. {10**100, 10**101}, {"a", "b", "ab", ""}, {False, True},
  1604. {object(), object(), object()}, {float("nan")}, {frozenset()},
  1605. {*range(1000)}, {*range(1000)} - {100, 200, 300},
  1606. {*range(sys.maxsize - 10, sys.maxsize + 10)},
  1607. ]
  1608. for s in sets:
  1609. fs = frozenset(s)
  1610. self.assertEqual(hash(fs), Set._hash(fs), msg=s)
  1611. def test_Mapping(self):
  1612. for sample in [dict]:
  1613. self.assertIsInstance(sample(), Mapping)
  1614. self.assertTrue(issubclass(sample, Mapping))
  1615. self.validate_abstract_methods(Mapping, '__contains__', '__iter__', '__len__',
  1616. '__getitem__')
  1617. class MyMapping(Mapping):
  1618. def __len__(self):
  1619. return 0
  1620. def __getitem__(self, i):
  1621. raise IndexError
  1622. def __iter__(self):
  1623. return iter(())
  1624. self.validate_comparison(MyMapping())
  1625. self.assertRaises(TypeError, reversed, MyMapping())
  1626. def test_MutableMapping(self):
  1627. for sample in [dict]:
  1628. self.assertIsInstance(sample(), MutableMapping)
  1629. self.assertTrue(issubclass(sample, MutableMapping))
  1630. self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__',
  1631. '__getitem__', '__setitem__', '__delitem__')
  1632. def test_MutableMapping_subclass(self):
  1633. # Test issue 9214
  1634. mymap = UserDict()
  1635. mymap['red'] = 5
  1636. self.assertIsInstance(mymap.keys(), Set)
  1637. self.assertIsInstance(mymap.keys(), KeysView)
  1638. self.assertIsInstance(mymap.values(), Collection)
  1639. self.assertIsInstance(mymap.values(), ValuesView)
  1640. self.assertIsInstance(mymap.items(), Set)
  1641. self.assertIsInstance(mymap.items(), ItemsView)
  1642. mymap = UserDict()
  1643. mymap['red'] = 5
  1644. z = mymap.keys() | {'orange'}
  1645. self.assertIsInstance(z, set)
  1646. list(z)
  1647. mymap['blue'] = 7 # Shouldn't affect 'z'
  1648. self.assertEqual(sorted(z), ['orange', 'red'])
  1649. mymap = UserDict()
  1650. mymap['red'] = 5
  1651. z = mymap.items() | {('orange', 3)}
  1652. self.assertIsInstance(z, set)
  1653. list(z)
  1654. mymap['blue'] = 7 # Shouldn't affect 'z'
  1655. self.assertEqual(z, {('orange', 3), ('red', 5)})
  1656. def test_Sequence(self):
  1657. for sample in [tuple, list, bytes, str]:
  1658. self.assertIsInstance(sample(), Sequence)
  1659. self.assertTrue(issubclass(sample, Sequence))
  1660. self.assertIsInstance(range(10), Sequence)
  1661. self.assertTrue(issubclass(range, Sequence))
  1662. self.assertIsInstance(memoryview(b""), Sequence)
  1663. self.assertTrue(issubclass(memoryview, Sequence))
  1664. self.assertTrue(issubclass(str, Sequence))
  1665. self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__',
  1666. '__getitem__')
  1667. def test_Sequence_mixins(self):
  1668. class SequenceSubclass(Sequence):
  1669. def __init__(self, seq=()):
  1670. self.seq = seq
  1671. def __getitem__(self, index):
  1672. return self.seq[index]
  1673. def __len__(self):
  1674. return len(self.seq)
  1675. # Compare Sequence.index() behavior to (list|str).index() behavior
  1676. def assert_index_same(seq1, seq2, index_args):
  1677. try:
  1678. expected = seq1.index(*index_args)
  1679. except ValueError:
  1680. with self.assertRaises(ValueError):
  1681. seq2.index(*index_args)
  1682. else:
  1683. actual = seq2.index(*index_args)
  1684. self.assertEqual(
  1685. actual, expected, '%r.index%s' % (seq1, index_args))
  1686. for ty in list, str:
  1687. nativeseq = ty('abracadabra')
  1688. indexes = [-10000, -9999] + list(range(-3, len(nativeseq) + 3))
  1689. seqseq = SequenceSubclass(nativeseq)
  1690. for letter in set(nativeseq) | {'z'}:
  1691. assert_index_same(nativeseq, seqseq, (letter,))
  1692. for start in range(-3, len(nativeseq) + 3):
  1693. assert_index_same(nativeseq, seqseq, (letter, start))
  1694. for stop in range(-3, len(nativeseq) + 3):
  1695. assert_index_same(
  1696. nativeseq, seqseq, (letter, start, stop))
  1697. def test_ByteString(self):
  1698. for sample in [bytes, bytearray]:
  1699. self.assertIsInstance(sample(), ByteString)
  1700. self.assertTrue(issubclass(sample, ByteString))
  1701. for sample in [str, list, tuple]:
  1702. self.assertNotIsInstance(sample(), ByteString)
  1703. self.assertFalse(issubclass(sample, ByteString))
  1704. self.assertNotIsInstance(memoryview(b""), ByteString)
  1705. self.assertFalse(issubclass(memoryview, ByteString))
  1706. self.validate_abstract_methods(ByteString, '__getitem__', '__len__')
  1707. def test_MutableSequence(self):
  1708. for sample in [tuple, str, bytes]:
  1709. self.assertNotIsInstance(sample(), MutableSequence)
  1710. self.assertFalse(issubclass(sample, MutableSequence))
  1711. for sample in [list, bytearray, deque]:
  1712. self.assertIsInstance(sample(), MutableSequence)
  1713. self.assertTrue(issubclass(sample, MutableSequence))
  1714. self.assertFalse(issubclass(str, MutableSequence))
  1715. self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__',
  1716. '__len__', '__getitem__', '__setitem__', '__delitem__', 'insert')
  1717. def test_MutableSequence_mixins(self):
  1718. # Test the mixins of MutableSequence by creating a minimal concrete
  1719. # class inherited from it.
  1720. class MutableSequenceSubclass(MutableSequence):
  1721. def __init__(self):
  1722. self.lst = []
  1723. def __setitem__(self, index, value):
  1724. self.lst[index] = value
  1725. def __getitem__(self, index):
  1726. return self.lst[index]
  1727. def __len__(self):
  1728. return len(self.lst)
  1729. def __delitem__(self, index):
  1730. del self.lst[index]
  1731. def insert(self, index, value):
  1732. self.lst.insert(index, value)
  1733. mss = MutableSequenceSubclass()
  1734. mss.append(0)
  1735. mss.extend((1, 2, 3, 4))
  1736. self.assertEqual(len(mss), 5)
  1737. self.assertEqual(mss[3], 3)
  1738. mss.reverse()
  1739. self.assertEqual(mss[3], 1)
  1740. mss.pop()
  1741. self.assertEqual(len(mss), 4)
  1742. mss.remove(3)
  1743. self.assertEqual(len(mss), 3)
  1744. mss += (10, 20, 30)
  1745. self.assertEqual(len(mss), 6)
  1746. self.assertEqual(mss[-1], 30)
  1747. mss.clear()
  1748. self.assertEqual(len(mss), 0)
  1749. # issue 34427
  1750. # extending self should not cause infinite loop
  1751. items = 'ABCD'
  1752. mss2 = MutableSequenceSubclass()
  1753. mss2.extend(items + items)
  1754. mss.clear()
  1755. mss.extend(items)
  1756. mss.extend(mss)
  1757. self.assertEqual(len(mss), len(mss2))
  1758. self.assertEqual(list(mss), list(mss2))
  1759. def test_illegal_patma_flags(self):
  1760. with self.assertRaises(TypeError):
  1761. class Both(Collection):
  1762. __abc_tpflags__ = (Sequence.__flags__ | Mapping.__flags__)
  1763. ################################################################################
  1764. ### Counter
  1765. ################################################################################
  1766. class CounterSubclassWithSetItem(Counter):
  1767. # Test a counter subclass that overrides __setitem__
  1768. def __init__(self, *args, **kwds):
  1769. self.called = False
  1770. Counter.__init__(self, *args, **kwds)
  1771. def __setitem__(self, key, value):
  1772. self.called = True
  1773. Counter.__setitem__(self, key, value)
  1774. class CounterSubclassWithGet(Counter):
  1775. # Test a counter subclass that overrides get()
  1776. def __init__(self, *args, **kwds):
  1777. self.called = False
  1778. Counter.__init__(self, *args, **kwds)
  1779. def get(self, key, default):
  1780. self.called = True
  1781. return Counter.get(self, key, default)
  1782. class TestCounter(unittest.TestCase):
  1783. def test_basics(self):
  1784. c = Counter('abcaba')
  1785. self.assertEqual(c, Counter({'a':3 , 'b': 2, 'c': 1}))
  1786. self.assertEqual(c, Counter(a=3, b=2, c=1))
  1787. self.assertIsInstance(c, dict)
  1788. self.assertIsInstance(c, Mapping)
  1789. self.assertTrue(issubclass(Counter, dict))
  1790. self.assertTrue(issubclass(Counter, Mapping))
  1791. self.assertEqual(len(c), 3)
  1792. self.assertEqual(sum(c.values()), 6)
  1793. self.assertEqual(list(c.values()), [3, 2, 1])
  1794. self.assertEqual(list(c.keys()), ['a', 'b', 'c'])
  1795. self.assertEqual(list(c), ['a', 'b', 'c'])
  1796. self.assertEqual(list(c.items()),
  1797. [('a', 3), ('b', 2), ('c', 1)])
  1798. self.assertEqual(c['b'], 2)
  1799. self.assertEqual(c['z'], 0)
  1800. self.assertEqual(c.__contains__('c'), True)
  1801. self.assertEqual(c.__contains__('z'), False)
  1802. self.assertEqual(c.get('b', 10), 2)
  1803. self.assertEqual(c.get('z', 10), 10)
  1804. self.assertEqual(c, dict(a=3, b=2, c=1))
  1805. self.assertEqual(repr(c), "Counter({'a': 3, 'b': 2, 'c': 1})")
  1806. self.assertEqual(c.most_common(), [('a', 3), ('b', 2), ('c', 1)])
  1807. for i in range(5):
  1808. self.assertEqual(c.most_common(i),
  1809. [('a', 3), ('b', 2), ('c', 1)][:i])
  1810. self.assertEqual(''.join(c.elements()), 'aaabbc')
  1811. c['a'] += 1 # increment an existing value
  1812. c['b'] -= 2 # sub existing value to zero
  1813. del c['c'] # remove an entry
  1814. del c['c'] # make sure that del doesn't raise KeyError
  1815. c['d'] -= 2 # sub from a missing value
  1816. c['e'] = -5 # directly assign a missing value
  1817. c['f'] += 4 # add to a missing value
  1818. self.assertEqual(c, dict(a=4, b=0, d=-2, e=-5, f=4))
  1819. self.assertEqual(''.join(c.elements()), 'aaaaffff')
  1820. self.assertEqual(c.pop('f'), 4)
  1821. self.assertNotIn('f', c)
  1822. for i in range(3):
  1823. elem, cnt = c.popitem()
  1824. self.assertNotIn(elem, c)
  1825. c.clear()
  1826. self.assertEqual(c, {})
  1827. self.assertEqual(repr(c), 'Counter()')
  1828. self.assertRaises(NotImplementedError, Counter.fromkeys, 'abc')
  1829. self.assertRaises(TypeError, hash, c)
  1830. c.update(dict(a=5, b=3))
  1831. c.update(c=1)
  1832. c.update(Counter('a' * 50 + 'b' * 30))
  1833. c.update() # test case with no args
  1834. c.__init__('a' * 500 + 'b' * 300)
  1835. c.__init__('cdc')
  1836. c.__init__()
  1837. self.assertEqual(c, dict(a=555, b=333, c=3, d=1))
  1838. self.assertEqual(c.setdefault('d', 5), 1)
  1839. self.assertEqual(c['d'], 1)
  1840. self.assertEqual(c.setdefault('e', 5), 5)
  1841. self.assertEqual(c['e'], 5)
  1842. def test_init(self):
  1843. self.assertEqual(list(Counter(self=42).items()), [('self', 42)])
  1844. self.assertEqual(list(Counter(iterable=42).items()), [('iterable', 42)])
  1845. self.assertEqual(list(Counter(iterable=None).items()), [('iterable', None)])
  1846. self.assertRaises(TypeError, Counter, 42)
  1847. self.assertRaises(TypeError, Counter, (), ())
  1848. self.assertRaises(TypeError, Counter.__init__)
  1849. def test_total(self):
  1850. c = Counter(a=10, b=5, c=0)
  1851. self.assertEqual(c.total(), 15)
  1852. def test_order_preservation(self):
  1853. # Input order dictates items() order
  1854. self.assertEqual(list(Counter('abracadabra').items()),
  1855. [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)])
  1856. # letters with same count: ^----------^ ^---------^
  1857. # Verify retention of order even when all counts are equal
  1858. self.assertEqual(list(Counter('xyzpdqqdpzyx').items()),
  1859. [('x', 2), ('y', 2), ('z', 2), ('p', 2), ('d', 2), ('q', 2)])
  1860. # Input order dictates elements() order
  1861. self.assertEqual(list(Counter('abracadabra simsalabim').elements()),
  1862. ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b','r',
  1863. 'r', 'c', 'd', ' ', 's', 's', 'i', 'i', 'm', 'm', 'l'])
  1864. # Math operations order first by the order encountered in the left
  1865. # operand and then by the order encountered in the right operand.
  1866. ps = 'aaabbcdddeefggghhijjjkkl'
  1867. qs = 'abbcccdeefffhkkllllmmnno'
  1868. order = {letter: i for i, letter in enumerate(dict.fromkeys(ps + qs))}
  1869. def correctly_ordered(seq):
  1870. 'Return true if the letters occur in the expected order'
  1871. positions = [order[letter] for letter in seq]
  1872. return positions == sorted(positions)
  1873. p, q = Counter(ps), Counter(qs)
  1874. self.assertTrue(correctly_ordered(+p))
  1875. self.assertTrue(correctly_ordered(-p))
  1876. self.assertTrue(correctly_ordered(p + q))
  1877. self.assertTrue(correctly_ordered(p - q))
  1878. self.assertTrue(correctly_ordered(p | q))
  1879. self.assertTrue(correctly_ordered(p & q))
  1880. p, q = Counter(ps), Counter(qs)
  1881. p += q
  1882. self.assertTrue(correctly_ordered(p))
  1883. p, q = Counter(ps), Counter(qs)
  1884. p -= q
  1885. self.assertTrue(correctly_ordered(p))
  1886. p, q = Counter(ps), Counter(qs)
  1887. p |= q
  1888. self.assertTrue(correctly_ordered(p))
  1889. p, q = Counter(ps), Counter(qs)
  1890. p &= q
  1891. self.assertTrue(correctly_ordered(p))
  1892. p, q = Counter(ps), Counter(qs)
  1893. p.update(q)
  1894. self.assertTrue(correctly_ordered(p))
  1895. p, q = Counter(ps), Counter(qs)
  1896. p.subtract(q)
  1897. self.assertTrue(correctly_ordered(p))
  1898. def test_update(self):
  1899. c = Counter()
  1900. c.update(self=42)
  1901. self.assertEqual(list(c.items()), [('self', 42)])
  1902. c = Counter()
  1903. c.update(iterable=42)
  1904. self.assertEqual(list(c.items()), [('iterable', 42)])
  1905. c = Counter()
  1906. c.update(iterable=None)
  1907. self.assertEqual(list(c.items()), [('iterable', None)])
  1908. self.assertRaises(TypeError, Counter().update, 42)
  1909. self.assertRaises(TypeError, Counter().update, {}, {})
  1910. self.assertRaises(TypeError, Counter.update)
  1911. def test_copying(self):
  1912. # Check that counters are copyable, deepcopyable, picklable, and
  1913. #have a repr/eval round-trip
  1914. words = Counter('which witch had which witches wrist watch'.split())
  1915. def check(dup):
  1916. msg = "\ncopy: %s\nwords: %s" % (dup, words)
  1917. self.assertIsNot(dup, words, msg)
  1918. self.assertEqual(dup, words)
  1919. check(words.copy())
  1920. check(copy.copy(words))
  1921. check(copy.deepcopy(words))
  1922. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  1923. with self.subTest(proto=proto):
  1924. check(pickle.loads(pickle.dumps(words, proto)))
  1925. check(eval(repr(words)))
  1926. update_test = Counter()
  1927. update_test.update(words)
  1928. check(update_test)
  1929. check(Counter(words))
  1930. def test_copy_subclass(self):
  1931. class MyCounter(Counter):
  1932. pass
  1933. c = MyCounter('slartibartfast')
  1934. d = c.copy()
  1935. self.assertEqual(d, c)
  1936. self.assertEqual(len(d), len(c))
  1937. self.assertEqual(type(d), type(c))
  1938. def test_conversions(self):
  1939. # Convert to: set, list, dict
  1940. s = 'she sells sea shells by the sea shore'
  1941. self.assertEqual(sorted(Counter(s).elements()), sorted(s))
  1942. self.assertEqual(sorted(Counter(s)), sorted(set(s)))
  1943. self.assertEqual(dict(Counter(s)), dict(Counter(s).items()))
  1944. self.assertEqual(set(Counter(s)), set(s))
  1945. def test_invariant_for_the_in_operator(self):
  1946. c = Counter(a=10, b=-2, c=0)
  1947. for elem in c:
  1948. self.assertTrue(elem in c)
  1949. self.assertIn(elem, c)
  1950. def test_multiset_operations(self):
  1951. # Verify that adding a zero counter will strip zeros and negatives
  1952. c = Counter(a=10, b=-2, c=0) + Counter()
  1953. self.assertEqual(dict(c), dict(a=10))
  1954. elements = 'abcd'
  1955. for i in range(1000):
  1956. # test random pairs of multisets
  1957. p = Counter(dict((elem, randrange(-2,4)) for elem in elements))
  1958. p.update(e=1, f=-1, g=0)
  1959. q = Counter(dict((elem, randrange(-2,4)) for elem in elements))
  1960. q.update(h=1, i=-1, j=0)
  1961. for counterop, numberop in [
  1962. (Counter.__add__, lambda x, y: max(0, x+y)),
  1963. (Counter.__sub__, lambda x, y: max(0, x-y)),
  1964. (Counter.__or__, lambda x, y: max(0,x,y)),
  1965. (Counter.__and__, lambda x, y: max(0, min(x,y))),
  1966. ]:
  1967. result = counterop(p, q)
  1968. for x in elements:
  1969. self.assertEqual(numberop(p[x], q[x]), result[x],
  1970. (counterop, x, p, q))
  1971. # verify that results exclude non-positive counts
  1972. self.assertTrue(x>0 for x in result.values())
  1973. elements = 'abcdef'
  1974. for i in range(100):
  1975. # verify that random multisets with no repeats are exactly like sets
  1976. p = Counter(dict((elem, randrange(0, 2)) for elem in elements))
  1977. q = Counter(dict((elem, randrange(0, 2)) for elem in elements))
  1978. for counterop, setop in [
  1979. (Counter.__sub__, set.__sub__),
  1980. (Counter.__or__, set.__or__),
  1981. (Counter.__and__, set.__and__),
  1982. ]:
  1983. counter_result = counterop(p, q)
  1984. set_result = setop(set(p.elements()), set(q.elements()))
  1985. self.assertEqual(counter_result, dict.fromkeys(set_result, 1))
  1986. def test_inplace_operations(self):
  1987. elements = 'abcd'
  1988. for i in range(1000):
  1989. # test random pairs of multisets
  1990. p = Counter(dict((elem, randrange(-2,4)) for elem in elements))
  1991. p.update(e=1, f=-1, g=0)
  1992. q = Counter(dict((elem, randrange(-2,4)) for elem in elements))
  1993. q.update(h=1, i=-1, j=0)
  1994. for inplace_op, regular_op in [
  1995. (Counter.__iadd__, Counter.__add__),
  1996. (Counter.__isub__, Counter.__sub__),
  1997. (Counter.__ior__, Counter.__or__),
  1998. (Counter.__iand__, Counter.__and__),
  1999. ]:
  2000. c = p.copy()
  2001. c_id = id(c)
  2002. regular_result = regular_op(c, q)
  2003. inplace_result = inplace_op(c, q)
  2004. self.assertEqual(inplace_result, regular_result)
  2005. self.assertEqual(id(inplace_result), c_id)
  2006. def test_subtract(self):
  2007. c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
  2008. c.subtract(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50)
  2009. self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50))
  2010. c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
  2011. c.subtract(Counter(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50))
  2012. self.assertEqual(c, Counter(a=-6, b=-2, c=8, d=0, e=-5, f=-30, g=40, h=50))
  2013. c = Counter('aaabbcd')
  2014. c.subtract('aaaabbcce')
  2015. self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1))
  2016. c = Counter()
  2017. c.subtract(self=42)
  2018. self.assertEqual(list(c.items()), [('self', -42)])
  2019. c = Counter()
  2020. c.subtract(iterable=42)
  2021. self.assertEqual(list(c.items()), [('iterable', -42)])
  2022. self.assertRaises(TypeError, Counter().subtract, 42)
  2023. self.assertRaises(TypeError, Counter().subtract, {}, {})
  2024. self.assertRaises(TypeError, Counter.subtract)
  2025. def test_unary(self):
  2026. c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
  2027. self.assertEqual(dict(+c), dict(c=5, d=10, e=15, g=40))
  2028. self.assertEqual(dict(-c), dict(a=5))
  2029. def test_repr_nonsortable(self):
  2030. c = Counter(a=2, b=None)
  2031. r = repr(c)
  2032. self.assertIn("'a': 2", r)
  2033. self.assertIn("'b': None", r)
  2034. def test_helper_function(self):
  2035. # two paths, one for real dicts and one for other mappings
  2036. elems = list('abracadabra')
  2037. d = dict()
  2038. _count_elements(d, elems)
  2039. self.assertEqual(d, {'a': 5, 'r': 2, 'b': 2, 'c': 1, 'd': 1})
  2040. m = OrderedDict()
  2041. _count_elements(m, elems)
  2042. self.assertEqual(m,
  2043. OrderedDict([('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]))
  2044. # test fidelity to the pure python version
  2045. c = CounterSubclassWithSetItem('abracadabra')
  2046. self.assertTrue(c.called)
  2047. self.assertEqual(dict(c), {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r':2 })
  2048. c = CounterSubclassWithGet('abracadabra')
  2049. self.assertTrue(c.called)
  2050. self.assertEqual(dict(c), {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r':2 })
  2051. def test_multiset_operations_equivalent_to_set_operations(self):
  2052. # When the multiplicities are all zero or one, multiset operations
  2053. # are guaranteed to be equivalent to the corresponding operations
  2054. # for regular sets.
  2055. s = list(product(('a', 'b', 'c'), range(2)))
  2056. powerset = chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
  2057. counters = [Counter(dict(groups)) for groups in powerset]
  2058. for cp, cq in product(counters, repeat=2):
  2059. sp = set(cp.elements())
  2060. sq = set(cq.elements())
  2061. self.assertEqual(set(cp + cq), sp | sq)
  2062. self.assertEqual(set(cp - cq), sp - sq)
  2063. self.assertEqual(set(cp | cq), sp | sq)
  2064. self.assertEqual(set(cp & cq), sp & sq)
  2065. self.assertEqual(cp == cq, sp == sq)
  2066. self.assertEqual(cp != cq, sp != sq)
  2067. self.assertEqual(cp <= cq, sp <= sq)
  2068. self.assertEqual(cp >= cq, sp >= sq)
  2069. self.assertEqual(cp < cq, sp < sq)
  2070. self.assertEqual(cp > cq, sp > sq)
  2071. def test_eq(self):
  2072. self.assertEqual(Counter(a=3, b=2, c=0), Counter('ababa'))
  2073. self.assertNotEqual(Counter(a=3, b=2), Counter('babab'))
  2074. def test_le(self):
  2075. self.assertTrue(Counter(a=3, b=2, c=0) <= Counter('ababa'))
  2076. self.assertFalse(Counter(a=3, b=2) <= Counter('babab'))
  2077. def test_lt(self):
  2078. self.assertTrue(Counter(a=3, b=1, c=0) < Counter('ababa'))
  2079. self.assertFalse(Counter(a=3, b=2, c=0) < Counter('ababa'))
  2080. def test_ge(self):
  2081. self.assertTrue(Counter(a=2, b=1, c=0) >= Counter('aab'))
  2082. self.assertFalse(Counter(a=3, b=2, c=0) >= Counter('aabd'))
  2083. def test_gt(self):
  2084. self.assertTrue(Counter(a=3, b=2, c=0) > Counter('aab'))
  2085. self.assertFalse(Counter(a=2, b=1, c=0) > Counter('aab'))
  2086. def load_tests(loader, tests, pattern):
  2087. tests.addTest(doctest.DocTestSuite(collections))
  2088. return tests
  2089. if __name__ == "__main__":
  2090. unittest.main()