[pypy-svn] r58806 - in pypy/branch/2.5-merge: lib-python/modified-2.5.2/test pypy/objspace/std pypy/objspace/std/test

iko at codespeak.net iko at codespeak.net
Wed Oct 8 13:49:07 CEST 2008


Author: iko
Date: Wed Oct  8 13:49:06 2008
New Revision: 58806

Modified:
   pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py
   pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py
   pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py
   pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py
   pypy/branch/2.5-merge/pypy/objspace/std/objspace.py
   pypy/branch/2.5-merge/pypy/objspace/std/setobject.py
   pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py
   pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py
Log:
(iko,cfbolz)
Fix various bugs in set found by std lib tests
Be more careful when raising KeyErrors to prevent
normalization from breaking on tuples



Modified: pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py
==============================================================================
--- pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py	(original)
+++ pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py	Wed Oct  8 13:49:06 2008
@@ -278,6 +278,7 @@
             fo.close()
             os.remove(test_support.TESTFN)
 
+    @test_support.impl_detail
     def test_do_not_rehash_dict_keys(self):
         n = 10
         d = dict.fromkeys(map(HashCountingInt, xrange(n)))
@@ -514,6 +515,7 @@
         s.__init__(self.otherword)
         self.assertEqual(s, set(self.word))
 
+    @test_support.impl_detail
     def test_singleton_empty_frozenset(self):
         f = frozenset()
         efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
@@ -683,8 +685,12 @@
         for v in self.set:
             self.assert_(v in self.values)
         setiter = iter(self.set)
+
+    @test_support.impl_detail
+    def test__length_hint(self):
         # note: __length_hint__ is an internal undocumented API,
         # don't rely on it in your own programs
+        setiter = iter(self.set)
         self.assertEqual(setiter.__length_hint__(), len(self.set))
 
     def test_pickling(self):

Modified: pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py	Wed Oct  8 13:49:06 2008
@@ -1124,7 +1124,7 @@
     if w_missing_item is not None:
         return w_missing_item
 
-    raise OperationError(space.w_KeyError, w_lookup)
+    space.raise_key_error(w_lookup)
 
 def setitem__DictMulti_ANY_ANY(space, w_dict, w_newkey, w_newvalue):
     w_dict.implementation = w_dict.implementation.setitem(w_newkey, w_newvalue)
@@ -1133,7 +1133,7 @@
     try:
         w_dict.implementation = w_dict.implementation.delitem(w_lookup)
     except KeyError:
-        raise OperationError(space.w_KeyError, w_lookup)
+        space.raise_key_error(w_lookup)
     
 def len__DictMulti(space, w_dict):
     return space.wrap(w_dict.implementation.length())
@@ -1253,7 +1253,7 @@
         if len_defaults > 0:
             return defaults[0]
         else:
-            raise OperationError(space.w_KeyError, w_key)
+            space.raise_key_error(w_key)
     else:
         w_dict.implementation.delitem(w_key)
         return w_item

Modified: pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py	Wed Oct  8 13:49:06 2008
@@ -78,7 +78,7 @@
     except KeyError:
         w_missing_item = w_dict.missing_method(space, w_lookup)
         if w_missing_item is None:
-            raise OperationError(space.w_KeyError, w_lookup)
+            space.raise_key_error(w_lookup)
         else:
             return w_missing_item
 
@@ -89,7 +89,7 @@
     try:
         del w_dict.content[w_lookup]
     except KeyError:
-        raise OperationError(space.w_KeyError, w_lookup)
+        space.raise_key_error(w_lookup)
     
 def len__Dict(space, w_dict):
     return space.wrap(len(w_dict.content))

Modified: pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py	Wed Oct  8 13:49:06 2008
@@ -40,7 +40,8 @@
 def descr__frozenset__new__(space, w_frozensettype, w_iterable=NoneNotWrapped):
     from pypy.objspace.std.setobject import W_FrozensetObject
     from pypy.objspace.std.setobject import _is_frozenset_exact
-    if _is_frozenset_exact(w_iterable):
+    if (space.is_w(w_frozensettype, space.w_frozenset) and
+        _is_frozenset_exact(w_iterable)):
         return w_iterable
     w_obj = space.allocate_instance(W_FrozensetObject, w_frozensettype)
     W_FrozensetObject.__init__(w_obj, space, None)

Modified: pypy/branch/2.5-merge/pypy/objspace/std/objspace.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/objspace.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/objspace.py	Wed Oct  8 13:49:06 2008
@@ -791,6 +791,10 @@
         else:
             ObjSpace.delslice(self, w_obj, w_start, w_stop)
 
+    def raise_key_error(self, w_key):
+        e = self.call_function(self.w_KeyError, w_key)
+        raise OperationError(self.w_KeyError, e)
+
     class MM:
         "Container for multimethods."
         call    = StdObjSpaceMultiMethod('call', 1, ['__call__'], general__args__=True)

Modified: pypy/branch/2.5-merge/pypy/objspace/std/setobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/setobject.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/setobject.py	Wed Oct  8 13:49:06 2008
@@ -313,14 +313,11 @@
     try:
         return space.newbool(w_other in w_left.setdata)
     except OperationError, e:
