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