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()
|
---|