10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#!/usr/bin/env python
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# UserString is a wrapper around the native builtin string type.
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# UserString instances should behave similar to builtin string objects.
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport string
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support, string_tests
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom UserString import UserString, MutableString
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport warnings
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass UserStringTest(
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    string_tests.CommonTest,
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    string_tests.MixinStrUnicodeUserStringTest,
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    string_tests.MixinStrStringUserStringTest,
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    string_tests.MixinStrUserStringTest
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    ):
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    type2test = UserString
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Overwrite the three testing methods, because UserString
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # can't cope with arguments propagated to UserString
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # (and we don't test with subclasses)
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def checkequal(self, result, object, methodname, *args):
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = self.fixtype(result)
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        object = self.fixtype(object)
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # we don't fix the arguments, because UserString can't cope with it
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        realresult = getattr(object, methodname)(*args)
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            result,
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            realresult
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def checkraises(self, exc, object, methodname, *args):
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        object = self.fixtype(object)
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # we don't fix the arguments, because UserString can't cope with it
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            exc,
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            getattr(object, methodname),
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            *args
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def checkcall(self, object, methodname, *args):
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        object = self.fixtype(object)
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # we don't fix the arguments, because UserString can't cope with it
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        getattr(object, methodname)(*args)
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MutableStringTest(UserStringTest):
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    type2test = MutableString
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # MutableStrings can be hashed => deactivate test
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_hash(self):
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pass
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_setitem(self):
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foo")
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(IndexError, s.__setitem__, -4, "bar")
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(IndexError, s.__setitem__, 3, "bar")
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[-1] = "bar"
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "fobar")
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[0] = "bar"
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "barobar")
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_delitem(self):
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foo")
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(IndexError, s.__delitem__, -4)
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(IndexError, s.__delitem__, 3)
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del s[-1]
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "fo")
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del s[0]
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "o")
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del s[0]
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "")
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_setslice(self):
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foo")
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[:] = "bar"
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "bar")
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[1:2] = "foo"
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "bfoor")
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[1:-1] = UserString("a")
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "bar")
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s[0:10] = 42
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "42")
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_delslice(self):
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foobar")
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del s[3:10]
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foo")
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del s[-1:10]
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "fo")
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_extended_set_del_slice(self):
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        orig = string.ascii_letters + string.digits
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for start in indices:
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for stop in indices:
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Use indices[1:] when MutableString can handle real
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # extended slices
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for step in (None, 1, -1):
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    s = self.type2test(orig)
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    L = list(orig)
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    # Make sure we have a slice of exactly the right length,
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    # but with (hopefully) different data.
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    data = L[start:stop:step]
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    data.reverse()
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    L[start:stop:step] = data
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    s[start:stop:step] = "".join(data)
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertEqual(s, "".join(L))
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    del L[start:stop:step]
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    del s[start:stop:step]
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertEqual(s, "".join(L))
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_immutable(self):
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foobar")
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s2 = s.immutable()
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, s2)
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(s2, UserString)
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_iadd(self):
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foo")
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s += "bar"
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foobar")
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s += UserString("baz")
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foobarbaz")
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s += 42
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foobarbaz42")
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_imul(self):
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = self.type2test("foo")
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s *= 1
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foo")
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s *= 2
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "foofoo")
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s *= -1
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "")
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main():
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    with warnings.catch_warnings():
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        warnings.filterwarnings("ignore", ".*MutableString has been removed",
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                DeprecationWarning)
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        warnings.filterwarnings("ignore",
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                ".*__(get|set|del)slice__ has been removed",
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                DeprecationWarning)
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.run_unittest(UserStringTest, MutableStringTest)
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main()
148