Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / lib / python / lib / python2.4 / test / test_deque.py
CommitLineData
86530b38
AT
1from collections import deque
2import unittest
3from test import test_support
4from weakref import proxy
5import copy
6import cPickle as pickle
7from cStringIO import StringIO
8import random
9import os
10
11BIG = 100000
12
13def fail():
14 raise SyntaxError
15 yield 1
16
17class TestBasic(unittest.TestCase):
18
19 def test_basics(self):
20 d = deque(xrange(100))
21 d.__init__(xrange(100, 200))
22 for i in xrange(200, 400):
23 d.append(i)
24 for i in reversed(xrange(-200, 0)):
25 d.appendleft(i)
26 self.assertEqual(list(d), range(-200, 400))
27 self.assertEqual(len(d), 600)
28
29 left = [d.popleft() for i in xrange(250)]
30 self.assertEqual(left, range(-200, 50))
31 self.assertEqual(list(d), range(50, 400))
32
33 right = [d.pop() for i in xrange(250)]
34 right.reverse()
35 self.assertEqual(right, range(150, 400))
36 self.assertEqual(list(d), range(50, 150))
37
38 def test_comparisons(self):
39 d = deque('xabc'); d.popleft()
40 for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
41 self.assertEqual(d==e, type(d)==type(e) and list(d)==list(e))
42 self.assertEqual(d!=e, not(type(d)==type(e) and list(d)==list(e)))
43
44 args = map(deque, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
45 for x in args:
46 for y in args:
47 self.assertEqual(x == y, list(x) == list(y), (x,y))
48 self.assertEqual(x != y, list(x) != list(y), (x,y))
49 self.assertEqual(x < y, list(x) < list(y), (x,y))
50 self.assertEqual(x <= y, list(x) <= list(y), (x,y))
51 self.assertEqual(x > y, list(x) > list(y), (x,y))
52 self.assertEqual(x >= y, list(x) >= list(y), (x,y))
53 self.assertEqual(cmp(x,y), cmp(list(x),list(y)), (x,y))
54
55 def test_extend(self):
56 d = deque('a')
57 self.assertRaises(TypeError, d.extend, 1)
58 d.extend('bcd')
59 self.assertEqual(list(d), list('abcd'))
60
61 def test_extendleft(self):
62 d = deque('a')
63 self.assertRaises(TypeError, d.extendleft, 1)
64 d.extendleft('bcd')
65 self.assertEqual(list(d), list(reversed('abcd')))
66 d = deque()
67 d.extendleft(range(1000))
68 self.assertEqual(list(d), list(reversed(range(1000))))
69 self.assertRaises(SyntaxError, d.extendleft, fail())
70
71 def test_getitem(self):
72 n = 200
73 d = deque(xrange(n))
74 l = range(n)
75 for i in xrange(n):
76 d.popleft()
77 l.pop(0)
78 if random.random() < 0.5:
79 d.append(i)
80 l.append(i)
81 for j in xrange(1-len(l), len(l)):
82 assert d[j] == l[j]
83
84 d = deque('superman')
85 self.assertEqual(d[0], 's')
86 self.assertEqual(d[-1], 'n')
87 d = deque()
88 self.assertRaises(IndexError, d.__getitem__, 0)
89 self.assertRaises(IndexError, d.__getitem__, -1)
90
91 def test_setitem(self):
92 n = 200
93 d = deque(xrange(n))
94 for i in xrange(n):
95 d[i] = 10 * i
96 self.assertEqual(list(d), [10*i for i in xrange(n)])
97 l = list(d)
98 for i in xrange(1-n, 0, -1):
99 d[i] = 7*i
100 l[i] = 7*i
101 self.assertEqual(list(d), l)
102
103 def test_delitem(self):
104 n = 500 # O(n**2) test, don't make this too big
105 d = deque(xrange(n))
106 self.assertRaises(IndexError, d.__delitem__, -n-1)
107 self.assertRaises(IndexError, d.__delitem__, n)
108 for i in xrange(n):
109 self.assertEqual(len(d), n-i)
110 j = random.randrange(-len(d), len(d))
111 val = d[j]
112 self.assert_(val in d)
113 del d[j]
114 self.assert_(val not in d)
115 self.assertEqual(len(d), 0)
116
117 def test_rotate(self):
118 s = tuple('abcde')
119 n = len(s)
120
121 d = deque(s)
122 d.rotate(1) # verify rot(1)
123 self.assertEqual(''.join(d), 'eabcd')
124
125 d = deque(s)
126 d.rotate(-1) # verify rot(-1)
127 self.assertEqual(''.join(d), 'bcdea')
128 d.rotate() # check default to 1
129 self.assertEqual(tuple(d), s)
130
131 for i in xrange(n*3):
132 d = deque(s)
133 e = deque(d)
134 d.rotate(i) # check vs. rot(1) n times
135 for j in xrange(i):
136 e.rotate(1)
137 self.assertEqual(tuple(d), tuple(e))
138 d.rotate(-i) # check that it works in reverse
139 self.assertEqual(tuple(d), s)
140 e.rotate(n-i) # check that it wraps forward
141 self.assertEqual(tuple(e), s)
142
143 for i in xrange(n*3):
144 d = deque(s)
145 e = deque(d)
146 d.rotate(-i)
147 for j in xrange(i):
148 e.rotate(-1) # check vs. rot(-1) n times
149 self.assertEqual(tuple(d), tuple(e))
150 d.rotate(i) # check that it works in reverse
151 self.assertEqual(tuple(d), s)
152 e.rotate(i-n) # check that it wraps backaround
153 self.assertEqual(tuple(e), s)
154
155 d = deque(s)
156 e = deque(s)
157 e.rotate(BIG+17) # verify on long series of rotates
158 dr = d.rotate
159 for i in xrange(BIG+17):
160 dr()
161 self.assertEqual(tuple(d), tuple(e))
162
163 self.assertRaises(TypeError, d.rotate, 'x') # Wrong arg type
164 self.assertRaises(TypeError, d.rotate, 1, 10) # Too many args
165
166 d = deque()
167 d.rotate() # rotate an empty deque
168 self.assertEqual(d, deque())
169
170 def test_len(self):
171 d = deque('ab')
172 self.assertEqual(len(d), 2)
173 d.popleft()
174 self.assertEqual(len(d), 1)
175 d.pop()
176 self.assertEqual(len(d), 0)
177 self.assertRaises(IndexError, d.pop)
178 self.assertEqual(len(d), 0)
179 d.append('c')
180 self.assertEqual(len(d), 1)
181 d.appendleft('d')
182 self.assertEqual(len(d), 2)
183 d.clear()
184 self.assertEqual(len(d), 0)
185
186 def test_underflow(self):
187 d = deque()
188 self.assertRaises(IndexError, d.pop)
189 self.assertRaises(IndexError, d.popleft)
190
191 def test_clear(self):
192 d = deque(xrange(100))
193 self.assertEqual(len(d), 100)
194 d.clear()
195 self.assertEqual(len(d), 0)
196 self.assertEqual(list(d), [])
197 d.clear() # clear an emtpy deque
198 self.assertEqual(list(d), [])
199
200 def test_repr(self):
201 d = deque(xrange(200))
202 e = eval(repr(d))
203 self.assertEqual(list(d), list(e))
204 d.append(d)
205 self.assert_('...' in repr(d))
206
207 def test_print(self):
208 d = deque(xrange(200))
209 d.append(d)
210 try:
211 fo = open(test_support.TESTFN, "wb")
212 print >> fo, d,
213 fo.close()
214 fo = open(test_support.TESTFN, "rb")
215 self.assertEqual(fo.read(), repr(d))
216 finally:
217 fo.close()
218 os.remove(test_support.TESTFN)
219
220 def test_init(self):
221 self.assertRaises(TypeError, deque, 'abc', 2);
222 self.assertRaises(TypeError, deque, 1);
223
224 def test_hash(self):
225 self.assertRaises(TypeError, hash, deque('abc'))
226
227 def test_long_steadystate_queue_popleft(self):
228 for size in (0, 1, 2, 100, 1000):
229 d = deque(xrange(size))
230 append, pop = d.append, d.popleft
231 for i in xrange(size, BIG):
232 append(i)
233 x = pop()
234 if x != i - size:
235 self.assertEqual(x, i-size)
236 self.assertEqual(list(d), range(BIG-size, BIG))
237
238 def test_long_steadystate_queue_popright(self):
239 for size in (0, 1, 2, 100, 1000):
240 d = deque(reversed(xrange(size)))
241 append, pop = d.appendleft, d.pop
242 for i in xrange(size, BIG):
243 append(i)
244 x = pop()
245 if x != i - size:
246 self.assertEqual(x, i-size)
247 self.assertEqual(list(reversed(list(d))), range(BIG-size, BIG))
248
249 def test_big_queue_popleft(self):
250 pass
251 d = deque()
252 append, pop = d.append, d.popleft
253 for i in xrange(BIG):
254 append(i)
255 for i in xrange(BIG):
256 x = pop()
257 if x != i:
258 self.assertEqual(x, i)
259
260 def test_big_queue_popright(self):
261 d = deque()
262 append, pop = d.appendleft, d.pop
263 for i in xrange(BIG):
264 append(i)
265 for i in xrange(BIG):
266 x = pop()
267 if x != i:
268 self.assertEqual(x, i)
269
270 def test_big_stack_right(self):
271 d = deque()
272 append, pop = d.append, d.pop
273 for i in xrange(BIG):
274 append(i)
275 for i in reversed(xrange(BIG)):
276 x = pop()
277 if x != i:
278 self.assertEqual(x, i)
279 self.assertEqual(len(d), 0)
280
281 def test_big_stack_left(self):
282 d = deque()
283 append, pop = d.appendleft, d.popleft
284 for i in xrange(BIG):
285 append(i)
286 for i in reversed(xrange(BIG)):
287 x = pop()
288 if x != i:
289 self.assertEqual(x, i)
290 self.assertEqual(len(d), 0)
291
292 def test_roundtrip_iter_init(self):
293 d = deque(xrange(200))
294 e = deque(d)
295 self.assertNotEqual(id(d), id(e))
296 self.assertEqual(list(d), list(e))
297
298 def test_pickle(self):
299 d = deque(xrange(200))
300 for i in (0, 1, 2):
301 s = pickle.dumps(d, i)
302 e = pickle.loads(s)
303 self.assertNotEqual(id(d), id(e))
304 self.assertEqual(list(d), list(e))
305
306 def test_pickle_recursive(self):
307 d = deque('abc')
308 d.append(d)
309 for i in (0, 1, 2):
310 e = pickle.loads(pickle.dumps(d, i))
311 self.assertNotEqual(id(d), id(e))
312 self.assertEqual(id(e), id(e[-1]))
313
314 def test_deepcopy(self):
315 mut = [10]
316 d = deque([mut])
317 e = copy.deepcopy(d)
318 self.assertEqual(list(d), list(e))
319 mut[0] = 11
320 self.assertNotEqual(id(d), id(e))
321 self.assertNotEqual(list(d), list(e))
322
323 def test_copy(self):
324 mut = [10]
325 d = deque([mut])
326 e = copy.copy(d)
327 self.assertEqual(list(d), list(e))
328 mut[0] = 11
329 self.assertNotEqual(id(d), id(e))
330 self.assertEqual(list(d), list(e))
331
332 def test_reversed(self):
333 for s in ('abcd', xrange(2000)):
334 self.assertEqual(list(reversed(deque(s))), list(reversed(s)))
335
336 def test_gc_doesnt_blowup(self):
337 import gc
338 # This used to assert-fail in deque_traverse() under a debug
339 # build, or run wild with a NULL pointer in a release build.
340 d = deque()
341 for i in xrange(100):
342 d.append(1)
343 gc.collect()
344
345def R(seqn):
346 'Regular generator'
347 for i in seqn:
348 yield i
349
350class G:
351 'Sequence using __getitem__'
352 def __init__(self, seqn):
353 self.seqn = seqn
354 def __getitem__(self, i):
355 return self.seqn[i]
356
357class I:
358 'Sequence using iterator protocol'
359 def __init__(self, seqn):
360 self.seqn = seqn
361 self.i = 0
362 def __iter__(self):
363 return self
364 def next(self):
365 if self.i >= len(self.seqn): raise StopIteration
366 v = self.seqn[self.i]
367 self.i += 1
368 return v
369
370class Ig:
371 'Sequence using iterator protocol defined with a generator'
372 def __init__(self, seqn):
373 self.seqn = seqn
374 self.i = 0
375 def __iter__(self):
376 for val in self.seqn:
377 yield val
378
379class X:
380 'Missing __getitem__ and __iter__'
381 def __init__(self, seqn):
382 self.seqn = seqn
383 self.i = 0
384 def next(self):
385 if self.i >= len(self.seqn): raise StopIteration
386 v = self.seqn[self.i]
387 self.i += 1
388 return v
389
390class N:
391 'Iterator missing next()'
392 def __init__(self, seqn):
393 self.seqn = seqn
394 self.i = 0
395 def __iter__(self):
396 return self
397
398class E:
399 'Test propagation of exceptions'
400 def __init__(self, seqn):
401 self.seqn = seqn
402 self.i = 0
403 def __iter__(self):
404 return self
405 def next(self):
406 3 // 0
407
408class S:
409 'Test immediate stop'
410 def __init__(self, seqn):
411 pass
412 def __iter__(self):
413 return self
414 def next(self):
415 raise StopIteration
416
417from itertools import chain, imap
418def L(seqn):
419 'Test multiple tiers of iterators'
420 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
421
422
423class TestVariousIteratorArgs(unittest.TestCase):
424
425 def test_constructor(self):
426 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
427 for g in (G, I, Ig, S, L, R):
428 self.assertEqual(list(deque(g(s))), list(g(s)))
429 self.assertRaises(TypeError, deque, X(s))
430 self.assertRaises(TypeError, deque, N(s))
431 self.assertRaises(ZeroDivisionError, deque, E(s))
432
433 def test_iter_with_altered_data(self):
434 d = deque('abcdefg')
435 it = iter(d)
436 d.pop()
437 self.assertRaises(RuntimeError, it.next)
438
439class Deque(deque):
440 pass
441
442class DequeWithBadIter(deque):
443 def __iter__(self):
444 raise TypeError
445
446class TestSubclass(unittest.TestCase):
447
448 def test_basics(self):
449 d = Deque(xrange(100))
450 d.__init__(xrange(100, 200))
451 for i in xrange(200, 400):
452 d.append(i)
453 for i in reversed(xrange(-200, 0)):
454 d.appendleft(i)
455 self.assertEqual(list(d), range(-200, 400))
456 self.assertEqual(len(d), 600)
457
458 left = [d.popleft() for i in xrange(250)]
459 self.assertEqual(left, range(-200, 50))
460 self.assertEqual(list(d), range(50, 400))
461
462 right = [d.pop() for i in xrange(250)]
463 right.reverse()
464 self.assertEqual(right, range(150, 400))
465 self.assertEqual(list(d), range(50, 150))
466
467 d.clear()
468 self.assertEqual(len(d), 0)
469
470 def test_copy_pickle(self):
471
472 d = Deque('abc')
473
474 e = d.__copy__()
475 self.assertEqual(type(d), type(e))
476 self.assertEqual(list(d), list(e))
477
478 e = Deque(d)
479 self.assertEqual(type(d), type(e))
480 self.assertEqual(list(d), list(e))
481
482 s = pickle.dumps(d)
483 e = pickle.loads(s)
484 self.assertNotEqual(id(d), id(e))
485 self.assertEqual(type(d), type(e))
486 self.assertEqual(list(d), list(e))
487
488 def test_pickle(self):
489 d = Deque('abc')
490 d.append(d)
491
492 e = pickle.loads(pickle.dumps(d))
493 self.assertNotEqual(id(d), id(e))
494 self.assertEqual(type(d), type(e))
495 dd = d.pop()
496 ee = e.pop()
497 self.assertEqual(id(e), id(ee))
498 self.assertEqual(d, e)
499
500 d.x = d
501 e = pickle.loads(pickle.dumps(d))
502 self.assertEqual(id(e), id(e.x))
503
504 d = DequeWithBadIter('abc')
505 self.assertRaises(TypeError, pickle.dumps, d)
506
507 def test_weakref(self):
508 d = deque('gallahad')
509 p = proxy(d)
510 self.assertEqual(str(p), str(d))
511 d = None
512 self.assertRaises(ReferenceError, str, p)
513
514 def test_strange_subclass(self):
515 class X(deque):
516 def __iter__(self):
517 return iter([])
518 d1 = X([1,2,3])
519 d2 = X([4,5,6])
520 d1 == d2 # not clear if this is supposed to be True or False,
521 # but it used to give a SystemError
522
523#==============================================================================
524
525libreftest = """
526Example from the Library Reference: Doc/lib/libcollections.tex
527
528>>> from collections import deque
529>>> d = deque('ghi') # make a new deque with three items
530>>> for elem in d: # iterate over the deque's elements
531... print elem.upper()
532G
533H
534I
535>>> d.append('j') # add a new entry to the right side
536>>> d.appendleft('f') # add a new entry to the left side
537>>> d # show the representation of the deque
538deque(['f', 'g', 'h', 'i', 'j'])
539>>> d.pop() # return and remove the rightmost item
540'j'
541>>> d.popleft() # return and remove the leftmost item
542'f'
543>>> list(d) # list the contents of the deque
544['g', 'h', 'i']
545>>> d[0] # peek at leftmost item
546'g'
547>>> d[-1] # peek at rightmost item
548'i'
549>>> list(reversed(d)) # list the contents of a deque in reverse
550['i', 'h', 'g']
551>>> 'h' in d # search the deque
552True
553>>> d.extend('jkl') # add multiple elements at once
554>>> d
555deque(['g', 'h', 'i', 'j', 'k', 'l'])
556>>> d.rotate(1) # right rotation
557>>> d
558deque(['l', 'g', 'h', 'i', 'j', 'k'])
559>>> d.rotate(-1) # left rotation
560>>> d
561deque(['g', 'h', 'i', 'j', 'k', 'l'])
562>>> deque(reversed(d)) # make a new deque in reverse order
563deque(['l', 'k', 'j', 'i', 'h', 'g'])
564>>> d.clear() # empty the deque
565>>> d.pop() # cannot pop from an empty deque
566Traceback (most recent call last):
567 File "<pyshell#6>", line 1, in -toplevel-
568 d.pop()
569IndexError: pop from an empty deque
570
571>>> d.extendleft('abc') # extendleft() reverses the input order
572>>> d
573deque(['c', 'b', 'a'])
574
575
576
577>>> def delete_nth(d, n):
578... d.rotate(-n)
579... d.popleft()
580... d.rotate(n)
581...
582>>> d = deque('abcdef')
583>>> delete_nth(d, 2) # remove the entry at d[2]
584>>> d
585deque(['a', 'b', 'd', 'e', 'f'])
586
587
588
589>>> def roundrobin(*iterables):
590... pending = deque(iter(i) for i in iterables)
591... while pending:
592... task = pending.popleft()
593... try:
594... yield task.next()
595... except StopIteration:
596... continue
597... pending.append(task)
598...
599
600>>> for value in roundrobin('abc', 'd', 'efgh'):
601... print value
602...
603a
604d
605e
606b
607f
608c
609g
610h
611
612
613>>> def maketree(iterable):
614... d = deque(iterable)
615... while len(d) > 1:
616... pair = [d.popleft(), d.popleft()]
617... d.append(pair)
618... return list(d)
619...
620>>> print maketree('abcdefgh')
621[[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]]
622
623"""
624
625
626#==============================================================================
627
628__test__ = {'libreftest' : libreftest}
629
630def test_main(verbose=None):
631 import sys
632 test_classes = (
633 TestBasic,
634 TestVariousIteratorArgs,
635 TestSubclass,
636 )
637
638 test_support.run_unittest(*test_classes)
639
640 # verify reference counting
641 if verbose and hasattr(sys, "gettotalrefcount"):
642 import gc
643 counts = [None] * 5
644 for i in xrange(len(counts)):
645 test_support.run_unittest(*test_classes)
646 gc.collect()
647 counts[i] = sys.gettotalrefcount()
648 print counts
649
650 # doctests
651 from test import test_deque
652 test_support.run_doctest(test_deque, verbose)
653
654if __name__ == "__main__":
655 test_main(verbose=True)