blob: b69110d88d5bcc349a94ac8a79887f9e136e0768 [file] [log] [blame]
Raymond Hettinger756b3f32004-01-29 06:37:52 +00001from collections import deque
2import unittest
Walter Dörwald09a3f2c2005-03-22 22:43:28 +00003from test import test_support, seq_tests
Raymond Hettinger691d8052004-05-30 07:26:47 +00004from weakref import proxy
Raymond Hettinger756b3f32004-01-29 06:37:52 +00005import copy
6import cPickle as pickle
Raymond Hettinger0a4977c2004-03-01 23:16:22 +00007import random
Raymond Hettingera435c532004-07-09 04:10:20 +00008import os
Raymond Hettinger756b3f32004-01-29 06:37:52 +00009
10BIG = 100000
11
Raymond Hettingera435c532004-07-09 04:10:20 +000012def fail():
13 raise SyntaxError
14 yield 1
15
Raymond Hettinger4aec61e2005-03-18 21:20:23 +000016class BadCmp:
17 def __eq__(self, other):
18 raise RuntimeError
19
20class MutateCmp:
Raymond Hettingerd73202c2005-03-19 00:00:51 +000021 def __init__(self, deque, result):
Raymond Hettinger4aec61e2005-03-18 21:20:23 +000022 self.deque = deque
Raymond Hettingerd73202c2005-03-19 00:00:51 +000023 self.result = result
Raymond Hettinger4aec61e2005-03-18 21:20:23 +000024 def __eq__(self, other):
25 self.deque.clear()
Raymond Hettingerd73202c2005-03-19 00:00:51 +000026 return self.result
Raymond Hettinger4aec61e2005-03-18 21:20:23 +000027
Raymond Hettinger756b3f32004-01-29 06:37:52 +000028class TestBasic(unittest.TestCase):
29
30 def test_basics(self):
Raymond Hettingeradf9ffd2007-12-13 00:08:37 +000031 d = deque(xrange(-5125, -5000))
32 d.__init__(xrange(200))
Raymond Hettinger756b3f32004-01-29 06:37:52 +000033 for i in xrange(200, 400):
34 d.append(i)
35 for i in reversed(xrange(-200, 0)):
36 d.appendleft(i)
37 self.assertEqual(list(d), range(-200, 400))
38 self.assertEqual(len(d), 600)
39
40 left = [d.popleft() for i in xrange(250)]
41 self.assertEqual(left, range(-200, 50))
42 self.assertEqual(list(d), range(50, 400))
43
44 right = [d.pop() for i in xrange(250)]
45 right.reverse()
46 self.assertEqual(right, range(150, 400))
47 self.assertEqual(list(d), range(50, 150))
48
Raymond Hettingera7fc4b12007-10-05 02:47:07 +000049 def test_maxlen(self):
Raymond Hettinger68995862007-10-10 00:26:46 +000050 self.assertRaises(ValueError, deque, 'abc', -1)
Raymond Hettingera7fc4b12007-10-05 02:47:07 +000051 self.assertRaises(ValueError, deque, 'abc', -2)
52 d = deque(range(10), maxlen=3)
53 self.assertEqual(repr(d), 'deque([7, 8, 9], maxlen=3)')
54 self.assertEqual(list(d), range(7, 10))
55 self.assertEqual(d, deque(range(10), 3))
56 d.append(10)
57 self.assertEqual(list(d), range(8, 11))
58 d.appendleft(7)
59 self.assertEqual(list(d), range(7, 10))
60 d.extend([10, 11])
61 self.assertEqual(list(d), range(9, 12))
62 d.extendleft([8, 7])
63 self.assertEqual(list(d), range(7, 10))
64 d = deque(xrange(200), maxlen=10)
65 d.append(d)
66 try:
67 fo = open(test_support.TESTFN, "wb")
68 print >> fo, d,
69 fo.close()
70 fo = open(test_support.TESTFN, "rb")
71 self.assertEqual(fo.read(), repr(d))
72 finally:
73 fo.close()
74 os.remove(test_support.TESTFN)
75
Raymond Hettinger68995862007-10-10 00:26:46 +000076 d = deque(range(10), maxlen=None)
Raymond Hettingera7fc4b12007-10-05 02:47:07 +000077 self.assertEqual(repr(d), 'deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])')
78 try:
79 fo = open(test_support.TESTFN, "wb")
80 print >> fo, d,
81 fo.close()
82 fo = open(test_support.TESTFN, "rb")
83 self.assertEqual(fo.read(), repr(d))
84 finally:
85 fo.close()
86 os.remove(test_support.TESTFN)
87
Raymond Hettinger738ec902004-02-29 02:15:56 +000088 def test_comparisons(self):
89 d = deque('xabc'); d.popleft()
90 for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
91 self.assertEqual(d==e, type(d)==type(e) and list(d)==list(e))
92 self.assertEqual(d!=e, not(type(d)==type(e) and list(d)==list(e)))
93
94 args = map(deque, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
95 for x in args:
96 for y in args:
97 self.assertEqual(x == y, list(x) == list(y), (x,y))
98 self.assertEqual(x != y, list(x) != list(y), (x,y))
99 self.assertEqual(x < y, list(x) < list(y), (x,y))
100 self.assertEqual(x <= y, list(x) <= list(y), (x,y))
101 self.assertEqual(x > y, list(x) > list(y), (x,y))
102 self.assertEqual(x >= y, list(x) >= list(y), (x,y))
103 self.assertEqual(cmp(x,y), cmp(list(x),list(y)), (x,y))
104
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000105 def test_extend(self):
106 d = deque('a')
107 self.assertRaises(TypeError, d.extend, 1)
108 d.extend('bcd')
109 self.assertEqual(list(d), list('abcd'))
110
111 def test_extendleft(self):
112 d = deque('a')
113 self.assertRaises(TypeError, d.extendleft, 1)
114 d.extendleft('bcd')
115 self.assertEqual(list(d), list(reversed('abcd')))
Raymond Hettingera435c532004-07-09 04:10:20 +0000116 d = deque()
117 d.extendleft(range(1000))
118 self.assertEqual(list(d), list(reversed(range(1000))))
119 self.assertRaises(SyntaxError, d.extendleft, fail())
Raymond Hettinger3ba85c22004-02-06 19:04:56 +0000120
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000121 def test_getitem(self):
122 n = 200
123 d = deque(xrange(n))
124 l = range(n)
125 for i in xrange(n):
126 d.popleft()
127 l.pop(0)
128 if random.random() < 0.5:
129 d.append(i)
130 l.append(i)
131 for j in xrange(1-len(l), len(l)):
132 assert d[j] == l[j]
133
Raymond Hettinger738ec902004-02-29 02:15:56 +0000134 d = deque('superman')
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000135 self.assertEqual(d[0], 's')
136 self.assertEqual(d[-1], 'n')
Raymond Hettinger738ec902004-02-29 02:15:56 +0000137 d = deque()
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000138 self.assertRaises(IndexError, d.__getitem__, 0)
139 self.assertRaises(IndexError, d.__getitem__, -1)
140
141 def test_setitem(self):
142 n = 200
143 d = deque(xrange(n))
144 for i in xrange(n):
145 d[i] = 10 * i
146 self.assertEqual(list(d), [10*i for i in xrange(n)])
147 l = list(d)
148 for i in xrange(1-n, 0, -1):
149 d[i] = 7*i
150 l[i] = 7*i
151 self.assertEqual(list(d), l)
Raymond Hettinger738ec902004-02-29 02:15:56 +0000152
Raymond Hettinger0e371f22004-05-12 20:55:56 +0000153 def test_delitem(self):
154 n = 500 # O(n**2) test, don't make this too big
155 d = deque(xrange(n))
156 self.assertRaises(IndexError, d.__delitem__, -n-1)
157 self.assertRaises(IndexError, d.__delitem__, n)
158 for i in xrange(n):
159 self.assertEqual(len(d), n-i)
160 j = random.randrange(-len(d), len(d))
161 val = d[j]
162 self.assert_(val in d)
163 del d[j]
164 self.assert_(val not in d)
165 self.assertEqual(len(d), 0)
166
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000167 def test_rotate(self):
Raymond Hettingeree33b272004-02-08 04:05:26 +0000168 s = tuple('abcde')
169 n = len(s)
170
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000171 d = deque(s)
Raymond Hettingeree33b272004-02-08 04:05:26 +0000172 d.rotate(1) # verify rot(1)
173 self.assertEqual(''.join(d), 'eabcd')
174
175 d = deque(s)
176 d.rotate(-1) # verify rot(-1)
177 self.assertEqual(''.join(d), 'bcdea')
178 d.rotate() # check default to 1
179 self.assertEqual(tuple(d), s)
180
181 for i in xrange(n*3):
182 d = deque(s)
183 e = deque(d)
184 d.rotate(i) # check vs. rot(1) n times
185 for j in xrange(i):
186 e.rotate(1)
187 self.assertEqual(tuple(d), tuple(e))
188 d.rotate(-i) # check that it works in reverse
189 self.assertEqual(tuple(d), s)
190 e.rotate(n-i) # check that it wraps forward
191 self.assertEqual(tuple(e), s)
192
193 for i in xrange(n*3):
194 d = deque(s)
195 e = deque(d)
196 d.rotate(-i)
197 for j in xrange(i):
198 e.rotate(-1) # check vs. rot(-1) n times
199 self.assertEqual(tuple(d), tuple(e))
200 d.rotate(i) # check that it works in reverse
201 self.assertEqual(tuple(d), s)
202 e.rotate(i-n) # check that it wraps backaround
203 self.assertEqual(tuple(e), s)
204
205 d = deque(s)
206 e = deque(s)
207 e.rotate(BIG+17) # verify on long series of rotates
208 dr = d.rotate
209 for i in xrange(BIG+17):
210 dr()
211 self.assertEqual(tuple(d), tuple(e))
Raymond Hettinger5c5eb862004-02-07 21:13:00 +0000212
Raymond Hettingera435c532004-07-09 04:10:20 +0000213 self.assertRaises(TypeError, d.rotate, 'x') # Wrong arg type
214 self.assertRaises(TypeError, d.rotate, 1, 10) # Too many args
215
216 d = deque()
217 d.rotate() # rotate an empty deque
218 self.assertEqual(d, deque())
219
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000220 def test_len(self):
221 d = deque('ab')
222 self.assertEqual(len(d), 2)
223 d.popleft()
224 self.assertEqual(len(d), 1)
225 d.pop()
226 self.assertEqual(len(d), 0)
Raymond Hettinger738ec902004-02-29 02:15:56 +0000227 self.assertRaises(IndexError, d.pop)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000228 self.assertEqual(len(d), 0)
229 d.append('c')
230 self.assertEqual(len(d), 1)
231 d.appendleft('d')
232 self.assertEqual(len(d), 2)
233 d.clear()
234 self.assertEqual(len(d), 0)
235
236 def test_underflow(self):
237 d = deque()
Raymond Hettinger738ec902004-02-29 02:15:56 +0000238 self.assertRaises(IndexError, d.pop)
239 self.assertRaises(IndexError, d.popleft)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000240
241 def test_clear(self):
242 d = deque(xrange(100))
243 self.assertEqual(len(d), 100)
244 d.clear()
245 self.assertEqual(len(d), 0)
246 self.assertEqual(list(d), [])
Raymond Hettingera435c532004-07-09 04:10:20 +0000247 d.clear() # clear an emtpy deque
248 self.assertEqual(list(d), [])
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000249
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000250 def test_remove(self):
251 d = deque('abcdefghcij')
252 d.remove('c')
253 self.assertEqual(d, deque('abdefghcij'))
254 d.remove('c')
255 self.assertEqual(d, deque('abdefghij'))
256 self.assertRaises(ValueError, d.remove, 'c')
257 self.assertEqual(d, deque('abdefghij'))
258
Walter Dörwaldc448a912005-03-22 11:22:38 +0000259 # Handle comparison errors
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000260 d = deque(['a', 'b', BadCmp(), 'c'])
261 e = deque(d)
262 self.assertRaises(RuntimeError, d.remove, 'c')
263 for x, y in zip(d, e):
264 # verify that original order and values are retained.
265 self.assert_(x is y)
266
267 # Handle evil mutator
Raymond Hettingerd73202c2005-03-19 00:00:51 +0000268 for match in (True, False):
269 d = deque(['ab'])
270 d.extend([MutateCmp(d, match), 'c'])
271 self.assertRaises(IndexError, d.remove, 'c')
272 self.assertEqual(d, deque())
Raymond Hettinger4aec61e2005-03-18 21:20:23 +0000273
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000274 def test_repr(self):
275 d = deque(xrange(200))
276 e = eval(repr(d))
277 self.assertEqual(list(d), list(e))
278 d.append(d)
279 self.assert_('...' in repr(d))
280
281 def test_print(self):
282 d = deque(xrange(200))
283 d.append(d)
Raymond Hettingera435c532004-07-09 04:10:20 +0000284 try:
285 fo = open(test_support.TESTFN, "wb")
286 print >> fo, d,
287 fo.close()
288 fo = open(test_support.TESTFN, "rb")
289 self.assertEqual(fo.read(), repr(d))
290 finally:
291 fo.close()
292 os.remove(test_support.TESTFN)
293
294 def test_init(self):
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000295 self.assertRaises(TypeError, deque, 'abc', 2, 3);
Raymond Hettingera435c532004-07-09 04:10:20 +0000296 self.assertRaises(TypeError, deque, 1);
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000297
298 def test_hash(self):
299 self.assertRaises(TypeError, hash, deque('abc'))
300
301 def test_long_steadystate_queue_popleft(self):
302 for size in (0, 1, 2, 100, 1000):
303 d = deque(xrange(size))
304 append, pop = d.append, d.popleft
305 for i in xrange(size, BIG):
306 append(i)
307 x = pop()
308 if x != i - size:
309 self.assertEqual(x, i-size)
310 self.assertEqual(list(d), range(BIG-size, BIG))
311
312 def test_long_steadystate_queue_popright(self):
313 for size in (0, 1, 2, 100, 1000):
314 d = deque(reversed(xrange(size)))
315 append, pop = d.appendleft, d.pop
316 for i in xrange(size, BIG):
317 append(i)
318 x = pop()
319 if x != i - size:
320 self.assertEqual(x, i-size)
321 self.assertEqual(list(reversed(list(d))), range(BIG-size, BIG))
322
323 def test_big_queue_popleft(self):
324 pass
325 d = deque()
326 append, pop = d.append, d.popleft
327 for i in xrange(BIG):
328 append(i)
329 for i in xrange(BIG):
330 x = pop()
331 if x != i:
332 self.assertEqual(x, i)
333
334 def test_big_queue_popright(self):
335 d = deque()
336 append, pop = d.appendleft, d.pop
337 for i in xrange(BIG):
338 append(i)
339 for i in xrange(BIG):
340 x = pop()
341 if x != i:
342 self.assertEqual(x, i)
343
344 def test_big_stack_right(self):
345 d = deque()
346 append, pop = d.append, d.pop
347 for i in xrange(BIG):
348 append(i)
349 for i in reversed(xrange(BIG)):
350 x = pop()
351 if x != i:
352 self.assertEqual(x, i)
353 self.assertEqual(len(d), 0)
354
355 def test_big_stack_left(self):
356 d = deque()
357 append, pop = d.appendleft, d.popleft
358 for i in xrange(BIG):
359 append(i)
360 for i in reversed(xrange(BIG)):
361 x = pop()
362 if x != i:
363 self.assertEqual(x, i)
364 self.assertEqual(len(d), 0)
365
366 def test_roundtrip_iter_init(self):
367 d = deque(xrange(200))
368 e = deque(d)
369 self.assertNotEqual(id(d), id(e))
370 self.assertEqual(list(d), list(e))
371
372 def test_pickle(self):
373 d = deque(xrange(200))
Raymond Hettinger952f8802004-11-09 07:27:35 +0000374 for i in (0, 1, 2):
375 s = pickle.dumps(d, i)
376 e = pickle.loads(s)
377 self.assertNotEqual(id(d), id(e))
378 self.assertEqual(list(d), list(e))
379
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000380## def test_pickle_recursive(self):
381## d = deque('abc')
382## d.append(d)
383## for i in (0, 1, 2):
384## e = pickle.loads(pickle.dumps(d, i))
385## self.assertNotEqual(id(d), id(e))
386## self.assertEqual(id(e), id(e[-1]))
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000387
388 def test_deepcopy(self):
389 mut = [10]
390 d = deque([mut])
391 e = copy.deepcopy(d)
392 self.assertEqual(list(d), list(e))
393 mut[0] = 11
394 self.assertNotEqual(id(d), id(e))
395 self.assertNotEqual(list(d), list(e))
396
397 def test_copy(self):
398 mut = [10]
399 d = deque([mut])
400 e = copy.copy(d)
401 self.assertEqual(list(d), list(e))
402 mut[0] = 11
403 self.assertNotEqual(id(d), id(e))
404 self.assertEqual(list(d), list(e))
405
Raymond Hettingerc058fd12004-02-07 02:45:22 +0000406 def test_reversed(self):
407 for s in ('abcd', xrange(2000)):
408 self.assertEqual(list(reversed(deque(s))), list(reversed(s)))
409
Tim Peters10c7e862004-10-01 02:01:04 +0000410 def test_gc_doesnt_blowup(self):
411 import gc
412 # This used to assert-fail in deque_traverse() under a debug
413 # build, or run wild with a NULL pointer in a release build.
414 d = deque()
415 for i in xrange(100):
416 d.append(1)
417 gc.collect()
418
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000419class TestVariousIteratorArgs(unittest.TestCase):
420
421 def test_constructor(self):
422 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
Walter Dörwald09a3f2c2005-03-22 22:43:28 +0000423 for g in (seq_tests.Sequence, seq_tests.IterFunc,
424 seq_tests.IterGen, seq_tests.IterFuncStop,
425 seq_tests.itermulti, seq_tests.iterfunc):
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000426 self.assertEqual(list(deque(g(s))), list(g(s)))
Walter Dörwald09a3f2c2005-03-22 22:43:28 +0000427 self.assertRaises(TypeError, deque, seq_tests.IterNextOnly(s))
428 self.assertRaises(TypeError, deque, seq_tests.IterNoNext(s))
429 self.assertRaises(ZeroDivisionError, deque, seq_tests.IterGenExc(s))
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000430
431 def test_iter_with_altered_data(self):
432 d = deque('abcdefg')
433 it = iter(d)
434 d.pop()
435 self.assertRaises(RuntimeError, it.next)
436
Raymond Hettinger51c2f6c2007-01-08 18:09:20 +0000437 def test_runtime_error_on_empty_deque(self):
438 d = deque()
439 it = iter(d)
440 d.append(10)
441 self.assertRaises(RuntimeError, it.next)
442
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000443class Deque(deque):
444 pass
445
Raymond Hettinger952f8802004-11-09 07:27:35 +0000446class DequeWithBadIter(deque):
447 def __iter__(self):
448 raise TypeError
449
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000450class TestSubclass(unittest.TestCase):
451
452 def test_basics(self):
Raymond Hettingeradf9ffd2007-12-13 00:08:37 +0000453 d = Deque(xrange(25))
454 d.__init__(xrange(200))
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000455 for i in xrange(200, 400):
456 d.append(i)
457 for i in reversed(xrange(-200, 0)):
458 d.appendleft(i)
459 self.assertEqual(list(d), range(-200, 400))
460 self.assertEqual(len(d), 600)
461
462 left = [d.popleft() for i in xrange(250)]
463 self.assertEqual(left, range(-200, 50))
464 self.assertEqual(list(d), range(50, 400))
465
466 right = [d.pop() for i in xrange(250)]
467 right.reverse()
468 self.assertEqual(right, range(150, 400))
469 self.assertEqual(list(d), range(50, 150))
470
471 d.clear()
472 self.assertEqual(len(d), 0)
473
474 def test_copy_pickle(self):
475
476 d = Deque('abc')
477
478 e = d.__copy__()
479 self.assertEqual(type(d), type(e))
480 self.assertEqual(list(d), list(e))
481
482 e = Deque(d)
483 self.assertEqual(type(d), type(e))
484 self.assertEqual(list(d), list(e))
485
486 s = pickle.dumps(d)
487 e = pickle.loads(s)
488 self.assertNotEqual(id(d), id(e))
489 self.assertEqual(type(d), type(e))
490 self.assertEqual(list(d), list(e))
491
Raymond Hettinger68995862007-10-10 00:26:46 +0000492 d = Deque('abcde', maxlen=4)
493
494 e = d.__copy__()
495 self.assertEqual(type(d), type(e))
496 self.assertEqual(list(d), list(e))
497
498 e = Deque(d)
499 self.assertEqual(type(d), type(e))
500 self.assertEqual(list(d), list(e))
501
502 s = pickle.dumps(d)
503 e = pickle.loads(s)
504 self.assertNotEqual(id(d), id(e))
505 self.assertEqual(type(d), type(e))
506 self.assertEqual(list(d), list(e))
507
Raymond Hettingera7fc4b12007-10-05 02:47:07 +0000508## def test_pickle(self):
509## d = Deque('abc')
510## d.append(d)
511##
512## e = pickle.loads(pickle.dumps(d))
513## self.assertNotEqual(id(d), id(e))
514## self.assertEqual(type(d), type(e))
515## dd = d.pop()
516## ee = e.pop()
517## self.assertEqual(id(e), id(ee))
518## self.assertEqual(d, e)
519##
520## d.x = d
521## e = pickle.loads(pickle.dumps(d))
522## self.assertEqual(id(e), id(e.x))
523##
524## d = DequeWithBadIter('abc')
525## self.assertRaises(TypeError, pickle.dumps, d)
Raymond Hettinger952f8802004-11-09 07:27:35 +0000526
Raymond Hettinger691d8052004-05-30 07:26:47 +0000527 def test_weakref(self):
528 d = deque('gallahad')
529 p = proxy(d)
530 self.assertEqual(str(p), str(d))
531 d = None
532 self.assertRaises(ReferenceError, str, p)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000533
Armin Rigo974d7572004-10-02 13:59:34 +0000534 def test_strange_subclass(self):
535 class X(deque):
536 def __iter__(self):
537 return iter([])
538 d1 = X([1,2,3])
539 d2 = X([4,5,6])
540 d1 == d2 # not clear if this is supposed to be True or False,
541 # but it used to give a SystemError
542
Georg Brandlb84c1372007-01-21 10:28:43 +0000543
544class SubclassWithKwargs(deque):
545 def __init__(self, newarg=1):
546 deque.__init__(self)
547
548class TestSubclassWithKwargs(unittest.TestCase):
549 def test_subclass_with_kwargs(self):
550 # SF bug #1486663 -- this used to erroneously raise a TypeError
551 SubclassWithKwargs(newarg=1)
552
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000553#==============================================================================
554
Raymond Hettinger738ec902004-02-29 02:15:56 +0000555libreftest = """
556Example from the Library Reference: Doc/lib/libcollections.tex
557
558>>> from collections import deque
559>>> d = deque('ghi') # make a new deque with three items
560>>> for elem in d: # iterate over the deque's elements
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000561... print elem.upper()
Raymond Hettinger738ec902004-02-29 02:15:56 +0000562G
563H
564I
565>>> d.append('j') # add a new entry to the right side
566>>> d.appendleft('f') # add a new entry to the left side
567>>> d # show the representation of the deque
568deque(['f', 'g', 'h', 'i', 'j'])
569>>> d.pop() # return and remove the rightmost item
570'j'
571>>> d.popleft() # return and remove the leftmost item
572'f'
573>>> list(d) # list the contents of the deque
574['g', 'h', 'i']
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000575>>> d[0] # peek at leftmost item
Raymond Hettinger738ec902004-02-29 02:15:56 +0000576'g'
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000577>>> d[-1] # peek at rightmost item
Raymond Hettinger738ec902004-02-29 02:15:56 +0000578'i'
579>>> list(reversed(d)) # list the contents of a deque in reverse
580['i', 'h', 'g']
581>>> 'h' in d # search the deque
582True
583>>> d.extend('jkl') # add multiple elements at once
584>>> d
585deque(['g', 'h', 'i', 'j', 'k', 'l'])
586>>> d.rotate(1) # right rotation
587>>> d
588deque(['l', 'g', 'h', 'i', 'j', 'k'])
589>>> d.rotate(-1) # left rotation
590>>> d
591deque(['g', 'h', 'i', 'j', 'k', 'l'])
592>>> deque(reversed(d)) # make a new deque in reverse order
593deque(['l', 'k', 'j', 'i', 'h', 'g'])
594>>> d.clear() # empty the deque
595>>> d.pop() # cannot pop from an empty deque
596Traceback (most recent call last):
597 File "<pyshell#6>", line 1, in -toplevel-
598 d.pop()
599IndexError: pop from an empty deque
600
601>>> d.extendleft('abc') # extendleft() reverses the input order
602>>> d
603deque(['c', 'b', 'a'])
604
Raymond Hettingere7169eb2004-05-09 01:15:01 +0000605
606
Raymond Hettingere7169eb2004-05-09 01:15:01 +0000607>>> def delete_nth(d, n):
Raymond Hettingere7169eb2004-05-09 01:15:01 +0000608... d.rotate(-n)
609... d.popleft()
610... d.rotate(n)
611...
612>>> d = deque('abcdef')
613>>> delete_nth(d, 2) # remove the entry at d[2]
614>>> d
615deque(['a', 'b', 'd', 'e', 'f'])
616
617
618
619>>> def roundrobin(*iterables):
620... pending = deque(iter(i) for i in iterables)
621... while pending:
622... task = pending.popleft()
623... try:
624... yield task.next()
625... except StopIteration:
626... continue
627... pending.append(task)
628...
629
630>>> for value in roundrobin('abc', 'd', 'efgh'):
631... print value
632...
633a
634d
635e
636b
637f
638c
639g
640h
641
642
643>>> def maketree(iterable):
644... d = deque(iterable)
645... while len(d) > 1:
646... pair = [d.popleft(), d.popleft()]
647... d.append(pair)
648... return list(d)
649...
650>>> print maketree('abcdefgh')
651[[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]]
652
Raymond Hettinger738ec902004-02-29 02:15:56 +0000653"""
654
655
656#==============================================================================
657
658__test__ = {'libreftest' : libreftest}
659
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000660def test_main(verbose=None):
661 import sys
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000662 test_classes = (
663 TestBasic,
664 TestVariousIteratorArgs,
665 TestSubclass,
Georg Brandlb84c1372007-01-21 10:28:43 +0000666 TestSubclassWithKwargs,
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000667 )
668
669 test_support.run_unittest(*test_classes)
670
671 # verify reference counting
672 if verbose and hasattr(sys, "gettotalrefcount"):
673 import gc
674 counts = [None] * 5
675 for i in xrange(len(counts)):
676 test_support.run_unittest(*test_classes)
677 gc.collect()
678 counts[i] = sys.gettotalrefcount()
679 print counts
Raymond Hettinger0a4977c2004-03-01 23:16:22 +0000680
Raymond Hettinger738ec902004-02-29 02:15:56 +0000681 # doctests
682 from test import test_deque
Raymond Hettinger354433a2004-05-19 08:20:33 +0000683 test_support.run_doctest(test_deque, verbose)
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000684
685if __name__ == "__main__":
686 test_main(verbose=True)