blob: 2ef01f00dd09442a27eaf31b49dcc14b3afdc088 [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001
Walter Dörwald0fd583c2003-02-21 12:53:50 +00002import unittest
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003import struct
4import sys
Walter Dörwald0fd583c2003-02-21 12:53:50 +00005from test import test_support, string_tests
6
7
8class StrTest(
9 string_tests.CommonTest,
10 string_tests.MixinStrUnicodeUserStringTest,
Walter Dörwald57d88e52004-08-26 16:53:04 +000011 string_tests.MixinStrUserStringTest,
12 string_tests.MixinStrUnicodeTest,
Walter Dörwald0fd583c2003-02-21 12:53:50 +000013 ):
14
Walter Dörwald4c271fe2007-06-07 13:52:37 +000015 type2test = str8
Walter Dörwald0fd583c2003-02-21 12:53:50 +000016
17 # We don't need to propagate to str
18 def fixtype(self, obj):
19 return obj
20
Walter Dörwald43440a62003-03-31 18:07:50 +000021 def test_formatting(self):
22 string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
Walter Dörwalddb290f02007-05-05 14:12:24 +000023 self.assertRaises(OverflowError, '%c'.__mod__, 0x12341234)
Walter Dörwald43440a62003-03-31 18:07:50 +000024
Guido van Rossum49d6b072006-08-17 21:11:47 +000025 def test_iterators(self):
26 # Make sure str objects have an __iter__ method
27 it = "abc".__iter__()
Georg Brandla18af4e2007-04-21 15:47:16 +000028 self.assertEqual(next(it), "a")
29 self.assertEqual(next(it), "b")
30 self.assertEqual(next(it), "c")
31 self.assertRaises(StopIteration, next, it)
Guido van Rossum49d6b072006-08-17 21:11:47 +000032
Brett Cannonc3647ac2005-04-26 03:45:26 +000033 def test_conversion(self):
34 # Make sure __str__() behaves properly
Brett Cannonc3647ac2005-04-26 03:45:26 +000035
36 class Foo1:
37 def __str__(self):
38 return "foo"
39
40 class Foo2(object):
41 def __str__(self):
42 return "foo"
43
44 class Foo3(object):
45 def __str__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000046 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000047
Guido van Rossumea0ebd82007-05-15 21:10:24 +000048 class Foo4(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000049 def __str__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000050 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000051
52 class Foo5(str):
Guido van Rossumea0ebd82007-05-15 21:10:24 +000053 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000054 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000055
Guido van Rossumea0ebd82007-05-15 21:10:24 +000056 class Foo6(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000057 def __str__(self):
58 return "foos"
59
60 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000061 return "foou"
Brett Cannonc3647ac2005-04-26 03:45:26 +000062
Guido van Rossumef87d6e2007-05-02 19:09:54 +000063 class Foo7(str):
Brett Cannonc3647ac2005-04-26 03:45:26 +000064 def __str__(self):
65 return "foos"
66 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000067 return "foou"
Brett Cannonc3647ac2005-04-26 03:45:26 +000068
69 class Foo8(str):
70 def __new__(cls, content=""):
71 return str.__new__(cls, 2*content)
72 def __str__(self):
73 return self
74
Guido van Rossumea0ebd82007-05-15 21:10:24 +000075 class Foo9(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000076 def __str__(self):
77 return "string"
78 def __unicode__(self):
79 return "not unicode"
80
Brett Cannonc3647ac2005-04-26 03:45:26 +000081 self.assertEqual(str(Foo1()), "foo")
82 self.assertEqual(str(Foo2()), "foo")
83 self.assertEqual(str(Foo3()), "foo")
84 self.assertEqual(str(Foo4("bar")), "foo")
85 self.assertEqual(str(Foo5("bar")), "foo")
Guido van Rossumea0ebd82007-05-15 21:10:24 +000086 self.assertEqual(str8(Foo6("bar")), "foos")
87 self.assertEqual(str(Foo6("bar")), "foou")
88 self.assertEqual(str8(Foo7("bar")), "foos")
89 self.assertEqual(str(Foo7("bar")), "foou")
Brett Cannonc3647ac2005-04-26 03:45:26 +000090 self.assertEqual(str(Foo8("foo")), "foofoo")
Guido van Rossumea0ebd82007-05-15 21:10:24 +000091 self.assertEqual(str8(Foo9("foo")), "string")
Guido van Rossumef87d6e2007-05-02 19:09:54 +000092 self.assertEqual(str(Foo9("foo")), "not unicode")
Brett Cannonc3647ac2005-04-26 03:45:26 +000093
Guido van Rossumcd16bf62007-06-13 18:07:49 +000094 def test_expandtabs_overflows_gracefully(self):
95 # This test only affects 32-bit platforms because expandtabs can only take
96 # an int as the max value, not a 64-bit C long. If expandtabs is changed
97 # to take a 64-bit long, this test should apply to all platforms.
98 if sys.maxint > (1 << 32) or struct.calcsize('P') != 4:
99 return
100 self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxint)
101
102
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000103def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000104 test_support.run_unittest(StrTest)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000105
106if __name__ == "__main__":
107 test_main()