1
0

720_collections.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. from collections import Counter, deque, defaultdict
  2. import random
  3. import pickle
  4. import gc
  5. # test defaultdict
  6. assert issubclass(defaultdict, dict)
  7. a = defaultdict(int)
  8. a['1'] += 1
  9. assert a == {'1': 1}
  10. a = defaultdict(list)
  11. a['1'].append(1)
  12. assert a == {'1': [1]}
  13. q = deque()
  14. q.append(1)
  15. q.append(2)
  16. q.appendleft(3)
  17. q.append(4)
  18. assert len(q) == 4
  19. assert q == deque([3, 1, 2, 4])
  20. assert q.popleft() == 3
  21. assert q.pop() == 4
  22. assert len(q) == 2
  23. assert q == deque([1, 2])
  24. # ADDING TESTS FROM CPYTHON's test_deque.py file
  25. ############ TEST basics###############
  26. def assertEqual(a, b):
  27. if a == b:
  28. return
  29. print(a)
  30. print(b)
  31. raise AssertionError
  32. def assertNotEqual(a, b):
  33. if a != b:
  34. return
  35. print(a)
  36. print(b)
  37. raise AssertionError
  38. def printFailed(function_name, *args, **kwargs):
  39. print("X Failed Tests for {} for args: {} {}".format(str(function_name), str(args), str(kwargs)))
  40. BIG = 10000
  41. def fail():
  42. raise SyntaxError
  43. yield 1
  44. d = deque()
  45. assertEqual(len(d), 0)
  46. assertEqual(list(d), [])
  47. d = deque(range(6))
  48. assertEqual(list(d), list(range(6)))
  49. d = deque(range(7)) # [0, 1, 2, 3, 4, 5, 6]
  50. # print(d._data, d._head, d._tail, d._capacity)
  51. assertEqual(list(d), list(range(7)))
  52. d = deque(range(8))
  53. assertEqual(list(d), list(range(8)))
  54. d = deque(range(9))
  55. assertEqual(list(d), list(range(9)))
  56. d = deque(range(200))
  57. for i in range(200, 400):
  58. d.append(i)
  59. assertEqual(len(d), 400)
  60. assertEqual(list(d), list(range(400)))
  61. for i in reversed(range(-200, 0)):
  62. d.appendleft(i)
  63. assertEqual(len(d), 600)
  64. assertEqual(list(d), list(range(-200, 400)))
  65. left = [d.popleft() for i in range(250)]
  66. assertEqual(left, list(range(-200, 50)))
  67. assertEqual(list(d), list(range(50, 400)))
  68. right = [d.pop() for i in range(250)]
  69. right.reverse()
  70. assertEqual(right, list(range(150, 400)))
  71. assertEqual(list(d), list(range(50, 150)))
  72. ######### TEST count()#################
  73. for s in ('', 'abracadabra', 'simsalabim'*500+'abc'):
  74. s = list(s)
  75. d = deque(s)
  76. for letter in 'abcdefghijklmnopqrstuvwxyz':
  77. assertEqual(s.count(letter), d.count(letter))
  78. try:
  79. d.count()
  80. printFailed("deque.count")
  81. exit(1)
  82. except TypeError:
  83. pass
  84. try:
  85. d.count(1, 2)
  86. printFailed("deque.count", 1, 2)
  87. exit(1)
  88. except TypeError:
  89. pass
  90. class ArithmeticError(Exception): pass
  91. class BadCompare:
  92. def __eq__(self, other):
  93. raise ArithmeticError
  94. def __ne__(self, other):
  95. raise ArithmeticError
  96. d = deque([1, 2, BadCompare(), 3])
  97. try:
  98. d.count(2)
  99. printFailed("deque.count", 2)
  100. exit(1)
  101. except ArithmeticError:
  102. pass
  103. d = deque([1, 2, 3])
  104. try:
  105. d.count(BadCompare())
  106. printFailed("deque.count", "BadCompare()")
  107. exit(1)
  108. except ArithmeticError:
  109. pass
  110. # class MutatingCompare:
  111. # def __eq__(self, other):
  112. # d.pop()
  113. # return True
  114. # m = MutatingCompare()
  115. # d = deque([1, 2, 3, m, 4, 5])
  116. # m.d = d
  117. # try:
  118. # d.count(3)
  119. # printFailed("deque.count", "MutatingCompare()")
  120. # exit(1)
  121. # except RuntimeError:
  122. # pass
  123. #### TEST comparisons == #####
  124. d = deque('xabc')
  125. d.popleft()
  126. for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
  127. assertEqual(d == e, type(d) == type(e) and list(d) == list(e))
  128. assertEqual(d != e, not (type(d) == type(e) and list(d) == list(e)))
  129. def get_args():
  130. args = map(deque, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
  131. return args
  132. for x in get_args():
  133. for y in get_args():
  134. assertEqual(x == y, list(x) == list(y))
  135. assertEqual(x != y, list(x) != list(y))
  136. # assertEqual(x < y, list(x) < list(y)) # not currently supported
  137. # assertEqual(x <= y, list(x) <= list(y)) # not currently supported
  138. # assertEqual(x > y, list(x) > list(y)) # not currently supported
  139. # assertEqual(x >= y, list(x) >= list(y)) # not currently supported
  140. ############### TEST contains()#################
  141. n = 200
  142. d = deque(range(n))
  143. for i in range(n):
  144. assertEqual(i in d, True)
  145. assertEqual((n+1) not in d, True)
  146. # class MutateCmp:
  147. # def __init__(self, deque, result):
  148. # self.deque = deque
  149. # self.result = result
  150. # def __eq__(self, other):
  151. # self.deque.clear()
  152. # return self.result
  153. # # # Test detection of mutation during iteration
  154. # d = deque(range(n))
  155. # d[n//2] = MutateCmp(d, False)
  156. # try:
  157. # n in d
  158. # printFailed("deque.__contains__", n)
  159. # exit(1)
  160. # except RuntimeError:
  161. # pass
  162. class BadCmp:
  163. def __eq__(self, other):
  164. raise RuntimeError
  165. def __ne__(self, other):
  166. raise RuntimeError
  167. # # Test detection of comparison exceptions
  168. d = deque(range(n))
  169. d.append(BadCmp())
  170. try:
  171. n in d
  172. printFailed("deque.__contains__", n)
  173. exit(1)
  174. except RuntimeError:
  175. pass
  176. ######## TEST extend()################
  177. d = deque('a')
  178. try:
  179. d.extend(1)
  180. printFailed("deque.extend", 1)
  181. exit(1)
  182. except TypeError:
  183. pass
  184. d.extend('bcd')
  185. assertEqual(list(d), list('abcd'))
  186. d.extend(d.copy())
  187. assertEqual(list(d), list('abcdabcd'))
  188. ###### TEST extend_left() ################
  189. d = deque('a')
  190. try:
  191. d.extendleft(1)
  192. printFailed("deque.extendleft", 1)
  193. exit(1)
  194. except TypeError:
  195. pass
  196. d.extendleft('bcd')
  197. assertEqual(list(d), list(reversed('abcd')))
  198. d.extendleft(d.copy())
  199. assertEqual(list(d), list('abcddcba'))
  200. d = deque()
  201. d.extendleft(range(1000))
  202. assertEqual(list(d), list(reversed(range(1000))))
  203. try:
  204. d.extendleft(fail())
  205. printFailed("deque.extendleft", fail())
  206. exit(1)
  207. except SyntaxError:
  208. pass
  209. ############ test rotate#############
  210. s = tuple('abcde')
  211. n = len(s)
  212. d = deque(s)
  213. d.rotate(1) # verify rot(1)
  214. assertEqual(''.join(d), 'eabcd')
  215. d = deque(s)
  216. d.rotate(-1) # verify rot(-1)
  217. assertEqual(''.join(d), 'bcdea')
  218. d.rotate() # check default to 1
  219. assertEqual(tuple(d), s)
  220. for i in range(n*3):
  221. d = deque(s)
  222. e = deque(d)
  223. # print(i, d, e)
  224. d.rotate(i) # check vs. rot(1) n times
  225. for j in range(i):
  226. e.rotate(1)
  227. assertEqual(tuple(d), tuple(e))
  228. d.rotate(-i) # check that it works in reverse
  229. assertEqual(tuple(d), s)
  230. e.rotate(n-i) # check that it wraps forward
  231. assertEqual(tuple(e), s)
  232. for i in range(n*3):
  233. d = deque(s)
  234. e = deque(d)
  235. d.rotate(-i)
  236. for j in range(i):
  237. e.rotate(-1) # check vs. rot(-1) n times
  238. assertEqual(tuple(d), tuple(e))
  239. d.rotate(i) # check that it works in reverse
  240. assertEqual(tuple(d), s)
  241. e.rotate(i-n) # check that it wraps backaround
  242. assertEqual(tuple(e), s)
  243. d = deque(s)
  244. e = deque(s)
  245. e.rotate(BIG+17) # verify on long series of rotates
  246. dr = d.rotate
  247. for i in range(BIG+17):
  248. dr()
  249. assertEqual(tuple(d), tuple(e))
  250. try:
  251. d.rotate(1, 2)
  252. printFailed("deque.rotate", 1, 2)
  253. exit(1)
  254. except TypeError:
  255. pass
  256. try:
  257. d.rotate(1, 10)
  258. printFailed("deque.rotate", 1, 10)
  259. exit(1)
  260. except TypeError:
  261. pass
  262. d = deque()
  263. d.rotate() # rotate an empty deque
  264. assertEqual(d, deque())
  265. ########## test len#############
  266. d = deque('ab')
  267. assertEqual(len(d), 2)
  268. d.popleft()
  269. assertEqual(len(d), 1)
  270. d.pop()
  271. assertEqual(len(d), 0)
  272. try:
  273. d.pop()
  274. printFailed("deque.pop")
  275. exit(1)
  276. except IndexError:
  277. pass
  278. assertEqual(len(d), 0)
  279. d.append('c')
  280. assertEqual(len(d), 1)
  281. d.appendleft('d')
  282. assertEqual(len(d), 2)
  283. d.clear()
  284. assertEqual(len(d), 0)
  285. ############## test underflow#############
  286. d = deque()
  287. try:
  288. d.pop()
  289. printFailed("deque.pop")
  290. exit(1)
  291. except IndexError:
  292. pass
  293. try:
  294. d.popleft()
  295. printFailed("deque.popleft")
  296. exit(1)
  297. except IndexError:
  298. pass
  299. ############## test clear#############
  300. d = deque(range(100))
  301. assertEqual(len(d), 100)
  302. d.clear()
  303. assertEqual(len(d), 0)
  304. assertEqual(list(d), [])
  305. d.clear() # clear an empty deque
  306. assertEqual(list(d), [])
  307. # Handle comparison errors
  308. d = deque(['a', 'b', BadCmp(), 'c'])
  309. e = deque(d)
  310. for x, y in zip(d, e):
  311. # verify that original order and values are retained.
  312. assertEqual(x is y, True)
  313. # https://github.com/pocketpy/pocketpy/issues/447
  314. names = ["Alice", "Bob", "Charlie"]
  315. ages = [25, 30, 35]
  316. cities = ["NY", "LA", "SF"]
  317. result = []
  318. for name, age, city in zip(names, ages, cities):
  319. result.append((name, age, city))
  320. assertEqual(result, [("Alice", 25, "NY"), ("Bob", 30, "LA"), ("Charlie", 35, "SF")])
  321. cities.pop()
  322. result = []
  323. for name, age, city in zip(names, ages, cities):
  324. result.append((name, age, city))
  325. assertEqual(result, [("Alice", 25, "NY"), ("Bob", 30, "LA")])
  326. ########### test repr#############
  327. d = deque(range(200))
  328. e = eval(repr(d))
  329. assertEqual(list(d), list(e))
  330. d.append(None)
  331. assertEqual(repr(d)[-19:], '7, 198, 199, None])')
  332. ######### test init #############
  333. try:
  334. deque('abc', 2, 3)
  335. printFailed("deque", 'abc', 2, 3)
  336. exit(1)
  337. except TypeError:
  338. pass
  339. try:
  340. deque(1)
  341. printFailed("deque", 1)
  342. exit(1)
  343. except TypeError:
  344. pass
  345. ######### test hash #############
  346. try:
  347. hash(deque('abcd'))
  348. except TypeError:
  349. pass
  350. ###### test long steady state queue pop left ########
  351. for size in (0, 1, 2, 100, 1000):
  352. d = deque(range(size))
  353. append, pop = d.append, d.popleft
  354. for i in range(size, BIG):
  355. append(i)
  356. x = pop()
  357. if x != i - size:
  358. assertEqual(x, i-size)
  359. assertEqual(list(d), list(range(BIG-size, BIG)))
  360. ######## test long steady state queue pop right ########
  361. for size in (0, 1, 2, 100, 1000):
  362. d = deque(reversed(range(size)))
  363. append, pop = d.appendleft, d.pop
  364. for i in range(size, BIG):
  365. append(i)
  366. x = pop()
  367. if x != i - size:
  368. assertEqual(x, i-size)
  369. assertEqual(list(reversed(list(d))),
  370. list(range(BIG-size, BIG)))
  371. ###### test big queue popleft ########
  372. d = deque()
  373. append, pop = d.append, d.popleft
  374. for i in range(BIG):
  375. append(i)
  376. for i in range(BIG):
  377. x = pop()
  378. if x != i:
  379. assertEqual(x, i)
  380. ###### test big queue pop right ########
  381. d = deque()
  382. append, pop = d.appendleft, d.pop
  383. for i in range(BIG):
  384. append(i)
  385. for i in range(BIG):
  386. x = pop()
  387. if x != i:
  388. assertEqual(x, i)
  389. ####### test big stack right########
  390. d = deque()
  391. append, pop = d.append, d.pop
  392. for i in range(BIG):
  393. append(i)
  394. for i in reversed(range(BIG)):
  395. x = pop()
  396. if x != i:
  397. assertEqual(x, i)
  398. assertEqual(len(d), 0)
  399. ##### test big stack left ########
  400. d = deque()
  401. append, pop = d.appendleft, d.popleft
  402. for i in range(BIG):
  403. append(i)
  404. for i in reversed(range(BIG)):
  405. x = pop()
  406. if x != i:
  407. assertEqual(x, i)
  408. assertEqual(len(d), 0)
  409. ##### test roundtrip iter init ########
  410. d = deque(range(200))
  411. e = deque(d)
  412. assertNotEqual(id(d), id(e))
  413. assertEqual(list(d), list(e))
  414. ########## test pickle #############
  415. # d = deque(range(200))
  416. # for _ in range(5 + 1):
  417. # s = pickle.dumps(d)
  418. # e = pickle.loads(s)
  419. # assertNotEqual(id(e), id(d))
  420. # assertEqual(list(e), list(d))
  421. ### test copy ########
  422. mut = [10]
  423. d = deque([mut])
  424. e = d.copy()
  425. assertEqual(list(d), list(e))
  426. mut[0] = 11
  427. assertNotEqual(id(d), id(e))
  428. assertEqual(list(d), list(e))
  429. ### test reversed#$####
  430. for s in ('abcd', range(2000)):
  431. assertEqual(list(reversed(deque(s))), list(reversed(s)))
  432. d = deque()
  433. for i in range(100):
  434. d.append(1)
  435. gc.collect()
  436. # test maxlen
  437. q = deque(maxlen=3)
  438. assertEqual(q.maxlen, 3)
  439. q.append(1)
  440. q.append(2)
  441. q.append(3)
  442. assertEqual(list(q), [1, 2, 3])
  443. assertEqual(q._data, [1, 2, 3, None])
  444. q.append(4)
  445. assertEqual(list(q), [2, 3, 4])
  446. assertEqual(q._data, [None, 2, 3, 4])
  447. q.appendleft(1)
  448. assertEqual(list(q), [1, 2, 3])
  449. assertEqual(q._data, [1, 2, 3, None])
  450. q.appendleft(0)
  451. assertEqual(list(q), [0, 1, 2])
  452. assertEqual(q._data, [1, 2, None, 0])
  453. q.pop()
  454. assertEqual(list(q), [0, 1])
  455. assertEqual(q._data, [1, None, None, 0])
  456. assertEqual(len(q), 2)
  457. assertEqual(q._capacity, 4)
  458. q.popleft()
  459. assertEqual(list(q), [1])
  460. assertEqual(q._data, [1, None, None, None])