blob: 8bd8d108f791f5af36cf863b4e6c58ec7975b80a [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 Woutersed03b412007-08-28 21:37:11 +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,
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
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örwald3040b192005-02-17 18:51:48 +000045class MutableStringTest(UserStringTest):
46 type2test = MutableString
47
48 # MutableStrings can be hashed => deactivate test
49 def test_hash(self):
50 pass
51
Walter Dörwald7f791522005-02-17 22:03:31 +000052 def test_setitem(self):
53 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000054 self.assertRaises(IndexError, s.__setitem__, -4, "bar")
Walter Dörwald7f791522005-02-17 22:03:31 +000055 self.assertRaises(IndexError, s.__setitem__, 3, "bar")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000056 s[-1] = "bar"
57 self.assertEqual(s, "fobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000058 s[0] = "bar"
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000059 self.assertEqual(s, "barobar")
Walter Dörwald7f791522005-02-17 22:03:31 +000060
61 def test_delitem(self):
62 s = self.type2test("foo")
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000063 self.assertRaises(IndexError, s.__delitem__, -4)
Walter Dörwald1fd4db92005-02-17 22:31:28 +000064 self.assertRaises(IndexError, s.__delitem__, 3)
Walter Dörwaldaf3b39a2005-02-18 13:22:43 +000065 del s[-1]
66 self.assertEqual(s, "fo")
Walter Dörwald7f791522005-02-17 22:03:31 +000067 del s[0]
Walter Dörwald7f791522005-02-17 22:03:31 +000068 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 Woutersed03b412007-08-28 21:37:11 +000090 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örwald7f791522005-02-17 22:03:31 +0000112 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örwald0fd583c2003-02-21 12:53:50 +0000136def test_main():
Walter Dörwald3040b192005-02-17 18:51:48 +0000137 test_support.run_unittest(UserStringTest, MutableStringTest)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000138
Fred Drakea22b5762000-04-03 03:51:50 +0000139if __name__ == "__main__":
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000140 test_main()