-        if not e.match(space, space.w_TypeError):
-            raise
-
-    w_f = _convert_set_to_frozenset(space, w_other)
-    if w_f is not None:
-        return space.newbool(w_f in w_left.setdata)
-    else:
-        return space.w_False
+        if e.match(space, space.w_TypeError):
+            w_f = _convert_set_to_frozenset(space, w_other)
+            if w_f is not None:
+                return space.newbool(w_f in w_left.setdata)
+        raise
 
 contains__Frozenset_ANY = contains__Set_ANY
 
@@ -437,10 +434,10 @@
     except OperationError, e:
         if not e.match(space, space.w_TypeError):
             raise
+        w_f = _convert_set_to_frozenset(space, w_item)
+        if w_f is None:
+            raise
         
-    w_f = _convert_set_to_frozenset(space, w_item)
-    if w_f is None:
-        return w_item
     try:
         del w_left.setdata[w_f]
         return None
@@ -457,7 +454,7 @@
 def set_remove__Set_ANY(space, w_left, w_item):
     w_f = _discard_from_set(space, w_left, w_item)
     if w_f is not None:
-        raise OperationError(space.w_KeyError, w_f)
+        space.raise_key_error(w_f)
 
 def hash__Frozenset(space, w_set):
     multi = r_uint(1822399083) + r_uint(1822399083) + 1
@@ -633,7 +630,7 @@
         'The app-level part of repr().'
         set_id = id(s)
         if set_id in currently_in_repr:
-            return 'set(...)'
+            return '%s(...)' % (s.__class__.__name__,)
         currently_in_repr[set_id] = 1
         try:
             return '%s(%s)' % (s.__class__.__name__, [x for x in s])
@@ -653,6 +650,8 @@
         w_currently_in_repr = ec._py_repr = space.newdict()
     return setrepr(space, w_currently_in_repr, w_set)
 
+repr__Frozenset = repr__Set
+
 app = gateway.applevel("""
     def reduce__Set(s):
         dict = getattr(s,'__dict__', None)
@@ -660,8 +659,6 @@
 
 """, filename=__file__)
 
-repr__Frozenset = app.interphook('repr__Set')
-
 set_reduce__Set = app.interphook('reduce__Set')
 frozenset_reduce__Frozenset = app.interphook('reduce__Set')
 

Modified: pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py	Wed Oct  8 13:49:06 2008
@@ -417,6 +417,39 @@
         d1.update(d2)
         assert d1['a'] == 42 # fails on CPython, d1['a'] == 'foo'
 
+    def test_index_keyerror_unpacking(self):
+        d = {}
+        for v1 in ['Q', (1,)]:
+            try:
+                d[v1]
+            except KeyError, e:
+                v2 = e.args[0]
+                assert v1 == v2
+            else:
+                assert False, 'Expected KeyError'
+        
+    def test_del_keyerror_unpacking(self):
+        d = {}
+        for v1 in ['Q', (1,)]:
+            try:
+                del d[v1]
+            except KeyError, e:
+                v2 = e.args[0]
+                assert v1 == v2
+            else:
+                assert False, 'Expected KeyError'
+
+    def test_pop_keyerror_unpacking(self):
+        d = {}
+        for v1 in ['Q', (1,)]:
+            try:
+                d.pop(v1)
+            except KeyError, e:
+                v2 = e.args[0]
+                assert v1 == v2
+            else:
+                assert False, 'Expected KeyError'
+
 
 # the minimal 'space' needed to use a W_DictObject
 class FakeSpace:

Modified: pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py	(original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py	Wed Oct  8 13:49:06 2008
@@ -83,6 +83,15 @@
         s.add(A(s))
         assert repr(s) == "set([1, 2, 3, set(...)])"
 
+    def test_recursive_repr_frozenset(self):
+        class A(object):
+            def __repr__(self):
+                return repr(self.s)
+        a = A()
+        s = frozenset([1, 2, 3, a])
+        a.s = s
+        assert repr(s) == "frozenset([1, 2, 3, frozenset(...)])"
+        
     def test_keyerror_has_key(self):
         s = set()
         try:
@@ -143,3 +152,44 @@
         except KeyError, e:
             assert isinstance(e.args[0], frozenset)
             assert e.args[0] == frozenset([2, 3])
+
+    def test_contains(self):
+        letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+        word = 'teleledningsanka'
+        s = set(word)
+        for c in letters:
+            assert (c in s) == (c in word)
+        raises(TypeError, s.__contains__, [])
+
+    def test_remove(self):
+        s = set('abc')
+        s.remove('a')
+        assert 'a' not in s
+        raises(KeyError, s.remove, 'a')
+        raises(TypeError, s.remove, [])
+        s.add(frozenset('def'))
+        assert set('def') in s
+        s.remove(set('def'))
+        assert set('def') not in s
+        raises(KeyError, s.remove, set('def'))
+
+    def test_remove_keyerror_unpacking(self):
+        # bug:  www.python.org/sf/1576657
+        s = set()
+        for v1 in ['Q', (1,)]:
+            try:
+                s.remove(v1)
+            except KeyError, e:
+                v2 = e.args[0]
+                assert v1 == v2
+            else:
+                assert False, 'Expected KeyError'
+        
+    def test_singleton_empty_frozenset(self):
+        class Frozenset(frozenset):
+            pass
+        f = frozenset()
+        F = Frozenset()
+        efs = [f, Frozenset(f)]
+        # All empty frozenset subclass instances should have different ids
+        assert len(set(map(id, efs))) == len(efs)



More information about the Pypy-commit mailing list