1 #!/usr/bin/env python 2 # UserString is a wrapper around the native builtin string type. 3 # UserString instances should behave similar to builtin string objects. 4 5 import string 6 from test import test_support, string_tests 7 from UserString import UserString, MutableString 8 import warnings 9 10 class UserStringTest( 11 string_tests.CommonTest, 12 string_tests.MixinStrUnicodeUserStringTest, 13 string_tests.MixinStrStringUserStringTest, 14 string_tests.MixinStrUserStringTest 15 ): 16 17 type2test = UserString 18 19 # Overwrite the three testing methods, because UserString 20 # can't cope with arguments propagated to UserString 21 # (and we don't test with subclasses) 22 def checkequal(self, result, object, methodname, *args): 23 result = self.fixtype(result) 24 object = self.fixtype(object) 25 # we don't fix the arguments, because UserString can't cope with it 26 realresult = getattr(object, methodname)(*args) 27 self.assertEqual( 28 result, 29 realresult 30 ) 31 32 def checkraises(self, exc, object, methodname, *args): 33 object = self.fixtype(object) 34 # we don't fix the arguments, because UserString can't cope with it 35 self.assertRaises( 36 exc, 37 getattr(object, methodname), 38 *args 39 ) 40 41 def checkcall(self, object, methodname, *args): 42 object = self.fixtype(object) 43 # we don't fix the arguments, because UserString can't cope with it 44 getattr(object, methodname)(*args) 45 46 class MutableStringTest(UserStringTest): 47 type2test = MutableString 48 49 # MutableStrings can be hashed => deactivate test 50 def test_hash(self): 51 pass 52 53 def test_setitem(self): 54 s = self.type2test("foo") 55 self.assertRaises(IndexError, s.__setitem__, -4, "bar") 56 self.assertRaises(IndexError, s.__setitem__, 3, "bar") 57 s[-1] = "bar" 58 self.assertEqual(s, "fobar") 59 s[0] = "bar" 60 self.assertEqual(s, "barobar") 61 62 def test_delitem(self): 63 s = self.type2test("foo") 64 self.assertRaises(IndexError, s.__delitem__, -4) 65 self.assertRaises(IndexError, s.__delitem__, 3) 66 del s[-1] 67 self.assertEqual(s, "fo") 68 del s[0] 69 self.assertEqual(s, "o") 70 del s[0] 71 self.assertEqual(s, "") 72 73 def test_setslice(self): 74 s = self.type2test("foo") 75 s[:] = "bar" 76 self.assertEqual(s, "bar") 77 s[1:2] = "foo" 78 self.assertEqual(s, "bfoor") 79 s[1:-1] = UserString("a") 80 self.assertEqual(s, "bar") 81 s[0:10] = 42 82 self.assertEqual(s, "42") 83 84 def test_delslice(self): 85 s = self.type2test("foobar") 86 del s[3:10] 87 self.assertEqual(s, "foo") 88 del s[-1:10] 89 self.assertEqual(s, "fo") 90 91 def test_extended_set_del_slice(self): 92 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) 93 orig = string.ascii_letters + string.digits 94 for start in indices: 95 for stop in indices: 96 # Use indices[1:] when MutableString can handle real 97 # extended slices 98 for step in (None, 1, -1): 99 s = self.type2test(orig) 100 L = list(orig) 101 # Make sure we have a slice of exactly the right length, 102 # but with (hopefully) different data. 103 data = L[start:stop:step] 104 data.reverse() 105 L[start:stop:step] = data 106 s[start:stop:step] = "".join(data) 107 self.assertEqual(s, "".join(L)) 108 109 del L[start:stop:step] 110 del s[start:stop:step] 111 self.assertEqual(s, "".join(L)) 112 113 def test_immutable(self): 114 s = self.type2test("foobar") 115 s2 = s.immutable() 116 self.assertEqual(s, s2) 117 self.assertIsInstance(s2, UserString) 118 119 def test_iadd(self): 120 s = self.type2test("foo") 121 s += "bar" 122 self.assertEqual(s, "foobar") 123 s += UserString("baz") 124 self.assertEqual(s, "foobarbaz") 125 s += 42 126 self.assertEqual(s, "foobarbaz42") 127 128 def test_imul(self): 129 s = self.type2test("foo") 130 s *= 1 131 self.assertEqual(s, "foo") 132 s *= 2 133 self.assertEqual(s, "foofoo") 134 s *= -1 135 self.assertEqual(s, "") 136 137 def test_main(): 138 with warnings.catch_warnings(): 139 warnings.filterwarnings("ignore", ".*MutableString has been removed", 140 DeprecationWarning) 141 warnings.filterwarnings("ignore", 142 ".*__(get|set|del)slice__ has been removed", 143 DeprecationWarning) 144 test_support.run_unittest(UserStringTest, MutableStringTest) 145 146 if __name__ == "__main__": 147 test_main() 148