70_collections.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  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. assert a == b
  28. def assertNotEqual(a, b):
  29. assert a != b
  30. def printFailed(function_name, *args, **kwargs):
  31. print("X Failed Tests for {} for args: {} {}".format(str(function_name), str(args), str(kwargs)))
  32. BIG = 100000
  33. def fail():
  34. raise SyntaxError
  35. yield 1
  36. d = deque(range(-5125, -5000))
  37. # d.__init__(range(200)) # not supported
  38. d = deque(range(200))
  39. for i in range(200, 400):
  40. d.append(i)
  41. for i in reversed(range(-200, 0)):
  42. d.appendleft(i)
  43. assertEqual(list(d), list(range(-200, 400)))
  44. assertEqual(len(d), 600)
  45. left = [d.popleft() for i in range(250)]
  46. assertEqual(left, list(range(-200, 50)))
  47. assertEqual(list(d), list(range(50, 400)))
  48. right = [d.pop() for i in range(250)]
  49. right.reverse()
  50. assertEqual(right, list(range(150, 400)))
  51. assertEqual(list(d), list(range(50, 150)))
  52. ####### TEST maxlen###############
  53. try:
  54. dq = deque()
  55. dq.maxlen = -1
  56. printFailed("deque.maxlen", -1)
  57. exit(1)
  58. except AttributeError:
  59. pass
  60. try:
  61. dq = deque()
  62. dq.maxlen = -2
  63. printFailed("deque.maxlen", -2)
  64. exit(1)
  65. except AttributeError:
  66. pass
  67. it = iter(range(10))
  68. d = deque(it, maxlen=3)
  69. assertEqual(list(it), [])
  70. assertEqual(repr(d), 'deque([7, 8, 9], maxlen=3)')
  71. assertEqual(list(d), [7, 8, 9])
  72. assertEqual(d, deque(range(10), 3))
  73. d.append(10)
  74. assertEqual(list(d), [8, 9, 10])
  75. d.appendleft(7)
  76. assertEqual(list(d), [7, 8, 9])
  77. d.extend([10, 11])
  78. assertEqual(list(d), [9, 10, 11])
  79. d.extendleft([8, 7])
  80. assertEqual(list(d), [7, 8, 9])
  81. d = deque(range(200), maxlen=10)
  82. d.append(d)
  83. assertEqual(repr(d)[-30:], ', 198, 199, [...]], maxlen=10)')
  84. d = deque(range(10), maxlen=None)
  85. assertEqual(repr(d), 'deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])')
  86. ####### TEST maxlen = 0###############
  87. it = iter(range(100))
  88. deque(it, maxlen=0)
  89. assertEqual(list(it), [])
  90. it = iter(range(100))
  91. d = deque(maxlen=0)
  92. d.extend(it)
  93. assertEqual(list(it), [])
  94. it = iter(range(100))
  95. d = deque(maxlen=0)
  96. d.extendleft(it)
  97. assertEqual(list(it), [])
  98. ####### TEST maxlen attribute #############
  99. assertEqual(deque().maxlen, None)
  100. assertEqual(deque('abc').maxlen, None)
  101. assertEqual(deque('abc', maxlen=4).maxlen, 4)
  102. assertEqual(deque('abc', maxlen=2).maxlen, 2)
  103. assertEqual(deque('abc', maxlen=0).maxlen, 0)
  104. try:
  105. d = deque('abc')
  106. d.maxlen = 10
  107. printFailed("deque.maxlen", 10)
  108. exit(1)
  109. except AttributeError:
  110. pass
  111. ######### TEST count()#################
  112. for s in ('', 'abracadabra', 'simsalabim'*500+'abc'):
  113. s = list(s)
  114. d = deque(s)
  115. for letter in 'abcdefghijklmnopqrstuvwxyz':
  116. assertEqual(s.count(letter), d.count(letter))
  117. try:
  118. d.count()
  119. printFailed("deque.count")
  120. exit(1)
  121. except TypeError:
  122. pass
  123. try:
  124. d.count(1, 2)
  125. printFailed("deque.count", 1, 2)
  126. exit(1)
  127. except TypeError:
  128. pass
  129. class ArithmeticError(Exception): pass
  130. class BadCompare:
  131. def __eq__(self, other):
  132. raise ArithmeticError
  133. d = deque([1, 2, BadCompare(), 3])
  134. try:
  135. d.count(2)
  136. printFailed("deque.count", 2)
  137. exit(1)
  138. except ArithmeticError:
  139. pass
  140. d = deque([1, 2, 3])
  141. try:
  142. d.count(BadCompare())
  143. printFailed("deque.count", "BadCompare()")
  144. exit(1)
  145. except ArithmeticError:
  146. pass
  147. class MutatingCompare:
  148. def __eq__(self, other):
  149. d.pop()
  150. return True
  151. m = MutatingCompare()
  152. d = deque([1, 2, 3, m, 4, 5])
  153. m.d = d
  154. try:
  155. d.count(3)
  156. printFailed("deque.count", "MutatingCompare()")
  157. exit(1)
  158. except RuntimeError:
  159. pass
  160. d = deque([None]*16)
  161. for i in range(len(d)):
  162. d.rotate(-1)
  163. d.rotate(1)
  164. assertEqual(d.count(1), 0)
  165. assertEqual(d.count(None), 16)
  166. #### TEST comparisons == #####
  167. d = deque('xabc')
  168. d.popleft()
  169. for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
  170. assertEqual(d == e, type(d) == type(e) and list(d) == list(e))
  171. assertEqual(d != e, not (type(d) == type(e) and list(d) == list(e)))
  172. def get_args():
  173. args = map(deque, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
  174. return args
  175. for x in get_args():
  176. for y in get_args():
  177. assertEqual(x == y, list(x) == list(y))
  178. assertEqual(x != y, list(x) != list(y))
  179. # assertEqual(x < y, list(x) < list(y)) # not currently supported
  180. # assertEqual(x <= y, list(x) <= list(y)) # not currently supported
  181. # assertEqual(x > y, list(x) > list(y)) # not currently supported
  182. # assertEqual(x >= y, list(x) >= list(y)) # not currently supported
  183. ############### TEST contains()#################
  184. n = 200
  185. d = deque(range(n))
  186. for i in range(n):
  187. assertEqual(i in d, True)
  188. assertEqual((n+1) not in d, True)
  189. class MutateCmp:
  190. def __init__(self, deque, result):
  191. self.deque = deque
  192. self.result = result
  193. def __eq__(self, other):
  194. self.deque.clear()
  195. return self.result
  196. # # Test detection of mutation during iteration
  197. d = deque(range(n))
  198. d[n//2] = MutateCmp(d, False)
  199. try:
  200. n in d
  201. printFailed("deque.__contains__", n)
  202. exit(1)
  203. except RuntimeError:
  204. pass
  205. class BadCmp:
  206. def __eq__(self, other):
  207. raise RuntimeError
  208. # # Test detection of comparison exceptions
  209. d = deque(range(n))
  210. d[n//2] = BadCmp()
  211. try:
  212. n in d
  213. printFailed("deque.__contains__", n)
  214. exit(1)
  215. except RuntimeError:
  216. pass
  217. ##### test_contains_count_stop_crashes#####
  218. class A:
  219. def __eq__(self, other):
  220. d.clear()
  221. return NotImplemented
  222. d = deque([A(), A()])
  223. try:
  224. _ = 3 in d
  225. printFailed("deque.__contains__", 3)
  226. exit(1)
  227. except RuntimeError:
  228. pass
  229. d = deque([A(), A()])
  230. try:
  231. _ = d.count(3)
  232. printFailed("deque.count", 3)
  233. exit(1)
  234. except RuntimeError:
  235. pass
  236. ######## TEST extend()################
  237. d = deque('a')
  238. try:
  239. d.extend(1)
  240. printFailed("deque.extend", 1)
  241. exit(1)
  242. except TypeError:
  243. pass
  244. d.extend('bcd')
  245. assertEqual(list(d), list('abcd'))
  246. d.extend(d.copy())
  247. assertEqual(list(d), list('abcdabcd'))
  248. ###### TEST extend_left() ################
  249. d = deque('a')
  250. try:
  251. d.extendleft(1)
  252. printFailed("deque.extendleft", 1)
  253. exit(1)
  254. except TypeError:
  255. pass
  256. d.extendleft('bcd')
  257. assertEqual(list(d), list(reversed('abcd')))
  258. d.extendleft(d.copy())
  259. assertEqual(list(d), list('abcddcba'))
  260. d = deque()
  261. d.extendleft(range(1000))
  262. assertEqual(list(d), list(reversed(range(1000))))
  263. try:
  264. d.extendleft(fail())
  265. printFailed("deque.extendleft", fail())
  266. exit(1)
  267. except SyntaxError:
  268. pass
  269. ##### TEST get_item ################
  270. n = 200
  271. d = deque(range(n))
  272. l = list(range(n))
  273. for i in range(n):
  274. d.popleft()
  275. l.pop(0)
  276. if random.random() < 0.5:
  277. d.append(i)
  278. l.append(i)
  279. for j in range(1-len(l), len(l)):
  280. assert d[j] == l[j]
  281. d = deque('superman')
  282. assertEqual(d[0], 's')
  283. assertEqual(d[-1], 'n')
  284. d = deque()
  285. try:
  286. d.__getitem__(0)
  287. printFailed("deque.__getitem__", 0)
  288. exit(1)
  289. except IndexError:
  290. pass
  291. try:
  292. d.__getitem__(-1)
  293. printFailed("deque.__getitem__", -1)
  294. exit(1)
  295. except IndexError:
  296. pass
  297. ######### TEST index()###############
  298. for n in 1, 2, 30, 40, 200:
  299. d = deque(range(n))
  300. for i in range(n):
  301. assertEqual(d.index(i), i)
  302. try:
  303. d.index(n+1)
  304. printFailed("deque.index", n+1)
  305. exit(1)
  306. except ValueError:
  307. pass
  308. # Test detection of mutation during iteration
  309. d = deque(range(n))
  310. d[n//2] = MutateCmp(d, False)
  311. try:
  312. d.index(n)
  313. printFailed("deque.index", n)
  314. exit(1)
  315. except RuntimeError:
  316. pass
  317. # Test detection of comparison exceptions
  318. d = deque(range(n))
  319. d[n//2] = BadCmp()
  320. try:
  321. d.index(n)
  322. printFailed("deque.index", n)
  323. exit(1)
  324. except RuntimeError:
  325. pass
  326. # Test start and stop arguments behavior matches list.index()
  327. # COMMENT: Current List behavior doesn't support start and stop arguments, so this test is not supported
  328. # elements = 'ABCDEFGHI'
  329. # nonelement = 'Z'
  330. # d = deque(elements * 2)
  331. # s = list(elements * 2)
  332. # for start in range(-5 - len(s)*2, 5 + len(s) * 2):
  333. # for stop in range(-5 - len(s)*2, 5 + len(s) * 2):
  334. # for element in elements + 'Z':
  335. # try:
  336. # print(element, start, stop)
  337. # target = s.index(element, start, stop)
  338. # except ValueError:
  339. # try:
  340. # d.index(element, start, stop)
  341. # print("X Failed Tests!")
  342. # exit(1)
  343. # except ValueError:
  344. # continue
  345. # # with assertRaises(ValueError):
  346. # # d.index(element, start, stop)
  347. # assertEqual(d.index(element, start, stop), target)
  348. # Test large start argument
  349. d = deque(range(0, 10000, 10))
  350. for step in range(100):
  351. i = d.index(8500, 700)
  352. assertEqual(d[i], 8500)
  353. # Repeat test with a different internal offset
  354. d.rotate()
  355. ########### test_index_bug_24913#############
  356. d = deque('A' * 3)
  357. try:
  358. d.index('A', 1, 0)
  359. printFailed("deque.index", 'A', 1, 0)
  360. exit(1)
  361. except ValueError:
  362. pass
  363. ########### test_insert#############
  364. # Test to make sure insert behaves like lists
  365. elements = 'ABCDEFGHI'
  366. for i in range(-5 - len(elements)*2, 5 + len(elements) * 2):
  367. d = deque('ABCDEFGHI')
  368. s = list('ABCDEFGHI')
  369. d.insert(i, 'Z')
  370. s.insert(i, 'Z')
  371. assertEqual(list(d), s)
  372. ########### test_insert_bug_26194#############
  373. data = 'ABC'
  374. d = deque(data, maxlen=len(data))
  375. try:
  376. d.insert(0, 'Z')
  377. printFailed("deque.insert", 0, 'Z')
  378. exit(1)
  379. except IndexError:
  380. pass
  381. elements = 'ABCDEFGHI'
  382. for i in range(-len(elements), len(elements)):
  383. d = deque(elements, maxlen=len(elements)+1)
  384. d.insert(i, 'Z')
  385. if i >= 0:
  386. assertEqual(d[i], 'Z')
  387. else:
  388. assertEqual(d[i-1], 'Z')
  389. ######### test set_item #############
  390. n = 200
  391. d = deque(range(n))
  392. for i in range(n):
  393. d[i] = 10 * i
  394. assertEqual(list(d), [10*i for i in range(n)])
  395. l = list(d)
  396. for i in range(1-n, 0, -1):
  397. d[i] = 7*i
  398. l[i] = 7*i
  399. assertEqual(list(d), l)
  400. ########## test del_item #############
  401. n = 500 # O(n**2) test, don't make this too big
  402. d = deque(range(n))
  403. try:
  404. d.__delitem__(-n-1)
  405. printFailed("deque.__delitem__", -n-1)
  406. exit(1)
  407. except IndexError:
  408. pass
  409. try:
  410. d.__delitem__(n)
  411. printFailed("deque.__delitem__", n)
  412. exit(1)
  413. except IndexError:
  414. pass
  415. for i in range(n):
  416. assertEqual(len(d), n-i)
  417. j = random.randint(0, len(d)-1)
  418. val = d[j]
  419. assertEqual(val in d, True)
  420. del d[j]
  421. assertEqual(val in d, False)
  422. assertEqual(len(d), 0)
  423. ######### test reverse()###############
  424. n = 500 # O(n**2) test, don't make this too big
  425. data = [random.random() for i in range(n)]
  426. for i in range(n):
  427. d = deque(data[:i])
  428. r = d.reverse()
  429. assertEqual(list(d), list(reversed(data[:i])))
  430. assertEqual(r, None)
  431. d.reverse()
  432. assertEqual(list(d), data[:i])
  433. try:
  434. d.reverse(1)
  435. printFailed("deque.reverse", 1)
  436. exit(1)
  437. except TypeError:
  438. pass
  439. ############ test rotate#############
  440. s = tuple('abcde')
  441. n = len(s)
  442. d = deque(s)
  443. d.rotate(1) # verify rot(1)
  444. assertEqual(''.join(d), 'eabcd')
  445. d = deque(s)
  446. d.rotate(-1) # verify rot(-1)
  447. assertEqual(''.join(d), 'bcdea')
  448. d.rotate() # check default to 1
  449. assertEqual(tuple(d), s)
  450. for i in range(n*3):
  451. d = deque(s)
  452. e = deque(d)
  453. d.rotate(i) # check vs. rot(1) n times
  454. for j in range(i):
  455. e.rotate(1)
  456. assertEqual(tuple(d), tuple(e))
  457. d.rotate(-i) # check that it works in reverse
  458. assertEqual(tuple(d), s)
  459. e.rotate(n-i) # check that it wraps forward
  460. assertEqual(tuple(e), s)
  461. for i in range(n*3):
  462. d = deque(s)
  463. e = deque(d)
  464. d.rotate(-i)
  465. for j in range(i):
  466. e.rotate(-1) # check vs. rot(-1) n times
  467. assertEqual(tuple(d), tuple(e))
  468. d.rotate(i) # check that it works in reverse
  469. assertEqual(tuple(d), s)
  470. e.rotate(i-n) # check that it wraps backaround
  471. assertEqual(tuple(e), s)
  472. d = deque(s)
  473. e = deque(s)
  474. e.rotate(BIG+17) # verify on long series of rotates
  475. dr = d.rotate
  476. for i in range(BIG+17):
  477. dr()
  478. assertEqual(tuple(d), tuple(e))
  479. try:
  480. d.rotate(1, 2)
  481. printFailed("deque.rotate", 1, 2)
  482. exit(1)
  483. except TypeError:
  484. pass
  485. try:
  486. d.rotate(1, 10)
  487. printFailed("deque.rotate", 1, 10)
  488. exit(1)
  489. except TypeError:
  490. pass
  491. d = deque()
  492. d.rotate() # rotate an empty deque
  493. assertEqual(d, deque())
  494. ########## test len#############
  495. d = deque('ab')
  496. assertEqual(len(d), 2)
  497. d.popleft()
  498. assertEqual(len(d), 1)
  499. d.pop()
  500. assertEqual(len(d), 0)
  501. try:
  502. d.pop()
  503. printFailed("deque.pop")
  504. exit(1)
  505. except IndexError:
  506. pass
  507. assertEqual(len(d), 0)
  508. d.append('c')
  509. assertEqual(len(d), 1)
  510. d.appendleft('d')
  511. assertEqual(len(d), 2)
  512. d.clear()
  513. assertEqual(len(d), 0)
  514. ############## test underflow#############
  515. d = deque()
  516. try:
  517. d.pop()
  518. printFailed("deque.pop")
  519. exit(1)
  520. except IndexError:
  521. pass
  522. try:
  523. d.popleft()
  524. printFailed("deque.popleft")
  525. exit(1)
  526. except IndexError:
  527. pass
  528. ############## test clear#############
  529. d = deque(range(100))
  530. assertEqual(len(d), 100)
  531. d.clear()
  532. assertEqual(len(d), 0)
  533. assertEqual(list(d), [])
  534. d.clear() # clear an empty deque
  535. assertEqual(list(d), [])
  536. ############# test remove#############
  537. d = deque('abcdefghcij')
  538. d.remove('c')
  539. assertEqual(d, deque('abdefghcij'))
  540. d.remove('c')
  541. assertEqual(d, deque('abdefghij'))
  542. try:
  543. d.remove('c')
  544. printFailed("deque.remove", "c")
  545. exit(1)
  546. except ValueError:
  547. pass
  548. assertEqual(d, deque('abdefghij'))
  549. # Handle comparison errors
  550. d = deque(['a', 'b', BadCmp(), 'c'])
  551. e = deque(d)
  552. try:
  553. d.remove('c')
  554. printFailed("deque.remove", "c")
  555. exit(1)
  556. except RuntimeError:
  557. pass
  558. for x, y in zip(d, e):
  559. # verify that original order and values are retained.
  560. assertEqual(x is y, True)
  561. # Handle evil mutator
  562. for match in (True, False):
  563. d = deque(['ab'])
  564. d.extend([MutateCmp(d, match), 'c'])
  565. try:
  566. d.remove('c')
  567. printFailed("deque.remove", "c")
  568. exit(1)
  569. except IndexError:
  570. pass
  571. assertEqual(d, deque())
  572. ########### test repr#############
  573. d = deque(range(200))
  574. e = eval(repr(d))
  575. assertEqual(list(d), list(e))
  576. d.append(d)
  577. assertEqual(repr(d)[-20:], '7, 198, 199, [...]])')
  578. ######### test init #############
  579. try:
  580. deque('abc', 2, 3)
  581. printFailed("deque", 'abc', 2, 3)
  582. exit(1)
  583. except TypeError:
  584. pass
  585. try:
  586. deque(1)
  587. printFailed("deque", 1)
  588. exit(1)
  589. except TypeError:
  590. pass
  591. ######### test hash #############
  592. try:
  593. hash(deque('abcd'))
  594. except TypeError:
  595. pass
  596. ###### test long steady state queue pop left ########
  597. for size in (0, 1, 2, 100, 1000):
  598. d = deque(range(size))
  599. append, pop = d.append, d.popleft
  600. for i in range(size, BIG):
  601. append(i)
  602. x = pop()
  603. if x != i - size:
  604. assertEqual(x, i-size)
  605. assertEqual(list(d), list(range(BIG-size, BIG)))
  606. ######## test long steady state queue pop right ########
  607. for size in (0, 1, 2, 100, 1000):
  608. d = deque(reversed(range(size)))
  609. append, pop = d.appendleft, d.pop
  610. for i in range(size, BIG):
  611. append(i)
  612. x = pop()
  613. if x != i - size:
  614. assertEqual(x, i-size)
  615. assertEqual(list(reversed(list(d))),
  616. list(range(BIG-size, BIG)))
  617. ###### test big queue popleft ########
  618. d = deque()
  619. append, pop = d.append, d.popleft
  620. for i in range(BIG):
  621. append(i)
  622. for i in range(BIG):
  623. x = pop()
  624. if x != i:
  625. assertEqual(x, i)
  626. ###### test big queue pop right ########
  627. d = deque()
  628. append, pop = d.appendleft, d.pop
  629. for i in range(BIG):
  630. append(i)
  631. for i in range(BIG):
  632. x = pop()
  633. if x != i:
  634. assertEqual(x, i)
  635. ####### test big stack right########
  636. d = deque()
  637. append, pop = d.append, d.pop
  638. for i in range(BIG):
  639. append(i)
  640. for i in reversed(range(BIG)):
  641. x = pop()
  642. if x != i:
  643. assertEqual(x, i)
  644. assertEqual(len(d), 0)
  645. ##### test big stack left ########
  646. d = deque()
  647. append, pop = d.appendleft, d.popleft
  648. for i in range(BIG):
  649. append(i)
  650. for i in reversed(range(BIG)):
  651. x = pop()
  652. if x != i:
  653. assertEqual(x, i)
  654. assertEqual(len(d), 0)
  655. ##### test roundtrip iter init ########
  656. d = deque(range(200))
  657. e = deque(d)
  658. assertNotEqual(id(d), id(e))
  659. assertEqual(list(d), list(e))
  660. ########## test pickle #############
  661. for d in deque(range(200)), deque(range(200), 100):
  662. for i in range(5 + 1):
  663. s = pickle.dumps(d)
  664. e = pickle.loads(s)
  665. assertNotEqual(id(e), id(d))
  666. assertEqual(list(e), list(d))
  667. assertEqual(e.maxlen, d.maxlen)
  668. ######## test pickle recursive ########
  669. # the following doesn't work because the pickle module doesn't
  670. # for d in deque('abc'), deque('abc', 3):
  671. # d.append(d)
  672. # for i in range(5 + 1):
  673. # e = pickle.loads(pickle.dumps(d))
  674. # assertNotEqual(id(e), id(d))
  675. # assertEqual(id(e[-1]), id(e))
  676. # assertEqual(e.maxlen, d.maxlen)
  677. ### test copy ########
  678. mut = [10]
  679. d = deque([mut])
  680. e = d.copy()
  681. assertEqual(list(d), list(e))
  682. mut[0] = 11
  683. assertNotEqual(id(d), id(e))
  684. assertEqual(list(d), list(e))
  685. ### test reversed#$####
  686. for s in ('abcd', range(2000)):
  687. assertEqual(list(reversed(deque(s))), list(reversed(s)))
  688. # probably not supported
  689. # klass = type(reversed(deque()))
  690. # for s in ('abcd', range(2000)):
  691. # assertEqual(list(klass(deque(s))), list(reversed(s)))
  692. d = deque()
  693. for i in range(100):
  694. d.append(1)
  695. gc.collect()