70_collections.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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. d = deque([1, 2, BadCompare(), 3])
  95. try:
  96. d.count(2)
  97. printFailed("deque.count", 2)
  98. exit(1)
  99. except ArithmeticError:
  100. pass
  101. d = deque([1, 2, 3])
  102. try:
  103. d.count(BadCompare())
  104. printFailed("deque.count", "BadCompare()")
  105. exit(1)
  106. except ArithmeticError:
  107. pass
  108. # class MutatingCompare:
  109. # def __eq__(self, other):
  110. # d.pop()
  111. # return True
  112. # m = MutatingCompare()
  113. # d = deque([1, 2, 3, m, 4, 5])
  114. # m.d = d
  115. # try:
  116. # d.count(3)
  117. # printFailed("deque.count", "MutatingCompare()")
  118. # exit(1)
  119. # except RuntimeError:
  120. # pass
  121. #### TEST comparisons == #####
  122. d = deque('xabc')
  123. d.popleft()
  124. for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
  125. assertEqual(d == e, type(d) == type(e) and list(d) == list(e))
  126. assertEqual(d != e, not (type(d) == type(e) and list(d) == list(e)))
  127. def get_args():
  128. args = map(deque, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
  129. return args
  130. for x in get_args():
  131. for y in get_args():
  132. assertEqual(x == y, list(x) == list(y))
  133. assertEqual(x != y, list(x) != list(y))
  134. # assertEqual(x < y, list(x) < list(y)) # not currently supported
  135. # assertEqual(x <= y, list(x) <= list(y)) # not currently supported
  136. # assertEqual(x > y, list(x) > list(y)) # not currently supported
  137. # assertEqual(x >= y, list(x) >= list(y)) # not currently supported
  138. ############### TEST contains()#################
  139. n = 200
  140. d = deque(range(n))
  141. for i in range(n):
  142. assertEqual(i in d, True)
  143. assertEqual((n+1) not in d, True)
  144. # class MutateCmp:
  145. # def __init__(self, deque, result):
  146. # self.deque = deque
  147. # self.result = result
  148. # def __eq__(self, other):
  149. # self.deque.clear()
  150. # return self.result
  151. # # # Test detection of mutation during iteration
  152. # d = deque(range(n))
  153. # d[n//2] = MutateCmp(d, False)
  154. # try:
  155. # n in d
  156. # printFailed("deque.__contains__", n)
  157. # exit(1)
  158. # except RuntimeError:
  159. # pass
  160. class BadCmp:
  161. def __eq__(self, other):
  162. raise RuntimeError
  163. # # Test detection of comparison exceptions
  164. d = deque(range(n))
  165. d.append(BadCmp())
  166. try:
  167. n in d
  168. printFailed("deque.__contains__", n)
  169. exit(1)
  170. except RuntimeError:
  171. pass
  172. ######## TEST extend()################
  173. d = deque('a')
  174. try:
  175. d.extend(1)
  176. printFailed("deque.extend", 1)
  177. exit(1)
  178. except TypeError:
  179. pass
  180. d.extend('bcd')
  181. assertEqual(list(d), list('abcd'))
  182. d.extend(d.copy())
  183. assertEqual(list(d), list('abcdabcd'))
  184. ###### TEST extend_left() ################
  185. d = deque('a')
  186. try:
  187. d.extendleft(1)
  188. printFailed("deque.extendleft", 1)
  189. exit(1)
  190. except TypeError:
  191. pass
  192. d.extendleft('bcd')
  193. assertEqual(list(d), list(reversed('abcd')))
  194. d.extendleft(d.copy())
  195. assertEqual(list(d), list('abcddcba'))
  196. d = deque()
  197. d.extendleft(range(1000))
  198. assertEqual(list(d), list(reversed(range(1000))))
  199. try:
  200. d.extendleft(fail())
  201. printFailed("deque.extendleft", fail())
  202. exit(1)
  203. except SyntaxError:
  204. pass
  205. ############ test rotate#############
  206. s = tuple('abcde')
  207. n = len(s)
  208. d = deque(s)
  209. d.rotate(1) # verify rot(1)
  210. assertEqual(''.join(d), 'eabcd')
  211. d = deque(s)
  212. d.rotate(-1) # verify rot(-1)
  213. assertEqual(''.join(d), 'bcdea')
  214. d.rotate() # check default to 1
  215. assertEqual(tuple(d), s)
  216. for i in range(n*3):
  217. d = deque(s)
  218. e = deque(d)
  219. # print(i, d, e)
  220. d.rotate(i) # check vs. rot(1) n times
  221. for j in range(i):
  222. e.rotate(1)
  223. assertEqual(tuple(d), tuple(e))
  224. d.rotate(-i) # check that it works in reverse
  225. assertEqual(tuple(d), s)
  226. e.rotate(n-i) # check that it wraps forward
  227. assertEqual(tuple(e), s)
  228. for i in range(n*3):
  229. d = deque(s)
  230. e = deque(d)
  231. d.rotate(-i)
  232. for j in range(i):
  233. e.rotate(-1) # check vs. rot(-1) n times
  234. assertEqual(tuple(d), tuple(e))
  235. d.rotate(i) # check that it works in reverse
  236. assertEqual(tuple(d), s)
  237. e.rotate(i-n) # check that it wraps backaround
  238. assertEqual(tuple(e), s)
  239. d = deque(s)
  240. e = deque(s)
  241. e.rotate(BIG+17) # verify on long series of rotates
  242. dr = d.rotate
  243. for i in range(BIG+17):
  244. dr()
  245. assertEqual(tuple(d), tuple(e))
  246. try:
  247. d.rotate(1, 2)
  248. printFailed("deque.rotate", 1, 2)
  249. exit(1)
  250. except TypeError:
  251. pass
  252. try:
  253. d.rotate(1, 10)
  254. printFailed("deque.rotate", 1, 10)
  255. exit(1)
  256. except TypeError:
  257. pass
  258. d = deque()
  259. d.rotate() # rotate an empty deque
  260. assertEqual(d, deque())
  261. ########## test len#############
  262. d = deque('ab')
  263. assertEqual(len(d), 2)
  264. d.popleft()
  265. assertEqual(len(d), 1)
  266. d.pop()
  267. assertEqual(len(d), 0)
  268. try:
  269. d.pop()
  270. printFailed("deque.pop")
  271. exit(1)
  272. except IndexError:
  273. pass
  274. assertEqual(len(d), 0)
  275. d.append('c')
  276. assertEqual(len(d), 1)
  277. d.appendleft('d')
  278. assertEqual(len(d), 2)
  279. d.clear()
  280. assertEqual(len(d), 0)
  281. ############## test underflow#############
  282. d = deque()
  283. try:
  284. d.pop()
  285. printFailed("deque.pop")
  286. exit(1)
  287. except IndexError:
  288. pass
  289. try:
  290. d.popleft()
  291. printFailed("deque.popleft")
  292. exit(1)
  293. except IndexError:
  294. pass
  295. ############## test clear#############
  296. d = deque(range(100))
  297. assertEqual(len(d), 100)
  298. d.clear()
  299. assertEqual(len(d), 0)
  300. assertEqual(list(d), [])
  301. d.clear() # clear an empty deque
  302. assertEqual(list(d), [])
  303. # Handle comparison errors
  304. d = deque(['a', 'b', BadCmp(), 'c'])
  305. e = deque(d)
  306. for x, y in zip(d, e):
  307. # verify that original order and values are retained.
  308. assertEqual(x is y, True)
  309. ########### test repr#############
  310. d = deque(range(200))
  311. e = eval(repr(d))
  312. assertEqual(list(d), list(e))
  313. d.append(None)
  314. assertEqual(repr(d)[-19:], '7, 198, 199, None])')
  315. ######### test init #############
  316. try:
  317. deque('abc', 2, 3)
  318. printFailed("deque", 'abc', 2, 3)
  319. exit(1)
  320. except TypeError:
  321. pass
  322. try:
  323. deque(1)
  324. printFailed("deque", 1)
  325. exit(1)
  326. except TypeError:
  327. pass
  328. ######### test hash #############
  329. try:
  330. hash(deque('abcd'))
  331. except TypeError:
  332. pass
  333. ###### test long steady state queue pop left ########
  334. for size in (0, 1, 2, 100, 1000):
  335. d = deque(range(size))
  336. append, pop = d.append, d.popleft
  337. for i in range(size, BIG):
  338. append(i)
  339. x = pop()
  340. if x != i - size:
  341. assertEqual(x, i-size)
  342. assertEqual(list(d), list(range(BIG-size, BIG)))
  343. ######## test long steady state queue pop right ########
  344. for size in (0, 1, 2, 100, 1000):
  345. d = deque(reversed(range(size)))
  346. append, pop = d.appendleft, d.pop
  347. for i in range(size, BIG):
  348. append(i)
  349. x = pop()
  350. if x != i - size:
  351. assertEqual(x, i-size)
  352. assertEqual(list(reversed(list(d))),
  353. list(range(BIG-size, BIG)))
  354. ###### test big queue popleft ########
  355. d = deque()
  356. append, pop = d.append, d.popleft
  357. for i in range(BIG):
  358. append(i)
  359. for i in range(BIG):
  360. x = pop()
  361. if x != i:
  362. assertEqual(x, i)
  363. ###### test big queue pop right ########
  364. d = deque()
  365. append, pop = d.appendleft, d.pop
  366. for i in range(BIG):
  367. append(i)
  368. for i in range(BIG):
  369. x = pop()
  370. if x != i:
  371. assertEqual(x, i)
  372. ####### test big stack right########
  373. d = deque()
  374. append, pop = d.append, d.pop
  375. for i in range(BIG):
  376. append(i)
  377. for i in reversed(range(BIG)):
  378. x = pop()
  379. if x != i:
  380. assertEqual(x, i)
  381. assertEqual(len(d), 0)
  382. ##### test big stack left ########
  383. d = deque()
  384. append, pop = d.appendleft, d.popleft
  385. for i in range(BIG):
  386. append(i)
  387. for i in reversed(range(BIG)):
  388. x = pop()
  389. if x != i:
  390. assertEqual(x, i)
  391. assertEqual(len(d), 0)
  392. ##### test roundtrip iter init ########
  393. d = deque(range(200))
  394. e = deque(d)
  395. assertNotEqual(id(d), id(e))
  396. assertEqual(list(d), list(e))
  397. ########## test pickle #############
  398. d = deque(range(200))
  399. for _ in range(5 + 1):
  400. s = pickle.dumps(d)
  401. e = pickle.loads(s)
  402. assertNotEqual(id(e), id(d))
  403. assertEqual(list(e), list(d))
  404. ### test copy ########
  405. mut = [10]
  406. d = deque([mut])
  407. e = d.copy()
  408. assertEqual(list(d), list(e))
  409. mut[0] = 11
  410. assertNotEqual(id(d), id(e))
  411. assertEqual(list(d), list(e))
  412. ### test reversed#$####
  413. for s in ('abcd', range(2000)):
  414. assertEqual(list(reversed(deque(s))), list(reversed(s)))
  415. d = deque()
  416. for i in range(100):
  417. d.append(1)
  418. gc.collect()