blob: ad118d6b6db4344fc3c938b269df6bda69326151 [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.MixinStrUnicodeTest,
Walter Dörwald0fd583c2003-02-21 12:53:50 +000012 ):
13
Walter Dörwald4c271fe2007-06-07 13:52:37 +000014 type2test = str8
Walter Dörwald0fd583c2003-02-21 12:53:50 +000015
16 # We don't need to propagate to str
17 def fixtype(self, obj):
18 return obj
19
Walter Dörwald43440a62003-03-31 18:07:50 +000020 def test_formatting(self):
21 string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
Walter Dörwalddb290f02007-05-05 14:12:24 +000022 self.assertRaises(OverflowError, '%c'.__mod__, 0x12341234)
Walter Dörwald43440a62003-03-31 18:07:50 +000023
Guido van Rossum49d6b072006-08-17 21:11:47 +000024 def test_iterators(self):
25 # Make sure str objects have an __iter__ method
26 it = "abc".__iter__()
Georg Brandla18af4e2007-04-21 15:47:16 +000027 self.assertEqual(next(it), "a")
28 self.assertEqual(next(it), "b")
29 self.assertEqual(next(it), "c")
30 self.assertRaises(StopIteration, next, it)
Guido van Rossum49d6b072006-08-17 21:11:47 +000031
Brett Cannonc3647ac2005-04-26 03:45:26 +000032 def test_conversion(self):
33 # Make sure __str__() behaves properly
Brett Cannonc3647ac2005-04-26 03:45:26 +000034
35 class Foo1:
36 def __str__(self):
37 return "foo"
38
39 class Foo2(object):
40 def __str__(self):
41 return "foo"
42
43 class Foo3(object):
44 def __str__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000045 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000046
Guido van Rossumea0ebd82007-05-15 21:10:24 +000047 class Foo4(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000048 def __str__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000049 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000050
51 class Foo5(str):
Guido van Rossumea0ebd82007-05-15 21:10:24 +000052 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000053 return "foo"
Brett Cannonc3647ac2005-04-26 03:45:26 +000054
Guido van Rossumea0ebd82007-05-15 21:10:24 +000055 class Foo6(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000056 def __str__(self):
57 return "foos"
58
59 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000060 return "foou"
Brett Cannonc3647ac2005-04-26 03:45:26 +000061
Guido van Rossumef87d6e2007-05-02 19:09:54 +000062 class Foo7(str):
Brett Cannonc3647ac2005-04-26 03:45:26 +000063 def __str__(self):
64 return "foos"
65 def __unicode__(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +000066 return "foou"
Brett Cannonc3647ac2005-04-26 03:45:26 +000067
68 class Foo8(str):
69 def __new__(cls, content=""):
70 return str.__new__(cls, 2*content)
71 def __str__(self):
72 return self
73
Guido van Rossumea0ebd82007-05-15 21:10:24 +000074 class Foo9(str8):
Brett Cannonc3647ac2005-04-26 03:45:26 +000075 def __str__(self):
76 return "string"
77 def __unicode__(self):
78 return "not unicode"
79
Brett Cannonc3647ac2005-04-26 03:45:26 +000080 self.assertEqual(str(Foo1()), "foo")
81 self.assertEqual(str(Foo2()), "foo")
82 self.assertEqual(str(Foo3()), "foo")
83 self.assertEqual(str(Foo4("bar")), "foo")
84 self.assertEqual(str(Foo5("bar")), "foo")
Guido van Rossumea0ebd82007-05-15 21:10:24 +000085 self.assertEqual(str8(Foo6("bar")), "foos")
86 self.assertEqual(str(Foo6("bar")), "foou")
87 self.assertEqual(str8(Foo7("bar")), "foos")
88 self.assertEqual(str(Foo7("bar")), "foou")
Brett Cannonc3647ac2005-04-26 03:45:26 +000089 self.assertEqual(str(Foo8("foo")), "foofoo")
Guido van Rossumea0ebd82007-05-15 21:10:24 +000090 self.assertEqual(str8(Foo9("foo")), "string")
Guido van Rossumef87d6e2007-05-02 19:09:54 +000091 self.assertEqual(str(Foo9("foo")), "not unicode")
Brett Cannonc3647ac2005-04-26 03:45:26 +000092
Guido van Rossumcd16bf62007-06-13 18:07:49 +000093 def test_expandtabs_overflows_gracefully(self):
94 # This test only affects 32-bit platforms because expandtabs can only take
95 # an int as the max value, not a 64-bit C long. If expandtabs is changed
96 # to take a 64-bit long, this test should apply to all platforms.
97 if sys.maxint > (1 << 32) or struct.calcsize('P') != 4:
98 return
99 self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxint)
100
101
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000102def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000103 test_support.run_unittest(StrTest)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000104
105if __name__ == "__main__":
106 test_main()