From 7d0f109b3deacb59762fd3f74b12fafeca3a9617 Mon Sep 17 00:00:00 2001 From: Padraic Fanning Date: Thu, 22 Apr 2021 22:09:39 -0400 Subject: [PATCH 1/2] Add test_userstring from CPython 3.8 --- Lib/test/test_userstring.py | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Lib/test/test_userstring.py diff --git a/Lib/test/test_userstring.py b/Lib/test/test_userstring.py new file mode 100644 index 000000000..4d1d8b6b6 --- /dev/null +++ b/Lib/test/test_userstring.py @@ -0,0 +1,70 @@ +# UserString is a wrapper around the native builtin string type. +# UserString instances should behave similar to builtin string objects. + +import unittest +from test import string_tests + +from collections import UserString + +class UserStringTest( + string_tests.CommonTest, + string_tests.MixinStrUnicodeUserStringTest, + unittest.TestCase + ): + + type2test = UserString + + # Overwrite the three testing methods, because UserString + # can't cope with arguments propagated to UserString + # (and we don't test with subclasses) + def checkequal(self, result, object, methodname, *args, **kwargs): + result = self.fixtype(result) + object = self.fixtype(object) + # we don't fix the arguments, because UserString can't cope with it + realresult = getattr(object, methodname)(*args, **kwargs) + self.assertEqual( + result, + realresult + ) + + def checkraises(self, exc, obj, methodname, *args): + obj = self.fixtype(obj) + # we don't fix the arguments, because UserString can't cope with it + with self.assertRaises(exc) as cm: + getattr(obj, methodname)(*args) + self.assertNotEqual(str(cm.exception), '') + + def checkcall(self, object, methodname, *args): + object = self.fixtype(object) + # we don't fix the arguments, because UserString can't cope with it + getattr(object, methodname)(*args) + + def test_rmod(self): + class ustr2(UserString): + pass + + class ustr3(ustr2): + def __rmod__(self, other): + return super().__rmod__(other) + + fmt2 = ustr2('value is %s') + str3 = ustr3('TEST') + self.assertEqual(fmt2 % str3, 'value is TEST') + + def test_encode_default_args(self): + self.checkequal(b'hello', 'hello', 'encode') + # Check that encoding defaults to utf-8 + self.checkequal(b'\xf0\xa3\x91\x96', '\U00023456', 'encode') + # Check that errors defaults to 'strict' + self.checkraises(UnicodeError, '\ud800', 'encode') + + def test_encode_explicit_none_args(self): + self.checkequal(b'hello', 'hello', 'encode', None, None) + # Check that encoding defaults to utf-8 + self.checkequal(b'\xf0\xa3\x91\x96', '\U00023456', 'encode', None, None) + # Check that errors defaults to 'strict' + self.checkraises(UnicodeError, '\ud800', 'encode', None, None) + + +if __name__ == "__main__": + unittest.main() From d56a0194b7f9619e33e095493b07a4950fc4e2aa Mon Sep 17 00:00:00 2001 From: Padraic Fanning Date: Thu, 22 Apr 2021 22:12:48 -0400 Subject: [PATCH 2/2] Mark erroring/failing tests --- Lib/test/test_userstring.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/test/test_userstring.py b/Lib/test/test_userstring.py index 4d1d8b6b6..b6c11cc4e 100644 --- a/Lib/test/test_userstring.py +++ b/Lib/test/test_userstring.py @@ -14,6 +14,16 @@ class UserStringTest( type2test = UserString + # TODO: RUSTPYTHON + @unittest.expectedFailure + def test_removeprefix(self): + super().test_removeprefix() + + # TODO: RUSTPYTHON + @unittest.expectedFailure + def test_removesuffix(self): + super().test_removesuffix() + # Overwrite the three testing methods, because UserString # can't cope with arguments propagated to UserString # (and we don't test with subclasses) @@ -51,6 +61,8 @@ class UserStringTest( str3 = ustr3('TEST') self.assertEqual(fmt2 % str3, 'value is TEST') + # TODO: RUSTPYTHON + @unittest.expectedFailure def test_encode_default_args(self): self.checkequal(b'hello', 'hello', 'encode') # Check that encoding defaults to utf-8 @@ -58,6 +70,8 @@ class UserStringTest( # Check that errors defaults to 'strict' self.checkraises(UnicodeError, '\ud800', 'encode') + # TODO: RUSTPYTHON + @unittest.expectedFailure def test_encode_explicit_none_args(self): self.checkequal(b'hello', 'hello', 'encode', None, None) # Check that encoding defaults to utf-8