6 # Test the iterator wrappers from iterqueue.py
7 # ============================================
15 from iterqueue
import *
17 # Get and sort the wrapper classes
18 # --------------------------------
20 # List all iterator wrapper objects::
22 wrappers
= [obj
for obj
in iterqueue
.__dict
__.values()
23 if is_iterator_wrapper(obj
)]
24 # print "\n".join(repr(wrapper) for wrapper in wrappers)
26 # List iterator wrappers that provide a `peek` method::
28 peekables
= [obj
for obj
in wrappers
if is_peekable(obj
)]
30 # print "\n".join(repr(peekable) for peekable in peekables)
32 # List iterator wrappers that provide a `push` method::
34 pushables
= [obj
for obj
in wrappers
if is_pushable(obj
)]
36 # print "\n".join(repr(pushable) for pushable in pushables)
38 # List iterator wrappers that provide a test for "values available"::
40 state_reporters
= [obj
for obj
in wrappers
if is_state_reporting(obj
)]
41 # print "State Reporters"
42 # print "\n".join(repr(state_reporter) for state_reporter in state_reporters)
44 # List iterator wrappers that implement the "queue" methods::
46 iqueues
= [obj
for obj
in wrappers
if is_iterator_queue(obj
)]
47 # print "Iterator Queues"
48 # print "\n".join(repr(iqueue) for iqueue in iqueues)
54 # Test the basic iterator features of an iterator wrapper. ::
57 """Test the wrapping of iterator wrappers"""
58 def wrap_ok(self
, wrapper
, base
):
59 """iterating over the wrapper should return the same
60 as iterating over base
63 assert list(wrapper(base
)) == list(base
)
64 assert [i
for i
in wrapper(base
)] == [i
for i
in base
]
66 def test_wrappers(self
, base
=xrange(3)):
67 for wrapper
in wrappers
:
68 yield self
.wrap_ok
, wrapper
, base
77 """Test the peek method of iterator wrappers"""
78 def peek_ok(self
, wrapper
, base
):
79 """peek() should return next value but not advance the iterator"""
87 # peek() must not "use up" values
90 assert result
== list(base
)
92 def test_peekables(self
, base
=xrange(3)):
93 """Test generator for peekable iterator wrappers"""
94 for wrapper
in peekables
:
95 yield self
.peek_ok
, wrapper
, base
102 class Test_Pushables
:
103 """Test the push method of iterator wrappers"""
105 def push_ok(self
, wrapper
, base
):
106 """push(value) shall prepend `value` to iterator"""
112 assert result
== [9] + list(base
)
114 def push_while_iterating_ok(self
, wrapper
):
115 """push shall work even in an iteration loop"""
117 it
= wrapper(xrange(3))
123 assert result
== [0, 1, 'xx', 2]
125 def test_pushables(self
, base
=xrange(3)):
126 """Test generator for pushable iterator wrappers"""
127 for wrapper
in pushables
:
128 if not hasattr(wrapper
, "push"):
129 wrapper
.push
= wrapper
.appendleft
130 yield self
.push_ok
, wrapper
, base
131 yield self
.push_while_iterating_ok
, wrapper
134 # Test Iterator Queue
135 # -------------------
139 class TestIteratorQueue
:
140 """Test the queueing methods of iterator queues"""
142 def extend_ok(self
, wrapper
, base
):
143 """extend(iterable) shall append `iterable` to iterator"""
147 assert list(it
) == list(base
) + [9]
149 def extendleft_ok(self
, wrapper
, base
):
150 """extendleft(iterable) shall prepend `iterable` to iterator"""
154 result
= [i
for i
in it
]
156 assert result
== [9] + list(base
)
158 def append_ok(self
, wrapper
, base
):
159 """append(value) shall append `value` to iterator"""
165 assert result
== list(base
) + [9]
167 def test_iqueues(self
, base
=xrange(3)):
168 """Test generator for iterator-queue wrappers"""
169 for wrapper
in iqueues
:
170 yield self
.extend_ok
, wrapper
, base
171 yield self
.extendleft_ok
, wrapper
, base
172 yield self
.append_ok
, wrapper
, base
175 # Test State Reporters
176 # --------------------
180 class Test_StateReporters
:
181 """Test the state reporting when converted to bool"""
182 def bool_ok(self
, wrapper
):
183 """Empty iterator should evaluate to False
184 Non-empty iterator should evaluate to True
185 the evaluation should not advance the iterator
187 base
= xrange(3) # make sure it is not empty!
189 assert bool(it0
) == False
190 assert list(it0
) == []
192 assert bool(it1
) == True
193 assert list(it1
) == list(base
)
194 assert bool(wrapper(iter([]))) == False
195 assert bool(wrapper(iter([1]))) == True
197 def test_iqueues(self
):
198 """Test generator for iterator-queue wrappers"""
199 for wrapper
in state_reporters
:
200 yield self
.bool_ok
, wrapper
203 if __name__
== "__main__":
205 # this doesnot show any effect :-(
206 nose
.configure(["test.py", "--detailed-errors"])
207 nose
.runmodule() # requires nose 0.9.1