Fred Drake | a22b576 | 2000-04-03 03:51:50 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
Fred Drake | a22b576 | 2000-04-03 03:51:50 +0000 | [diff] [blame] | 2 | # UserString is a wrapper around the native builtin string type. |
| 3 | # UserString instances should behave similar to builtin string objects. |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 4 | |
| 5 | import unittest |
Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 6 | import string |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 7 | from test import test_support, string_tests |
| 8 | |
Walter Dörwald | 3040b19 | 2005-02-17 18:51:48 +0000 | [diff] [blame] | 9 | from UserString import UserString, MutableString |
Fred Drake | a22b576 | 2000-04-03 03:51:50 +0000 | [diff] [blame] | 10 | |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 11 | class UserStringTest( |
| 12 | string_tests.CommonTest, |
| 13 | string_tests.MixinStrUnicodeUserStringTest, |
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 | |
| 31 | def checkraises(self, exc, object, methodname, *args): |
| 32 | object = self.fixtype(object) |
| 33 | # we don't fix the arguments, because UserString can't cope with it |
| 34 | self.assertRaises( |
| 35 | exc, |
| 36 | getattr(object, methodname), |
| 37 | *args |
| 38 | ) |
| 39 | |
| 40 | def checkcall(self, object, methodname, *args): |
| 41 | object = self.fixtype(object) |
| 42 | # we don't fix the arguments, because UserString can't cope with it |
| 43 | getattr(object, methodname)(*args) |
| 44 | |
Walter Dörwald | 3040b19 | 2005-02-17 18:51:48 +0000 | [diff] [blame] | 45 | class MutableStringTest(UserStringTest): |
| 46 | type2test = MutableString |
| 47 | |
| 48 | # MutableStrings can be hashed => deactivate test |
| 49 | def test_hash(self): |
| 50 | pass |
| 51 | |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 52 | def test_setitem(self): |
| 53 | s = self.type2test("foo") |
Walter Dörwald | af3b39a | 2005-02-18 13:22:43 +0000 | [diff] [blame] | 54 | self.assertRaises(IndexError, s.__setitem__, -4, "bar") |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 55 | self.assertRaises(IndexError, s.__setitem__, 3, "bar") |
Walter Dörwald | af3b39a | 2005-02-18 13:22:43 +0000 | [diff] [blame] | 56 | s[-1] = "bar" |
| 57 | self.assertEqual(s, "fobar") |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 58 | s[0] = "bar" |
Walter Dörwald | af3b39a | 2005-02-18 13:22:43 +0000 | [diff] [blame] | 59 | self.assertEqual(s, "barobar") |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 60 | |
| 61 | def test_delitem(self): |
| 62 | s = self.type2test("foo") |
Walter Dörwald | af3b39a | 2005-02-18 13:22:43 +0000 | [diff] [blame] | 63 | self.assertRaises(IndexError, s.__delitem__, -4) |
Walter Dörwald | 1fd4db9 | 2005-02-17 22:31:28 +0000 | [diff] [blame] | 64 | self.assertRaises(IndexError, s.__delitem__, 3) |
Walter Dörwald | af3b39a | 2005-02-18 13:22:43 +0000 | [diff] [blame] | 65 | del s[-1] |
| 66 | self.assertEqual(s, "fo") |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 67 | del s[0] |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 68 | self.assertEqual(s, "o") |
| 69 | del s[0] |
| 70 | self.assertEqual(s, "") |
| 71 | |
| 72 | def test_setslice(self): |
| 73 | s = self.type2test("foo") |
| 74 | s[:] = "bar" |
| 75 | self.assertEqual(s, "bar") |
| 76 | s[1:2] = "foo" |
| 77 | self.assertEqual(s, "bfoor") |
| 78 | s[1:-1] = UserString("a") |
| 79 | self.assertEqual(s, "bar") |
| 80 | s[0:10] = 42 |
| 81 | self.assertEqual(s, "42") |
| 82 | |
| 83 | def test_delslice(self): |
| 84 | s = self.type2test("foobar") |
| 85 | del s[3:10] |
| 86 | self.assertEqual(s, "foo") |
| 87 | del s[-1:10] |
| 88 | self.assertEqual(s, "fo") |
| 89 | |
Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 90 | def test_extended_set_del_slice(self): |
| 91 | indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) |
| 92 | orig = string.ascii_letters + string.digits |
| 93 | for start in indices: |
| 94 | for stop in indices: |
| 95 | # Use indices[1:] when MutableString can handle real |
| 96 | # extended slices |
| 97 | for step in (None, 1, -1): |
| 98 | s = self.type2test(orig) |
| 99 | L = list(orig) |
| 100 | # Make sure we have a slice of exactly the right length, |
| 101 | # but with (hopefully) different data. |
| 102 | data = L[start:stop:step] |
| 103 | data.reverse() |
| 104 | L[start:stop:step] = data |
| 105 | s[start:stop:step] = "".join(data) |
| 106 | self.assertEquals(s, "".join(L)) |
| 107 | |
| 108 | del L[start:stop:step] |
| 109 | del s[start:stop:step] |
| 110 | self.assertEquals(s, "".join(L)) |
| 111 | |
Walter Dörwald | 7f79152 | 2005-02-17 22:03:31 +0000 | [diff] [blame] | 112 | def test_immutable(self): |
| 113 | s = self.type2test("foobar") |
| 114 | s2 = s.immutable() |
| 115 | self.assertEqual(s, s2) |
| 116 | self.assert_(isinstance(s2, UserString)) |
| 117 | |
| 118 | def test_iadd(self): |
| 119 | s = self.type2test("foo") |
| 120 | s += "bar" |
| 121 | self.assertEqual(s, "foobar") |
| 122 | s += UserString("baz") |
| 123 | self.assertEqual(s, "foobarbaz") |
| 124 | s += 42 |
| 125 | self.assertEqual(s, "foobarbaz42") |
| 126 | |
| 127 | def test_imul(self): |
| 128 | s = self.type2test("foo") |
| 129 | s *= 1 |
| 130 | self.assertEqual(s, "foo") |
| 131 | s *= 2 |
| 132 | self.assertEqual(s, "foofoo") |
| 133 | s *= -1 |
| 134 | self.assertEqual(s, "") |
| 135 | |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 136 | def test_main(): |
Walter Dörwald | 3040b19 | 2005-02-17 18:51:48 +0000 | [diff] [blame] | 137 | test_support.run_unittest(UserStringTest, MutableStringTest) |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 138 | |
Fred Drake | a22b576 | 2000-04-03 03:51:50 +0000 | [diff] [blame] | 139 | if __name__ == "__main__": |
Walter Dörwald | 0fd583c | 2003-02-21 12:53:50 +0000 | [diff] [blame] | 140 | test_main() |