[Zope-Checkins] CVS: Zope/lib/python/ZTUtils/tests - testIterator.py:1.4.4.1

Chris McDonough chrism@zope.com
Sat, 26 Oct 2002 15:52:22 -0400


Update of /cvs-repository/Zope/lib/python/ZTUtils/tests
In directory cvs.zope.org:/tmp/cvs-serv31373/lib/python/ZTUtils/tests

Modified Files:
      Tag: chrism-install-branch
	testIterator.py 
Log Message:
Merge with HEAD.  Again, sorry for the spew (what's left of it... someone seems to have filtered some of this branch's checkins out).


=== Zope/lib/python/ZTUtils/tests/testIterator.py 1.4 => 1.4.4.1 ===
--- Zope/lib/python/ZTUtils/tests/testIterator.py:1.4	Wed Aug 14 18:10:12 2002
+++ Zope/lib/python/ZTUtils/tests/testIterator.py	Sat Oct 26 15:51:51 2002
@@ -1,3 +1,4 @@
+from __future__ import generators
 import os, sys, unittest
 
 from ZTUtils import Iterator
@@ -8,6 +9,26 @@
 except NameError:
     do_piter_test = 0
 
+class itemIterator:
+    'Ignore the __getitem__ argument in order to catch non-monotonic access.'
+    def __init__(self, n):
+        self.n = n
+        self.i = 0
+    def __getitem__(self, i):
+        if self.i >= self.n:
+            raise IndexError
+        i = self.i
+        self.i = self.i + 1
+        return i
+
+class genIterator:
+    'Generator-based iteration'
+    def __init__(self, n):
+        self.n = n
+    def __iter__(self):
+      for i in range(self.n):
+        yield i
+
 class IteratorTests(unittest.TestCase):
 
     def testIterator0(self):
@@ -48,13 +69,20 @@
                     assert not it.end, (
                         "End false on element %s of %s" % (el, size))
 
-    def testIndex(self):
-        it = Iterator(range(5))
-        for el in range(5):
+    def assertRangeMatch(self, ob, n):
+        it = Iterator(ob)
+        for el in range(n):
             assert it.next(), "Iterator stopped too soon"
             assert it.index == el, "Incorrect index"
             assert it.number() == el + 1, "Incorrect number"
             assert it.item == el, "Incorrect item"
+
+    def testIndex(self):
+        self.assertRangeMatch(range(5), 5)
+        self.assertRangeMatch((0,1,2,3,4), 5)
+        self.assertRangeMatch({0:0, 1:1, 2:2, 3:3, 4:4}, 5)
+        self.assertRangeMatch(itemIterator(5), 5)
+        self.assertRangeMatch(genIterator(5), 5)
 
     def testFirstLast(self):
         it = Iterator([1])