[pypy-commit] pypy rmod-radd-slots: test, add functioning __rmod__ and dummy __radd__ to W_AbstractBytesObject

mattip pypy.commits at gmail.com
Thu Sep 29 13:33:25 EDT 2016


Author: Matti Picus <matti.picus at gmail.com>
Branch: rmod-radd-slots
Changeset: r87453:f61471441ebd
Date: 2016-09-29 19:57 +0300
http://bitbucket.org/pypy/pypy/changeset/f61471441ebd/

Log:	test, add functioning __rmod__ and dummy __radd__ to
	W_AbstractBytesObject

	discover pypy cpython incompatibility with u'%s'.__rmod__('a') and
	'%s'.__rmod__(u'a')

diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -60,6 +60,10 @@
     def descr_add(self, space, w_other):
         """x.__add__(y) <==> x+y"""
 
+    def descr_radd(self, space, w_other):
+        """x.__radd__(y) <==> y+x"""
+        return space.w_NotImplemented
+
     def descr_contains(self, space, w_sub):
         """x.__contains__(y) <==> y in x"""
 
@@ -602,6 +606,9 @@
     def descr_mod(self, space, w_values):
         return mod_format(space, self, w_values, do_unicode=False)
 
+    def descr_rmod(self, space, w_values):
+        return mod_format(space, w_values, self, do_unicode=False)
+
     def descr_eq(self, space, w_other):
         if space.config.objspace.std.withstrbuf:
             from pypy.objspace.std.strbufobject import W_StringBufferObject
@@ -886,6 +893,7 @@
     __contains__ = interpindirect2app(W_AbstractBytesObject.descr_contains),
 
     __add__ = interpindirect2app(W_AbstractBytesObject.descr_add),
+    __radd__ = interpindirect2app(W_AbstractBytesObject.descr_radd),
     __mul__ = interpindirect2app(W_AbstractBytesObject.descr_mul),
     __rmul__ = interpindirect2app(W_AbstractBytesObject.descr_rmul),
 
@@ -934,6 +942,7 @@
     format = interpindirect2app(W_BytesObject.descr_format),
     __format__ = interpindirect2app(W_BytesObject.descr__format__),
     __mod__ = interpindirect2app(W_BytesObject.descr_mod),
+    __rmod__ = interpindirect2app(W_BytesObject.descr_rmod),
     __getnewargs__ = interpindirect2app(
         W_AbstractBytesObject.descr_getnewargs),
     _formatter_parser = interp2app(W_BytesObject.descr_formatter_parser),
diff --git a/pypy/objspace/std/test/test_bytesobject.py b/pypy/objspace/std/test/test_bytesobject.py
--- a/pypy/objspace/std/test/test_bytesobject.py
+++ b/pypy/objspace/std/test/test_bytesobject.py
@@ -92,6 +92,7 @@
         raises(ValueError, 'a%Zb'.__mod__, ((23,),))
 
     def test_format(self):
+        import sys
         raises(TypeError, "foo".__mod__, "bar")
         raises(TypeError, u"foo".__mod__, "bar")
         raises(TypeError, "foo".__mod__, u"bar")
@@ -105,11 +106,28 @@
             assert result == "a foo b"
             assert isinstance(result, cls)
 
+        for format, arg, cls in [("a %s b", "foo", str),
+                                 (u"a %s b", u"foo", unicode)]:
+            raises(TypeError, arg.__rmod__, format[:2])
+            result = arg.__rmod__(format)
+            assert result == "a foo b"
+            assert isinstance(result, cls)
+        for format, arg, cls in [(u"a %s b", "foo", str),
+                                 ("a %s b", u"foo", unicode)]:
+            result = arg.__rmod__(format)
+            if '__pypy__' in sys.builtin_module_names:
+                raises(TypeError, arg.__rmod__, format[:2])
+                assert result == "a foo b"
+                assert isinstance(result, cls)
+            else:
+                assert result is NotImplemented
+
     def test_format_wrongtype(self):
         for int_format in '%d', '%o', '%x':
             exc_info = raises(TypeError, int_format.__mod__, '123')
             expected = int_format + ' format: a number is required, not str'
             assert str(exc_info.value) == expected
+        raises(TypeError, "None % 'abc'") # __rmod__
 
     def test_split(self):
         assert b"".split() == []
@@ -656,7 +674,7 @@
         table = maketrans(b'abc', b'xyz')
         assert b'xyzxyz' == b'xyzabcdef'.translate(table, b'def')
         exc = raises(TypeError, "'xyzabcdef'.translate(memoryview(table), 'def')")
