[pypy-svn] r56451 - in pypy/dist/pypy/module/itertools: . test

adurdin at codespeak.net adurdin at codespeak.net
Fri Jul 11 16:11:58 CEST 2008


Author: adurdin
Date: Fri Jul 11 16:11:57 2008
New Revision: 56451

Modified:
   pypy/dist/pypy/module/itertools/interp_itertools.py
   pypy/dist/pypy/module/itertools/test/test_itertools.py
Log:
(adurdin, jlg) tidying tests for interp_itertools


Modified: pypy/dist/pypy/module/itertools/interp_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/interp_itertools.py	(original)
+++ pypy/dist/pypy/module/itertools/interp_itertools.py	Fri Jul 11 16:11:57 2008
@@ -551,6 +551,9 @@
         self.saved_iterator = None
         self.exhausted = False
 
+    def iter_w(self):
+        return self.space.wrap(self)
+
     def next_w(self):
         if self.exhausted:
             if not self.saved_w:
@@ -582,5 +585,21 @@
 W_Cycle.typedef = TypeDef(
         'cycle',
         __new__  = interp2app(W_Cycle___new__, unwrap_spec=[ObjSpace, W_Root, W_Root]),
-        next     = interp2app(W_Cycle.next_w, unwrap_spec=['self']))
+        __iter__ = interp2app(W_Cycle.iter_w, unwrap_spec=['self']),
+        next     = interp2app(W_Cycle.next_w, unwrap_spec=['self']),
+        __doc__  = """Make an iterator returning elements from the iterable and
+    saving a copy of each. When the iterable is exhausted, return
+    elements from the saved copy. Repeats indefinitely.
+    
+    Equivalent to :
+    
+    def cycle(iterable):
+        saved = []
+        for element in iterable:
+            yield element
+            saved.append(element)
+        while saved:
+            for element in saved:
+                yield element    
+    """)
 W_Cycle.typedef.acceptable_as_base_class = False

Modified: pypy/dist/pypy/module/itertools/test/test_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/test/test_itertools.py	(original)
+++ pypy/dist/pypy/module/itertools/test/test_itertools.py	Fri Jul 11 16:11:57 2008
@@ -4,28 +4,6 @@
     def setup_class(cls):
         cls.space = gettestobjspace(usemodules=['itertools'])
 
-    def test_iterables(self):
-        import itertools
-
-        iterables = [
-            itertools.count(),
-            itertools.repeat(None),
-            itertools.takewhile(bool, []),
-            itertools.dropwhile(bool, []),
-            itertools.ifilter(None, []),
-            itertools.ifilterfalse(None, []),
-            itertools.islice([], 0),
-            itertools.chain(),
-            itertools.imap(None),
-            itertools.izip(),
-            ]
-
-        for it in iterables:
-            assert hasattr(it, '__iter__')
-            assert iter(it) is it
-            assert hasattr(it, 'next')
-            assert callable(it.next)
-
     def test_count(self):
         import itertools
 
@@ -378,40 +356,65 @@
         for x in [1, 2, 3, 1, 2, 3, 1, 2, 3]:
             assert it.next() == x
 
-
+    
+    def test_iterables(self):
+        import itertools
+    
+        iterables = [
+            itertools.chain(),
+            itertools.count(),
+            itertools.cycle([]),
+            itertools.dropwhile(bool, []),
+            itertools.ifilter(None, []),
+            itertools.ifilterfalse(None, []),
+            itertools.imap(None),
+            itertools.islice([], 0),
+            itertools.izip(),
+            itertools.repeat(None),
+            itertools.takewhile(bool, []),
+            ]
+    
+        for it in iterables:
+            assert hasattr(it, '__iter__')
+            assert iter(it) is it
+            assert hasattr(it, 'next')
+            assert callable(it.next)
+    
     def test_docstrings(self):
         import itertools
         
         assert itertools.__doc__
         methods = [
+            itertools.chain,
             itertools.count,
-            itertools.repeat,
-            itertools.takewhile,
+            itertools.cycle,
             itertools.dropwhile,
             itertools.ifilter,
             itertools.ifilterfalse,
-            itertools.islice,
-            itertools.chain,
             itertools.imap,
+            itertools.islice,
             itertools.izip,
+            itertools.repeat,
+            itertools.takewhile,
             ]
         for method in methods:
             assert method.__doc__
-
+    
     def test_subclassing(self):
         import itertools
-        # not sure how useful this actually is, but CPython implements it
+        # Although implemented as classes, the itertools functions should not be subclassable
         iterables = [
+            (itertools.chain, ()),
             (itertools.count, ()),
-            (itertools.repeat, (None,)),
-            (itertools.takewhile, (bool, [])),
+            (itertools.cycle, ()),
             (itertools.dropwhile, (bool, [])),
             (itertools.ifilter, (None, [])),
             (itertools.ifilterfalse, (None, [])),
-            (itertools.islice, ([], 0)),
-            (itertools.chain, ()),
             (itertools.imap, (None,)),
+            (itertools.islice, ([], 0)),
             (itertools.izip, ()),
+            (itertools.repeat, (None,)),
+            (itertools.takewhile, (bool, [])),
             ]
         for cls, args in iterables:
             try:
@@ -421,4 +424,4 @@
                 pass
             else:
                 assert False, "Subclassing should fail."
-
+    



More information about the Pypy-commit mailing list