Prepare for Github,
[pylit.git] / doc / examples / iterqueue_test.py.txt
blob6cdf19de8a99df55265319222f4d9cff01aeb108
1 ..  #!/usr/bin/env python
2   # -*- coding: utf8 -*-
3   
4 iterqueue_test.py
5 *****************
6 Test the iterator wrappers from iterqueue.py
7 ============================================
9 .. contents::
13   import sys, itertools
14   import iterqueue
15   from iterqueue import *
16   
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)
25   
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)
31   
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)
37   
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)
43   
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)
49   
50   
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]
65       
66       def test_wrappers(self, base=xrange(3)):
67           for wrapper in wrappers:
68               yield self.wrap_ok, wrapper, base
69   
70   
71 Test Peekables
72 --------------
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)
91       
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
96   
97 Test Pushables
98 --------------
101       
102   class Test_Pushables:    
103       """Test the push method of iterator wrappers"""
104   
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)
113           
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]  
124   
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
132   
133   
134 Test Iterator Queue
135 -------------------
138    
139   class TestIteratorQueue:
140       """Test the queueing methods of iterator queues"""
141       #
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]
148       
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)
157           
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]
166   
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
173   
174   
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
186              """
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
196   
197       def test_iqueues(self):
198           """Test generator for iterator-queue wrappers"""
199           for wrapper in state_reporters:
200               yield self.bool_ok, wrapper
201   
202   
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