| #!/usr/bin/env python | |
| # UserString is a wrapper around the native builtin string type. | |
| # UserString instances should behave similar to builtin string objects. | |
| import string | |
| from test import test_support, string_tests | |
| from UserString import UserString, MutableString | |
| import warnings | |
| class UserStringTest( | |
| string_tests.CommonTest, | |
| string_tests.MixinStrUnicodeUserStringTest, | |
| string_tests.MixinStrStringUserStringTest, | |
| string_tests.MixinStrUserStringTest | |
| ): | |
| 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): | |
| 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) | |
| self.assertEqual( | |
| result, | |
| realresult | |
| ) | |
| def checkraises(self, exc, object, methodname, *args): | |
| object = self.fixtype(object) | |
| # we don't fix the arguments, because UserString can't cope with it | |
| self.assertRaises( | |
| exc, | |
| getattr(object, methodname), | |
| *args | |
| ) | |
| 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) | |
| class MutableStringTest(UserStringTest): | |
| type2test = MutableString | |
| # MutableStrings can be hashed => deactivate test | |
| def test_hash(self): | |
| pass | |
| def test_setitem(self): | |
| s = self.type2test("foo") | |
| self.assertRaises(IndexError, s.__setitem__, -4, "bar") | |
| self.assertRaises(IndexError, s.__setitem__, 3, "bar") | |
| s[-1] = "bar" | |
| self.assertEqual(s, "fobar") | |
| s[0] = "bar" | |
| self.assertEqual(s, "barobar") | |
| def test_delitem(self): | |
| s = self.type2test("foo") | |
| self.assertRaises(IndexError, s.__delitem__, -4) | |
| self.assertRaises(IndexError, s.__delitem__, 3) | |
| del s[-1] | |
| self.assertEqual(s, "fo") | |
| del s[0] | |
| self.assertEqual(s, "o") | |
| del s[0] | |
| self.assertEqual(s, "") | |
| def test_setslice(self): | |
| s = self.type2test("foo") | |
| s[:] = "bar" | |
| self.assertEqual(s, "bar") | |
| s[1:2] = "foo" | |
| self.assertEqual(s, "bfoor") | |
| s[1:-1] = UserString("a") | |
| self.assertEqual(s, "bar") | |
| s[0:10] = 42 | |
| self.assertEqual(s, "42") | |
| def test_delslice(self): | |
| s = self.type2test("foobar") | |
| del s[3:10] | |
| self.assertEqual(s, "foo") | |
| del s[-1:10] | |
| self.assertEqual(s, "fo") | |
| def test_extended_set_del_slice(self): | |
| indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) | |
| orig = string.ascii_letters + string.digits | |
| for start in indices: | |
| for stop in indices: | |
| # Use indices[1:] when MutableString can handle real | |
| # extended slices | |
| for step in (None, 1, -1): | |
| s = self.type2test(orig) | |
| L = list(orig) | |
| # Make sure we have a slice of exactly the right length, | |
| # but with (hopefully) different data. | |
| data = L[start:stop:step] | |
| data.reverse() | |
| L[start:stop:step] = data | |
| s[start:stop:step] = "".join(data) | |
| self.assertEqual(s, "".join(L)) | |
| del L[start:stop:step] | |
| del s[start:stop:step] | |
| self.assertEqual(s, "".join(L)) | |
| def test_immutable(self): | |
| s = self.type2test("foobar") | |
| s2 = s.immutable() | |
| self.assertEqual(s, s2) | |
| self.assertIsInstance(s2, UserString) | |
| def test_iadd(self): | |
| s = self.type2test("foo") | |
| s += "bar" | |
| self.assertEqual(s, "foobar") | |
| s += UserString("baz") | |
| self.assertEqual(s, "foobarbaz") | |
| s += 42 | |
| self.assertEqual(s, "foobarbaz42") | |
| def test_imul(self): | |
| s = self.type2test("foo") | |
| s *= 1 | |
| self.assertEqual(s, "foo") | |
| s *= 2 | |
| self.assertEqual(s, "foofoo") | |
| s *= -1 | |
| self.assertEqual(s, "") | |
| def test_main(): | |
| with warnings.catch_warnings(): | |
| warnings.filterwarnings("ignore", ".*MutableString has been removed", | |
| DeprecationWarning) | |
| warnings.filterwarnings("ignore", | |
| ".*__(get|set|del)slice__ has been removed", | |
| DeprecationWarning) | |
| test_support.run_unittest(UserStringTest, MutableStringTest) | |
| if __name__ == "__main__": | |
| test_main() |