[pypy-svn] r58963 - in pypy/branch/2.5-merge/pypy/lib: . app_test

arigo at codespeak.net arigo at codespeak.net
Sat Oct 11 13:27:38 CEST 2008


Author: arigo
Date: Sat Oct 11 13:27:36 2008
New Revision: 58963

Modified:
   pypy/branch/2.5-merge/pypy/lib/app_test/test_deque_extra.py
   pypy/branch/2.5-merge/pypy/lib/collections.py
Log:
(antocuni, arigo)
Fix CPython's test_deque.


Modified: pypy/branch/2.5-merge/pypy/lib/app_test/test_deque_extra.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/lib/app_test/test_deque_extra.py	(original)
+++ pypy/branch/2.5-merge/pypy/lib/app_test/test_deque_extra.py	Sat Oct 11 13:27:36 2008
@@ -11,6 +11,7 @@
     def setup_method(self,method):
         
         from pypy.lib.collections import deque
+        self.deque = deque
         self.d = deque(range(n))
         
     def test_deque(self):
@@ -24,24 +25,35 @@
             
     def test_deque_iter(self):
         it = iter(self.d)
-        assert len(it) == n
+        raises(TypeError, len, it)
         assert it.next() == 0
-        assert len(it) == n-1
         self.d.pop()
-        raises(RuntimeError,it.next)
-        assert len(it) == 0
-        assert list(it) == []
-        
+        raises(RuntimeError, it.next)
+
     def test_deque_reversed(self):
         it = reversed(self.d)
-        assert len(it) == n
+        raises(TypeError, len, it)
         assert it.next() == n-1
-        assert len(it) == n-1
         assert it.next() == n-2
-        assert len(it) == n-2
         self.d.pop()
-        raises(RuntimeError,it.next)
-        assert len(it) == 0
-        assert list(it) == []
+        raises(RuntimeError, it.next)
+
+    def test_deque_remove(self):
+        d = self.d
+        raises(ValueError, d.remove, "foobar")
+
+    def test_mutate_during_remove(self):
+        # Handle evil mutator
+        class MutateCmp:
+            def __init__(self, deque, result):
+                self.deque = deque
+                self.result = result
+            def __eq__(self, other):
+                self.deque.clear()
+                return self.result
 
-    
+        for match in (True, False):
+            d = self.deque(['ab'])
+            d.extend([MutateCmp(d, match), 'c'])
+            raises(IndexError, d.remove, 'c')
+            assert len(d) == 0

Modified: pypy/branch/2.5-merge/pypy/lib/collections.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/lib/collections.py	(original)
+++ pypy/branch/2.5-merge/pypy/lib/collections.py	Sat Oct 11 13:27:36 2008
@@ -113,15 +113,10 @@
 
     def remove(self, value):
         # Need to be defensive for mutating comparisons
-        i = 0
-        while i < len(self):
+        for i in range(len(self)):
             if self[i] == value:
-                if i < len(self):
-                    del self[i]
-                    return
-                else:
-                    raise IndexError("deque mutated during remove()")
-            i += 1
+                del self[i]
+                return
         raise ValueError("deque.remove(x): x not in deque")
 
     def rotate(self, n=1):
@@ -316,9 +311,6 @@
     def __iter__(self):
         return self
 
-    def __len__(self):
-        return self.counter
-
 class defaultdict(dict):
     
     def __init__(self, *args, **kwds):



More information about the Pypy-commit mailing list