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