]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_deque.py
1 from collections
import deque
3 from test
import test_support
, seq_tests
7 import cPickle
as pickle
17 def __eq__(self
, other
):
21 def __init__(self
, deque
, result
):
24 def __eq__(self
, other
):
28 class TestBasic(unittest
.TestCase
):
30 def test_basics(self
):
31 d
= deque(xrange(-5125, -5000))
32 d
.__init
__(xrange(200))
33 for i
in xrange(200, 400):
35 for i
in reversed(xrange(-200, 0)):
37 self
.assertEqual(list(d
), range(-200, 400))
38 self
.assertEqual(len(d
), 600)
40 left
= [d
.popleft() for i
in xrange(250)]
41 self
.assertEqual(left
, range(-200, 50))
42 self
.assertEqual(list(d
), range(50, 400))
44 right
= [d
.pop() for i
in xrange(250)]
46 self
.assertEqual(right
, range(150, 400))
47 self
.assertEqual(list(d
), range(50, 150))
49 def test_maxlen(self
):
50 self
.assertRaises(ValueError, deque
, 'abc', -1)
51 self
.assertRaises(ValueError, deque
, 'abc', -2)
53 d
= deque(it
, maxlen
=3)
54 self
.assertEqual(list(it
), [])
55 self
.assertEqual(repr(d
), 'deque([7, 8, 9], maxlen=3)')
56 self
.assertEqual(list(d
), range(7, 10))
57 self
.assertEqual(d
, deque(range(10), 3))
59 self
.assertEqual(list(d
), range(8, 11))
61 self
.assertEqual(list(d
), range(7, 10))
63 self
.assertEqual(list(d
), range(9, 12))
65 self
.assertEqual(list(d
), range(7, 10))
66 d
= deque(xrange(200), maxlen
=10)
68 test_support
.unlink(test_support
.TESTFN
)
69 fo
= open(test_support
.TESTFN
, "wb")
73 fo
= open(test_support
.TESTFN
, "rb")
74 self
.assertEqual(fo
.read(), repr(d
))
77 test_support
.unlink(test_support
.TESTFN
)
79 d
= deque(range(10), maxlen
=None)
80 self
.assertEqual(repr(d
), 'deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])')
81 fo
= open(test_support
.TESTFN
, "wb")
85 fo
= open(test_support
.TESTFN
, "rb")
86 self
.assertEqual(fo
.read(), repr(d
))
89 test_support
.unlink(test_support
.TESTFN
)
91 def test_maxlen_zero(self
):
94 self
.assertEqual(list(it
), [])
99 self
.assertEqual(list(it
), [])
101 it
= iter(range(100))
104 self
.assertEqual(list(it
), [])
106 def test_maxlen_attribute(self
):
107 self
.assertEqual(deque().maxlen
, None)
108 self
.assertEqual(deque('abc').maxlen
, None)
109 self
.assertEqual(deque('abc', maxlen
=4).maxlen
, 4)
110 self
.assertEqual(deque('abc', maxlen
=2).maxlen
, 2)
111 self
.assertEqual(deque('abc', maxlen
=0).maxlen
, 0)
112 with self
.assertRaises(AttributeError):
116 def test_count(self
):
117 for s
in ('', 'abracadabra', 'simsalabim'*500+'abc'):
120 for letter
in 'abcdefghijklmnopqrstuvwxyz':
121 self
.assertEqual(s
.count(letter
), d
.count(letter
), (s
, d
, letter
))
122 self
.assertRaises(TypeError, d
.count
) # too few args
123 self
.assertRaises(TypeError, d
.count
, 1, 2) # too many args
125 def __eq__(self
, other
):
126 raise ArithmeticError
127 d
= deque([1, 2, BadCompare(), 3])
128 self
.assertRaises(ArithmeticError, d
.count
, 2)
130 self
.assertRaises(ArithmeticError, d
.count
, BadCompare())
131 class MutatingCompare
:
132 def __eq__(self
, other
):
135 m
= MutatingCompare()
136 d
= deque([1, 2, 3, m
, 4, 5])
138 self
.assertRaises(RuntimeError, d
.count
, 3)
141 # block advance failed after rotation aligned elements on right side of block
143 for i
in range(len(d
)):
146 self
.assertEqual(d
.count(1), 0)
147 self
.assertEqual(d
.count(None), 16)
149 def test_comparisons(self
):
150 d
= deque('xabc'); d
.popleft()
151 for e
in [d
, deque('abc'), deque('ab'), deque(), list(d
)]:
152 self
.assertEqual(d
==e
, type(d
)==type(e
) and list(d
)==list(e
))
153 self
.assertEqual(d
!=e
, not(type(d
)==type(e
) and list(d
)==list(e
)))
155 args
= map(deque
, ('', 'a', 'b', 'ab', 'ba', 'abc', 'xba', 'xabc', 'cba'))
158 self
.assertEqual(x
== y
, list(x
) == list(y
), (x
,y
))
159 self
.assertEqual(x
!= y
, list(x
) != list(y
), (x
,y
))
160 self
.assertEqual(x
< y
, list(x
) < list(y
), (x
,y
))
161 self
.assertEqual(x
<= y
, list(x
) <= list(y
), (x
,y
))
162 self
.assertEqual(x
> y
, list(x
) > list(y
), (x
,y
))
163 self
.assertEqual(x
>= y
, list(x
) >= list(y
), (x
,y
))
164 self
.assertEqual(cmp(x
,y
), cmp(list(x
),list(y
)), (x
,y
))
166 def test_extend(self
):
168 self
.assertRaises(TypeError, d
.extend
, 1)
170 self
.assertEqual(list(d
), list('abcd'))
172 self
.assertEqual(list(d
), list('abcdabcd'))
177 self
.assertEqual(list(d
), list('abcd'))
179 self
.assertEqual(list(d
), list('abcdabcd'))
181 def test_extendleft(self
):
183 self
.assertRaises(TypeError, d
.extendleft
, 1)
185 self
.assertEqual(list(d
), list(reversed('abcd')))
187 self
.assertEqual(list(d
), list('abcddcba'))
189 d
.extendleft(range(1000))
190 self
.assertEqual(list(d
), list(reversed(range(1000))))
191 self
.assertRaises(SyntaxError, d
.extendleft
, fail())
193 def test_getitem(self
):
200 if random
.random() < 0.5:
203 for j
in xrange(1-len(l
), len(l
)):
206 d
= deque('superman')
207 self
.assertEqual(d
[0], 's')
208 self
.assertEqual(d
[-1], 'n')
210 self
.assertRaises(IndexError, d
.__getitem
__, 0)
211 self
.assertRaises(IndexError, d
.__getitem
__, -1)
213 def test_setitem(self
):
218 self
.assertEqual(list(d
), [10*i
for i
in xrange(n
)])
220 for i
in xrange(1-n
, 0, -1):
223 self
.assertEqual(list(d
), l
)
225 def test_delitem(self
):
226 n
= 500 # O(n**2) test, don't make this too big
228 self
.assertRaises(IndexError, d
.__delitem
__, -n
-1)
229 self
.assertRaises(IndexError, d
.__delitem
__, n
)
231 self
.assertEqual(len(d
), n
-i
)
232 j
= random
.randrange(-len(d
), len(d
))
234 self
.assertIn(val
, d
)
236 self
.assertNotIn(val
, d
)
237 self
.assertEqual(len(d
), 0)
239 def test_reverse(self
):
240 n
= 500 # O(n**2) test, don't make this too big
241 data
= [random
.random() for i
in range(n
)]
245 self
.assertEqual(list(d
), list(reversed(data
[:i
])))
246 self
.assertIs(r
, None)
248 self
.assertEqual(list(d
), data
[:i
])
249 self
.assertRaises(TypeError, d
.reverse
, 1) # Arity is zero
251 def test_rotate(self
):
256 d
.rotate(1) # verify rot(1)
257 self
.assertEqual(''.join(d
), 'eabcd')
260 d
.rotate(-1) # verify rot(-1)
261 self
.assertEqual(''.join(d
), 'bcdea')
262 d
.rotate() # check default to 1
263 self
.assertEqual(tuple(d
), s
)
265 for i
in xrange(n
*3):
268 d
.rotate(i
) # check vs. rot(1) n times
271 self
.assertEqual(tuple(d
), tuple(e
))
272 d
.rotate(-i
) # check that it works in reverse
273 self
.assertEqual(tuple(d
), s
)
274 e
.rotate(n
-i
) # check that it wraps forward
275 self
.assertEqual(tuple(e
), s
)
277 for i
in xrange(n
*3):
282 e
.rotate(-1) # check vs. rot(-1) n times
283 self
.assertEqual(tuple(d
), tuple(e
))
284 d
.rotate(i
) # check that it works in reverse
285 self
.assertEqual(tuple(d
), s
)
286 e
.rotate(i
-n
) # check that it wraps backaround
287 self
.assertEqual(tuple(e
), s
)
291 e
.rotate(BIG
+17) # verify on long series of rotates
293 for i
in xrange(BIG
+17):
295 self
.assertEqual(tuple(d
), tuple(e
))
297 self
.assertRaises(TypeError, d
.rotate
, 'x') # Wrong arg type
298 self
.assertRaises(TypeError, d
.rotate
, 1, 10) # Too many args
301 d
.rotate() # rotate an empty deque
302 self
.assertEqual(d
, deque())
306 self
.assertEqual(len(d
), 2)
308 self
.assertEqual(len(d
), 1)
310 self
.assertEqual(len(d
), 0)
311 self
.assertRaises(IndexError, d
.pop
)
312 self
.assertEqual(len(d
), 0)
314 self
.assertEqual(len(d
), 1)
316 self
.assertEqual(len(d
), 2)
318 self
.assertEqual(len(d
), 0)
320 def test_underflow(self
):
322 self
.assertRaises(IndexError, d
.pop
)
323 self
.assertRaises(IndexError, d
.popleft
)
325 def test_clear(self
):
326 d
= deque(xrange(100))
327 self
.assertEqual(len(d
), 100)
329 self
.assertEqual(len(d
), 0)
330 self
.assertEqual(list(d
), [])
331 d
.clear() # clear an emtpy deque
332 self
.assertEqual(list(d
), [])
334 def test_remove(self
):
335 d
= deque('abcdefghcij')
337 self
.assertEqual(d
, deque('abdefghcij'))
339 self
.assertEqual(d
, deque('abdefghij'))
340 self
.assertRaises(ValueError, d
.remove
, 'c')
341 self
.assertEqual(d
, deque('abdefghij'))
343 # Handle comparison errors
344 d
= deque(['a', 'b', BadCmp(), 'c'])
346 self
.assertRaises(RuntimeError, d
.remove
, 'c')
347 for x
, y
in zip(d
, e
):
348 # verify that original order and values are retained.
349 self
.assertTrue(x
is y
)
351 # Handle evil mutator
352 for match
in (True, False):
354 d
.extend([MutateCmp(d
, match
), 'c'])
355 self
.assertRaises(IndexError, d
.remove
, 'c')
356 self
.assertEqual(d
, deque())
359 d
= deque(xrange(200))
361 self
.assertEqual(list(d
), list(e
))
363 self
.assertIn('...', repr(d
))
365 def test_print(self
):
366 d
= deque(xrange(200))
368 test_support
.unlink(test_support
.TESTFN
)
369 fo
= open(test_support
.TESTFN
, "wb")
373 fo
= open(test_support
.TESTFN
, "rb")
374 self
.assertEqual(fo
.read(), repr(d
))
377 test_support
.unlink(test_support
.TESTFN
)
380 self
.assertRaises(TypeError, deque
, 'abc', 2, 3);
381 self
.assertRaises(TypeError, deque
, 1);
384 self
.assertRaises(TypeError, hash, deque('abc'))
386 def test_long_steadystate_queue_popleft(self
):
387 for size
in (0, 1, 2, 100, 1000):
388 d
= deque(xrange(size
))
389 append
, pop
= d
.append
, d
.popleft
390 for i
in xrange(size
, BIG
):
394 self
.assertEqual(x
, i
-size
)
395 self
.assertEqual(list(d
), range(BIG
-size
, BIG
))
397 def test_long_steadystate_queue_popright(self
):
398 for size
in (0, 1, 2, 100, 1000):
399 d
= deque(reversed(xrange(size
)))
400 append
, pop
= d
.appendleft
, d
.pop
401 for i
in xrange(size
, BIG
):
405 self
.assertEqual(x
, i
-size
)
406 self
.assertEqual(list(reversed(list(d
))), range(BIG
-size
, BIG
))
408 def test_big_queue_popleft(self
):
411 append
, pop
= d
.append
, d
.popleft
412 for i
in xrange(BIG
):
414 for i
in xrange(BIG
):
417 self
.assertEqual(x
, i
)
419 def test_big_queue_popright(self
):
421 append
, pop
= d
.appendleft
, d
.pop
422 for i
in xrange(BIG
):
424 for i
in xrange(BIG
):
427 self
.assertEqual(x
, i
)
429 def test_big_stack_right(self
):
431 append
, pop
= d
.append
, d
.pop
432 for i
in xrange(BIG
):
434 for i
in reversed(xrange(BIG
)):
437 self
.assertEqual(x
, i
)
438 self
.assertEqual(len(d
), 0)
440 def test_big_stack_left(self
):
442 append
, pop
= d
.appendleft
, d
.popleft
443 for i
in xrange(BIG
):
445 for i
in reversed(xrange(BIG
)):
448 self
.assertEqual(x
, i
)
449 self
.assertEqual(len(d
), 0)
451 def test_roundtrip_iter_init(self
):
452 d
= deque(xrange(200))
454 self
.assertNotEqual(id(d
), id(e
))
455 self
.assertEqual(list(d
), list(e
))
457 def test_pickle(self
):
458 d
= deque(xrange(200))
459 for i
in range(pickle
.HIGHEST_PROTOCOL
+ 1):
460 s
= pickle
.dumps(d
, i
)
462 self
.assertNotEqual(id(d
), id(e
))
463 self
.assertEqual(list(d
), list(e
))
465 ## def test_pickle_recursive(self):
468 ## for i in range(pickle.HIGHEST_PROTOCOL + 1):
469 ## e = pickle.loads(pickle.dumps(d, i))
470 ## self.assertNotEqual(id(d), id(e))
471 ## self.assertEqual(id(e), id(e[-1]))
473 def test_deepcopy(self
):
477 self
.assertEqual(list(d
), list(e
))
479 self
.assertNotEqual(id(d
), id(e
))
480 self
.assertNotEqual(list(d
), list(e
))
486 self
.assertEqual(list(d
), list(e
))
488 self
.assertNotEqual(id(d
), id(e
))
489 self
.assertEqual(list(d
), list(e
))
491 def test_reversed(self
):
492 for s
in ('abcd', xrange(2000)):
493 self
.assertEqual(list(reversed(deque(s
))), list(reversed(s
)))
495 def test_gc_doesnt_blowup(self
):
497 # This used to assert-fail in deque_traverse() under a debug
498 # build, or run wild with a NULL pointer in a release build.
500 for i
in xrange(100):
504 def test_container_iterator(self
):
505 # Bug #3680: tp_traverse was not implemented for deque iterator objects
510 ref
= weakref
.ref(obj
)
512 container
= deque([obj
, 1])
514 container
= reversed(deque([obj
, 1]))
515 obj
.x
= iter(container
)
518 self
.assertTrue(ref() is None, "Cycle was not collected")
520 class TestVariousIteratorArgs(unittest
.TestCase
):
522 def test_constructor(self
):
523 for s
in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
524 for g
in (seq_tests
.Sequence
, seq_tests
.IterFunc
,
525 seq_tests
.IterGen
, seq_tests
.IterFuncStop
,
526 seq_tests
.itermulti
, seq_tests
.iterfunc
):
527 self
.assertEqual(list(deque(g(s
))), list(g(s
)))
528 self
.assertRaises(TypeError, deque
, seq_tests
.IterNextOnly(s
))
529 self
.assertRaises(TypeError, deque
, seq_tests
.IterNoNext(s
))
530 self
.assertRaises(ZeroDivisionError, deque
, seq_tests
.IterGenExc(s
))
532 def test_iter_with_altered_data(self
):
536 self
.assertRaises(RuntimeError, it
.next
)
538 def test_runtime_error_on_empty_deque(self
):
542 self
.assertRaises(RuntimeError, it
.next
)
547 class DequeWithBadIter(deque
):
551 class TestSubclass(unittest
.TestCase
):
553 def test_basics(self
):
554 d
= Deque(xrange(25))
555 d
.__init
__(xrange(200))
556 for i
in xrange(200, 400):
558 for i
in reversed(xrange(-200, 0)):
560 self
.assertEqual(list(d
), range(-200, 400))
561 self
.assertEqual(len(d
), 600)
563 left
= [d
.popleft() for i
in xrange(250)]
564 self
.assertEqual(left
, range(-200, 50))
565 self
.assertEqual(list(d
), range(50, 400))
567 right
= [d
.pop() for i
in xrange(250)]
569 self
.assertEqual(right
, range(150, 400))
570 self
.assertEqual(list(d
), range(50, 150))
573 self
.assertEqual(len(d
), 0)
575 def test_copy_pickle(self
):
580 self
.assertEqual(type(d
), type(e
))
581 self
.assertEqual(list(d
), list(e
))
584 self
.assertEqual(type(d
), type(e
))
585 self
.assertEqual(list(d
), list(e
))
589 self
.assertNotEqual(id(d
), id(e
))
590 self
.assertEqual(type(d
), type(e
))
591 self
.assertEqual(list(d
), list(e
))
593 d
= Deque('abcde', maxlen
=4)
596 self
.assertEqual(type(d
), type(e
))
597 self
.assertEqual(list(d
), list(e
))
600 self
.assertEqual(type(d
), type(e
))
601 self
.assertEqual(list(d
), list(e
))
605 self
.assertNotEqual(id(d
), id(e
))
606 self
.assertEqual(type(d
), type(e
))
607 self
.assertEqual(list(d
), list(e
))
609 ## def test_pickle(self):
613 ## e = pickle.loads(pickle.dumps(d))
614 ## self.assertNotEqual(id(d), id(e))
615 ## self.assertEqual(type(d), type(e))
618 ## self.assertEqual(id(e), id(ee))
619 ## self.assertEqual(d, e)
622 ## e = pickle.loads(pickle.dumps(d))
623 ## self.assertEqual(id(e), id(e.x))
625 ## d = DequeWithBadIter('abc')
626 ## self.assertRaises(TypeError, pickle.dumps, d)
628 def test_weakref(self
):
629 d
= deque('gallahad')
631 self
.assertEqual(str(p
), str(d
))
633 self
.assertRaises(ReferenceError, str, p
)
635 def test_strange_subclass(self
):
641 d1
== d2
# not clear if this is supposed to be True or False,
642 # but it used to give a SystemError
645 class SubclassWithKwargs(deque
):
646 def __init__(self
, newarg
=1):
649 class TestSubclassWithKwargs(unittest
.TestCase
):
650 def test_subclass_with_kwargs(self
):
651 # SF bug #1486663 -- this used to erroneously raise a TypeError
652 SubclassWithKwargs(newarg
=1)
654 #==============================================================================
657 Example from the Library Reference: Doc/lib/libcollections.tex
659 >>> from collections import deque
660 >>> d = deque('ghi') # make a new deque with three items
661 >>> for elem in d: # iterate over the deque's elements
662 ... print elem.upper()
666 >>> d.append('j') # add a new entry to the right side
667 >>> d.appendleft('f') # add a new entry to the left side
668 >>> d # show the representation of the deque
669 deque(['f', 'g', 'h', 'i', 'j'])
670 >>> d.pop() # return and remove the rightmost item
672 >>> d.popleft() # return and remove the leftmost item
674 >>> list(d) # list the contents of the deque
676 >>> d[0] # peek at leftmost item
678 >>> d[-1] # peek at rightmost item
680 >>> list(reversed(d)) # list the contents of a deque in reverse
682 >>> 'h' in d # search the deque
684 >>> d.extend('jkl') # add multiple elements at once
686 deque(['g', 'h', 'i', 'j', 'k', 'l'])
687 >>> d.rotate(1) # right rotation
689 deque(['l', 'g', 'h', 'i', 'j', 'k'])
690 >>> d.rotate(-1) # left rotation
692 deque(['g', 'h', 'i', 'j', 'k', 'l'])
693 >>> deque(reversed(d)) # make a new deque in reverse order
694 deque(['l', 'k', 'j', 'i', 'h', 'g'])
695 >>> d.clear() # empty the deque
696 >>> d.pop() # cannot pop from an empty deque
697 Traceback (most recent call last):
698 File "<pyshell#6>", line 1, in -toplevel-
700 IndexError: pop from an empty deque
702 >>> d.extendleft('abc') # extendleft() reverses the input order
704 deque(['c', 'b', 'a'])
708 >>> def delete_nth(d, n):
713 >>> d = deque('abcdef')
714 >>> delete_nth(d, 2) # remove the entry at d[2]
716 deque(['a', 'b', 'd', 'e', 'f'])
720 >>> def roundrobin(*iterables):
721 ... pending = deque(iter(i) for i in iterables)
723 ... task = pending.popleft()
725 ... yield task.next()
726 ... except StopIteration:
728 ... pending.append(task)
731 >>> for value in roundrobin('abc', 'd', 'efgh'):
744 >>> def maketree(iterable):
745 ... d = deque(iterable)
746 ... while len(d) > 1:
747 ... pair = [d.popleft(), d.popleft()]
751 >>> print maketree('abcdefgh')
752 [[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]]
757 #==============================================================================
759 __test__
= {'libreftest' : libreftest
}
761 def test_main(verbose
=None):
765 TestVariousIteratorArgs
,
767 TestSubclassWithKwargs
,
770 test_support
.run_unittest(*test_classes
)
772 # verify reference counting
773 if verbose
and hasattr(sys
, "gettotalrefcount"):
776 for i
in xrange(len(counts
)):
777 test_support
.run_unittest(*test_classes
)
779 counts
[i
] = sys
.gettotalrefcount()
783 from test
import test_deque
784 test_support
.run_doctest(test_deque
, verbose
)
786 if __name__
== "__main__":
787 test_main(verbose
=True)