#!/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()