-        assert str(exc.value) == 'expected a character buffer object'
+        assert 'expected a' in str(exc.value)
 
         table = maketrans(b'a', b'A')
         assert b'Abc' == b'abc'.translate(table)
@@ -799,8 +817,18 @@
         raises(TypeError, len, iter(iterable))
 
     def test___radd__(self):
+        import sys
+        raises(TypeError, "None + ''")
+        if '__pypy__' in sys.builtin_module_names:
+            assert 'abc'.__radd__('def') is NotImplemented
+        else:
+            # xxx CPython has no str.__radd__ and no unicode.__radd__
+            raises(AttributeError, "'abc'.__radd__('def')")
+
+
         class Foo(object):
             def __radd__(self, other):
                 return 42
+
         x = Foo()
         assert "hello" + x == 42
diff --git a/pypy/objspace/std/test/test_unicodeobject.py b/pypy/objspace/std/test/test_unicodeobject.py
--- a/pypy/objspace/std/test/test_unicodeobject.py
+++ b/pypy/objspace/std/test/test_unicodeobject.py
@@ -738,11 +738,21 @@
                             '\x00\x00\x00X\x00\x00\x00Y']
 
     def test_call_special_methods(self):
+        import sys
         # xxx not completely clear if these are implementation details or not
         assert 'abc'.__add__(u'def') == u'abcdef'
         assert u'abc'.__add__(u'def') == u'abcdef'
         assert u'abc'.__add__('def') == u'abcdef'
-        # xxx CPython has no str.__radd__ and no unicode.__radd__
+        assert u'abc'.__rmod__(u'%s') == u'abc'
+        ret = u'abc'.__rmod__('%s')
+        
+        if '__pypy__' in sys.builtin_module_names:
+            assert ret == u'abc'
+            assert u'abc'.__radd__(u'def') is NotImplemented
+        else:
+            assert ret is NotImplemented
+            # xxx CPython has no str.__radd__ and no unicode.__radd__
+            raises(AttributeError, "u'abc'.__radd__(u'def')")
 
     def test_str_unicode_concat_overrides(self):
         "Test from Jython about being bug-compatible with CPython."
diff --git a/pypy/objspace/std/unicodeobject.py b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -301,6 +301,9 @@
             raise
         return space.newbool(res)
 
+    def descr_radd(self, space, w_other):
+        return space.w_NotImplemented
+
     def descr_format(self, space, __args__):
         return newformat.format_method(space, self, __args__, is_unicode=True)
 
@@ -316,6 +319,9 @@
     def descr_mod(self, space, w_values):
         return mod_format(space, self, w_values, do_unicode=True)
 
+    def descr_rmod(self, space, w_values):
+        return mod_format(space, w_values, self, do_unicode=True)
+
     def descr_translate(self, space, w_table):
         selfvalue = self._value
         w_sys = space.getbuiltinmodule('sys')
@@ -582,6 +588,9 @@
     def __add__():
         """x.__add__(y) <==> x+y"""
 
+    def __radd__():
+        """x.__radd__(y) <==> y+x"""
+
     def __contains__():
         """x.__contains__(y) <==> y in x"""
 
@@ -630,6 +639,9 @@
     def __mod__():
         """x.__mod__(y) <==> x%y"""
 
+    def __rmod__():
+        """x.__rmod__(y) <==> y%x"""
+
     def __mul__():
         """x.__mul__(n) <==> x*n"""
 
@@ -998,6 +1010,8 @@
 
     __add__ = interp2app(W_UnicodeObject.descr_add,
                          doc=UnicodeDocstrings.__add__.__doc__),
+    __radd__ = interp2app(W_UnicodeObject.descr_radd,
+                         doc=UnicodeDocstrings.__radd__.__doc__),
     __mul__ = interp2app(W_UnicodeObject.descr_mul,
                          doc=UnicodeDocstrings.__mul__.__doc__),
     __rmul__ = interp2app(W_UnicodeObject.descr_mul,
@@ -1093,6 +1107,8 @@
                             doc=UnicodeDocstrings.__format__.__doc__),
     __mod__ = interp2app(W_UnicodeObject.descr_mod,
                          doc=UnicodeDocstrings.__mod__.__doc__),
+    __rmod__ = interp2app(W_UnicodeObject.descr_rmod,
+                         doc=UnicodeDocstrings.__rmod__.__doc__),
     __getnewargs__ = interp2app(W_UnicodeObject.descr_getnewargs,
                                 doc=UnicodeDocstrings.__getnewargs__.__doc__),
     _formatter_parser = interp2app(W_UnicodeObject.descr_formatter_parser),


More information about the pypy-commit mailing list