blob: c18ae54291f70a427a603119eb3845113a6489aa [file] [log] [blame]
Fred Drakea22b5762000-04-03 03:51:50 +00001# UserString is a wrapper around the native builtin string type.
2# UserString instances should behave similar to builtin string objects.
Walter Dörwald0fd583c2003-02-21 12:53:50 +00003
Thomas Wouters3ccec682007-08-28 15:28:19 +00004import string
Walter Dörwald0fd583c2003-02-21 12:53:50 +00005from test import test_support, string_tests
Walter Dörwald3040b192005-02-17 18:51:48 +00006from UserString import UserString, MutableString
Brett Cannonabb34fe2008-05-29 05:08:50 +00007import warnings
Fred Drakea22b5762000-04-03 03:51:50 +00008
Walter Dörwald0fd583c2003-02-21 12:53:50 +00009class UserStringTest(
10 string_tests.CommonTest,
11 string_tests.MixinStrUnicodeUserStringTest,
12 string_tests.MixinStrStringUserStringTest,
Hye-Shik Change9ddfbb2004-08-04 07:38:35 +000013 string_tests.MixinStrUserStringTest
Walter Dörwald0fd583c2003-02-21 12:53:50 +000014 ):
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 Peterson1643d5c2014-09-28 12:48:46 -040031 def checkraises(self, exc, obj, methodname, *args):
32 obj = self.fixtype(obj)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000033 # we don't fix the arguments, because UserString can't cope with it
Benjamin Peterson1643d5c2014-09-28 12:48:46 -040034 with self.assertRaises(exc) as cm:
35 getattr(obj, methodname)(*args)
Terry Jan Reedyc0dc65e2014-10-12 22:00:10 -040036 self.assertNotEqual(cm.exception.args[0], '')
Walter Dörwald0fd583c2003-02-21 12:53:50 +000037
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örwald3040b192005-02-17 18:51:48 +000043class MutableStringTest(UserStringTest):
44 type2test = MutableString
45
46 # MutableStrings can be hashed => deactivate test
47 def test_hash(self):
48 pass
49
Walter Dörwald7f791522005-02-17 22:03:31 +000050 def test_setitem(self):
51 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000052 self.assertRaises(IndexError, s.__setitem__, -4, "bar")
Walter Dörwald7f791522005-02-17 22:03:31 +000053 self.assertRaises(IndexError, s.__setitem__, 3, "bar")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000054 s[-1] = "bar"
55 self.assertEqual(s, "fobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000056 s[0] = "bar"
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000057 self.assertEqual(s, "barobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000058
59 def test_delitem(self):
60 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000061 self.assertRaises(IndexError, s.__delitem__, -4)
Walter Dörwald1fd4db92005-02-17 22:31:28 +000062 self.assertRaises(IndexError, s.__delitem__, 3)
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000063 del s[-1]
64 self.assertEqual(s, "fo")
Walter Dörwald7f791522005-02-17 22:03:31 +000065 del s[0]
Walter Dörwald7f791522005-02-17 22:03:31 +000066 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 Wouters3ccec682007-08-28 15:28:19 +000088 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 Melotti2623a372010-11-21 13:34:58 +0000104 self.assertEqual(s, "".join(L))
Thomas Wouters3ccec682007-08-28 15:28:19 +0000105
106 del L[start:stop:step]
107 del s[start:stop:step]
Ezio Melotti2623a372010-11-21 13:34:58 +0000108 self.assertEqual(s, "".join(L))
Thomas Wouters3ccec682007-08-28 15:28:19 +0000109
Walter Dörwald7f791522005-02-17 22:03:31 +0000110 def test_immutable(self):
111 s = self.type2test("foobar")
112 s2 = s.immutable()
113 self.assertEqual(s, s2)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000114 self.assertIsInstance(s2, UserString)
Walter Dörwald7f791522005-02-17 22:03:31 +0000115
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örwald0fd583c2003-02-21 12:53:50 +0000134def test_main():
Brett Cannon672237d2008-09-09 00:49:16 +0000135 with warnings.catch_warnings():
Ezio Melottief490962010-01-31 11:46:54 +0000136 warnings.filterwarnings("ignore", ".*MutableString has been removed",
137 DeprecationWarning)
138 warnings.filterwarnings("ignore",
139 ".*__(get|set|del)slice__ has been removed",
Brett Cannonabb34fe2008-05-29 05:08:50 +0000140 DeprecationWarning)
141 test_support.run_unittest(UserStringTest, MutableStringTest)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000142
Fred Drakea22b5762000-04-03 03:51:50 +0000143if __name__ == "__main__":
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000144 test_main()