Bugfix: ignore blank lines in test for end of code block
[pylit.git] / rstdocs / examples / iterqueue_test.py
blob1da7d0fb0574bd64d730c33ab8f686a9a1fb851c
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
4 # iterqueue_test.py
5 # *****************
6 # Test the iterator wrappers from iterqueue.py
7 # ============================================
8 #
9 # .. contents::
11 # ::
13 import sys, itertools
14 import iterqueue
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)]
29 # print "Peekables"
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)]
35 # print "Pushables"
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)
51 # Test Wrappers
52 # -------------
54 # Test the basic iterator features of an iterator wrapper. ::
56 class Test_Wrappers:
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
61 """
62 print wrapper
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
71 # Test Peekables
72 # --------------
74 # ::
76 class Test_Peekables:
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"""
80 print wrapper
81 print wrapper.peek
82 it = wrapper(base)
83 it.peek()
84 first = it.peek()
85 print first
86 assert first == 0
87 # peek() must not "use up" values
88 result = list(it)
89 print result
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
97 # Test Pushables
98 # --------------
100 # ::
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"""
107 print wrapper.push
108 it = wrapper(base)
109 it.push(9)
110 result = list(it)
111 print result
112 assert result == [9] + list(base)
114 def push_while_iterating_ok(self, wrapper):
115 """push shall work even in an iteration loop"""
116 print wrapper
117 it = wrapper(xrange(3))
118 result = []
119 for i in it:
120 if i == 1:
121 it.push("xx")
122 result.append(i)
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 # -------------------
137 # ::
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"""
144 print wrapper
145 it = wrapper(base)
146 it.extend([9])
147 assert list(it) == list(base) + [9]
149 def extendleft_ok(self, wrapper, base):
150 """extendleft(iterable) shall prepend `iterable` to iterator"""
151 print wrapper
152 it = wrapper(base)
153 it.extendleft([9])
154 result = [i for i in it]
155 print result
156 assert result == [9] + list(base)
158 def append_ok(self, wrapper, base):
159 """append(value) shall append `value` to iterator"""
160 print wrapper
161 it = wrapper(base)
162 it.append(9)
163 result = list(it)
164 print result
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 # --------------------
178 # ::
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!
188 it0 = wrapper([])
189 assert bool(it0) == False
190 assert list(it0) == []
191 it1 = wrapper(base)
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__":
204 import nose
205 # this doesnot show any effect :-(
206 nose.configure(["test.py", "--detailed-errors"])
207 nose.runmodule() # requires nose 0.9.1