blob: b66dffe3f6e0a35b0c69da53ae94519f9e4bed8f [file] [log] [blame]
Fred Drakea22b5762000-04-03 03:51:50 +00001#!/usr/bin/env python
Fred Drakea22b5762000-04-03 03:51:50 +00002# UserString is a wrapper around the native builtin string type.
3# UserString instances should behave similar to builtin string objects.
Walter Dörwald0fd583c2003-02-21 12:53:50 +00004
5import unittest
Thomas Wouters3ccec682007-08-28 15:28:19 +00006import string
Walter Dörwald0fd583c2003-02-21 12:53:50 +00007from test import test_support, string_tests
8
Walter Dörwald3040b192005-02-17 18:51:48 +00009from UserString import UserString, MutableString
Fred Drakea22b5762000-04-03 03:51:50 +000010
Walter Dörwald0fd583c2003-02-21 12:53:50 +000011class UserStringTest(
12 string_tests.CommonTest,
13 string_tests.MixinStrUnicodeUserStringTest,
14 string_tests.MixinStrStringUserStringTest,
Hye-Shik Change9ddfbb2004-08-04 07:38:35 +000015 string_tests.MixinStrUserStringTest
Walter Dörwald0fd583c2003-02-21 12:53:50 +000016 ):
17
18 type2test = UserString
19
20 # Overwrite the three testing methods, because UserString
21 # can't cope with arguments propagated to UserString
22 # (and we don't test with subclasses)
23 def checkequal(self, result, object, methodname, *args):
24 result = self.fixtype(result)
25 object = self.fixtype(object)
26 # we don't fix the arguments, because UserString can't cope with it
27 realresult = getattr(object, methodname)(*args)
28 self.assertEqual(
29 result,
30 realresult
31 )
32
33 def checkraises(self, exc, object, methodname, *args):
34 object = self.fixtype(object)
35 # we don't fix the arguments, because UserString can't cope with it
36 self.assertRaises(
37 exc,
38 getattr(object, methodname),
39 *args
40 )
41
42 def checkcall(self, object, methodname, *args):
43 object = self.fixtype(object)
44 # we don't fix the arguments, because UserString can't cope with it
45 getattr(object, methodname)(*args)
46
Walter Dörwald3040b192005-02-17 18:51:48 +000047class MutableStringTest(UserStringTest):
48 type2test = MutableString
49
50 # MutableStrings can be hashed => deactivate test
51 def test_hash(self):
52 pass
53
Walter Dörwald7f791522005-02-17 22:03:31 +000054 def test_setitem(self):
55 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000056 self.assertRaises(IndexError, s.__setitem__, -4, "bar")
Walter Dörwald7f791522005-02-17 22:03:31 +000057 self.assertRaises(IndexError, s.__setitem__, 3, "bar")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000058 s[-1] = "bar"
59 self.assertEqual(s, "fobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000060 s[0] = "bar"
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000061 self.assertEqual(s, "barobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000062
63 def test_delitem(self):
64 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000065 self.assertRaises(IndexError, s.__delitem__, -4)
Walter Dörwald1fd4db92005-02-17 22:31:28 +000066 self.assertRaises(IndexError, s.__delitem__, 3)
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000067 del s[-1]
68 self.assertEqual(s, "fo")
Walter Dörwald7f791522005-02-17 22:03:31 +000069 del s[0]
Walter Dörwald7f791522005-02-17 22:03:31 +000070 self.assertEqual(s, "o")
71 del s[0]
72 self.assertEqual(s, "")
73
74 def test_setslice(self):
75 s = self.type2test("foo")
76 s[:] = "bar"
77 self.assertEqual(s, "bar")
78 s[1:2] = "foo"
79 self.assertEqual(s, "bfoor")
80 s[1:-1] = UserString("a")
81 self.assertEqual(s, "bar")
82 s[0:10] = 42
83 self.assertEqual(s, "42")
84
85 def test_delslice(self):
86 s = self.type2test("foobar")
87 del s[3:10]
88 self.assertEqual(s, "foo")
89 del s[-1:10]
90 self.assertEqual(s, "fo")
91
Thomas Wouters3ccec682007-08-28 15:28:19 +000092 def test_extended_set_del_slice(self):
93 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
94 orig = string.ascii_letters + string.digits
95 for start in indices:
96 for stop in indices:
97 # Use indices[1:] when MutableString can handle real
98 # extended slices
99 for step in (None, 1, -1):
100 s = self.type2test(orig)
101 L = list(orig)
102 # Make sure we have a slice of exactly the right length,
103 # but with (hopefully) different data.
104 data = L[start:stop:step]
105 data.reverse()
106 L[start:stop:step] = data
107 s[start:stop:step] = "".join(data)
108 self.assertEquals(s, "".join(L))
109
110 del L[start:stop:step]
111 del s[start:stop:step]
112 self.assertEquals(s, "".join(L))
113
Walter Dörwald7f791522005-02-17 22:03:31 +0000114 def test_immutable(self):
115 s = self.type2test("foobar")
116 s2 = s.immutable()
117 self.assertEqual(s, s2)
118 self.assert_(isinstance(s2, UserString))
119
120 def test_iadd(self):
121 s = self.type2test("foo")
122 s += "bar"
123 self.assertEqual(s, "foobar")
124 s += UserString("baz")
125 self.assertEqual(s, "foobarbaz")
126 s += 42
127 self.assertEqual(s, "foobarbaz42")
128
129 def test_imul(self):
130 s = self.type2test("foo")
131 s *= 1
132 self.assertEqual(s, "foo")
133 s *= 2
134 self.assertEqual(s, "foofoo")
135 s *= -1
136 self.assertEqual(s, "")
137
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000138def test_main():
Walter Dörwald3040b192005-02-17 18:51:48 +0000139 test_support.run_unittest(UserStringTest, MutableStringTest)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000140
Fred Drakea22b5762000-04-03 03:51:50 +0000141if __name__ == "__main__":
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000142 test_main()