test_str.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. import unittest
  2. import struct
  3. import sys
  4. from test import test_support, string_tests
  5. class StrSubclass(str):
  6. pass
  7. class StrTest(
  8. string_tests.CommonTest,
  9. string_tests.MixinStrUnicodeUserStringTest,
  10. string_tests.MixinStrUserStringTest,
  11. string_tests.MixinStrUnicodeTest,
  12. ):
  13. type2test = str
  14. # We don't need to propagate to str
  15. def fixtype(self, obj):
  16. return obj
  17. def test_basic_creation(self):
  18. self.assertEqual(str(''), '')
  19. self.assertEqual(str(0), '0')
  20. self.assertEqual(str(0L), '0')
  21. self.assertEqual(str(()), '()')
  22. self.assertEqual(str([]), '[]')
  23. self.assertEqual(str({}), '{}')
  24. a = []
  25. a.append(a)
  26. self.assertEqual(str(a), '[[...]]')
  27. a = {}
  28. a[0] = a
  29. self.assertEqual(str(a), '{0: {...}}')
  30. def test_formatting(self):
  31. string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
  32. self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
  33. @test_support.cpython_only
  34. def test_formatting_huge_precision(self):
  35. from _testcapi import INT_MAX
  36. format_string = "%.{}f".format(INT_MAX + 1)
  37. with self.assertRaises(ValueError):
  38. result = format_string % 2.34
  39. def test_formatting_huge_width(self):
  40. format_string = "%{}f".format(sys.maxsize + 1)
  41. with self.assertRaises(ValueError):
  42. result = format_string % 2.34
  43. def test_conversion(self):
  44. # Make sure __str__() behaves properly
  45. class Foo0:
  46. def __unicode__(self):
  47. return u"foo"
  48. class Foo1:
  49. def __str__(self):
  50. return "foo"
  51. class Foo2(object):
  52. def __str__(self):
  53. return "foo"
  54. class Foo3(object):
  55. def __str__(self):
  56. return u"foo"
  57. class Foo4(unicode):
  58. def __str__(self):
  59. return u"foo"
  60. class Foo5(str):
  61. def __str__(self):
  62. return u"foo"
  63. class Foo6(str):
  64. def __str__(self):
  65. return "foos"
  66. def __unicode__(self):
  67. return u"foou"
  68. class Foo7(unicode):
  69. def __str__(self):
  70. return "foos"
  71. def __unicode__(self):
  72. return u"foou"
  73. class Foo8(str):
  74. def __new__(cls, content=""):
  75. return str.__new__(cls, 2*content)
  76. def __str__(self):
  77. return self
  78. class Foo9(str):
  79. def __str__(self):
  80. return "string"
  81. def __unicode__(self):
  82. return "not unicode"
  83. self.assertTrue(str(Foo0()).startswith("<")) # this is different from __unicode__
  84. self.assertEqual(str(Foo1()), "foo")
  85. self.assertEqual(str(Foo2()), "foo")
  86. self.assertEqual(str(Foo3()), "foo")
  87. self.assertEqual(str(Foo4("bar")), "foo")
  88. self.assertEqual(str(Foo5("bar")), "foo")
  89. self.assertEqual(str(Foo6("bar")), "foos")
  90. self.assertEqual(str(Foo7("bar")), "foos")
  91. self.assertEqual(str(Foo8("foo")), "foofoo")
  92. self.assertIs(type(str(Foo8("foo"))), Foo8)
  93. self.assertEqual(StrSubclass(Foo8("foo")), "foofoo")
  94. self.assertIs(type(StrSubclass(Foo8("foo"))), StrSubclass)
  95. self.assertEqual(str(Foo9("foo")), "string")
  96. self.assertEqual(unicode(Foo9("foo")), u"not unicode")
  97. # This test only affects 32-bit platforms because expandtabs can only take
  98. # an int as the max value, not a 64-bit C long. If expandtabs is changed
  99. # to take a 64-bit long, this test should apply to all platforms.
  100. @unittest.skipIf(sys.maxint > (1 << 32) or struct.calcsize('P') != 4,
  101. 'only applies to 32-bit platforms')
  102. def test_expandtabs_overflows_gracefully(self):
  103. self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxint)
  104. def test__format__(self):
  105. def test(value, format, expected):
  106. # test both with and without the trailing 's'
  107. self.assertEqual(value.__format__(format), expected)
  108. self.assertEqual(value.__format__(format + 's'), expected)
  109. test('', '', '')
  110. test('abc', '', 'abc')
  111. test('abc', '.3', 'abc')
  112. test('ab', '.3', 'ab')
  113. test('abcdef', '.3', 'abc')
  114. test('abcdef', '.0', '')
  115. test('abc', '3.3', 'abc')
  116. test('abc', '2.3', 'abc')
  117. test('abc', '2.2', 'ab')
  118. test('abc', '3.2', 'ab ')
  119. test('result', 'x<0', 'result')
  120. test('result', 'x<5', 'result')
  121. test('result', 'x<6', 'result')
  122. test('result', 'x<7', 'resultx')
  123. test('result', 'x<8', 'resultxx')
  124. test('result', ' <7', 'result ')
  125. test('result', '<7', 'result ')
  126. test('result', '>7', ' result')
  127. test('result', '>8', ' result')
  128. test('result', '^8', ' result ')
  129. test('result', '^9', ' result ')
  130. test('result', '^10', ' result ')
  131. test('a', '10000', 'a' + ' ' * 9999)
  132. test('', '10000', ' ' * 10000)
  133. test('', '10000000', ' ' * 10000000)
  134. def test_format(self):
  135. self.assertEqual(''.format(), '')
  136. self.assertEqual('a'.format(), 'a')
  137. self.assertEqual('ab'.format(), 'ab')
  138. self.assertEqual('a{{'.format(), 'a{')
  139. self.assertEqual('a}}'.format(), 'a}')
  140. self.assertEqual('{{b'.format(), '{b')
  141. self.assertEqual('}}b'.format(), '}b')
  142. self.assertEqual('a{{b'.format(), 'a{b')
  143. # examples from the PEP:
  144. import datetime
  145. self.assertEqual("My name is {0}".format('Fred'), "My name is Fred")
  146. self.assertEqual("My name is {0[name]}".format(dict(name='Fred')),
  147. "My name is Fred")
  148. self.assertEqual("My name is {0} :-{{}}".format('Fred'),
  149. "My name is Fred :-{}")
  150. d = datetime.date(2007, 8, 18)
  151. self.assertEqual("The year is {0.year}".format(d),
  152. "The year is 2007")
  153. # classes we'll use for testing
  154. class C:
  155. def __init__(self, x=100):
  156. self._x = x
  157. def __format__(self, spec):
  158. return spec
  159. class D:
  160. def __init__(self, x):
  161. self.x = x
  162. def __format__(self, spec):
  163. return str(self.x)
  164. # class with __str__, but no __format__
  165. class E:
  166. def __init__(self, x):
  167. self.x = x
  168. def __str__(self):
  169. return 'E(' + self.x + ')'
  170. # class with __repr__, but no __format__ or __str__
  171. class F:
  172. def __init__(self, x):
  173. self.x = x
  174. def __repr__(self):
  175. return 'F(' + self.x + ')'
  176. # class with __format__ that forwards to string, for some format_spec's
  177. class G:
  178. def __init__(self, x):
  179. self.x = x
  180. def __str__(self):
  181. return "string is " + self.x
  182. def __format__(self, format_spec):
  183. if format_spec == 'd':
  184. return 'G(' + self.x + ')'
  185. return object.__format__(self, format_spec)
  186. # class that returns a bad type from __format__
  187. class H:
  188. def __format__(self, format_spec):
  189. return 1.0
  190. class I(datetime.date):
  191. def __format__(self, format_spec):
  192. return self.strftime(format_spec)
  193. class J(int):
  194. def __format__(self, format_spec):
  195. return int.__format__(self * 2, format_spec)
  196. self.assertEqual(''.format(), '')
  197. self.assertEqual('abc'.format(), 'abc')
  198. self.assertEqual('{0}'.format('abc'), 'abc')
  199. self.assertEqual('{0:}'.format('abc'), 'abc')
  200. self.assertEqual('X{0}'.format('abc'), 'Xabc')
  201. self.assertEqual('{0}X'.format('abc'), 'abcX')
  202. self.assertEqual('X{0}Y'.format('abc'), 'XabcY')
  203. self.assertEqual('{1}'.format(1, 'abc'), 'abc')
  204. self.assertEqual('X{1}'.format(1, 'abc'), 'Xabc')
  205. self.assertEqual('{1}X'.format(1, 'abc'), 'abcX')
  206. self.assertEqual('X{1}Y'.format(1, 'abc'), 'XabcY')
  207. self.assertEqual('{0}'.format(-15), '-15')
  208. self.assertEqual('{0}{1}'.format(-15, 'abc'), '-15abc')
  209. self.assertEqual('{0}X{1}'.format(-15, 'abc'), '-15Xabc')
  210. self.assertEqual('{{'.format(), '{')
  211. self.assertEqual('}}'.format(), '}')
  212. self.assertEqual('{{}}'.format(), '{}')
  213. self.assertEqual('{{x}}'.format(), '{x}')
  214. self.assertEqual('{{{0}}}'.format(123), '{123}')
  215. self.assertEqual('{{{{0}}}}'.format(), '{{0}}')
  216. self.assertEqual('}}{{'.format(), '}{')
  217. self.assertEqual('}}x{{'.format(), '}x{')
  218. # weird field names
  219. self.assertEqual("{0[foo-bar]}".format({'foo-bar':'baz'}), 'baz')
  220. self.assertEqual("{0[foo bar]}".format({'foo bar':'baz'}), 'baz')
  221. self.assertEqual("{0[ ]}".format({' ':3}), '3')
  222. self.assertEqual('{foo._x}'.format(foo=C(20)), '20')
  223. self.assertEqual('{1}{0}'.format(D(10), D(20)), '2010')
  224. self.assertEqual('{0._x.x}'.format(C(D('abc'))), 'abc')
  225. self.assertEqual('{0[0]}'.format(['abc', 'def']), 'abc')
  226. self.assertEqual('{0[1]}'.format(['abc', 'def']), 'def')
  227. self.assertEqual('{0[1][0]}'.format(['abc', ['def']]), 'def')
  228. self.assertEqual('{0[1][0].x}'.format(['abc', [D('def')]]), 'def')
  229. # strings
  230. self.assertEqual('{0:.3s}'.format('abc'), 'abc')
  231. self.assertEqual('{0:.3s}'.format('ab'), 'ab')
  232. self.assertEqual('{0:.3s}'.format('abcdef'), 'abc')
  233. self.assertEqual('{0:.0s}'.format('abcdef'), '')
  234. self.assertEqual('{0:3.3s}'.format('abc'), 'abc')
  235. self.assertEqual('{0:2.3s}'.format('abc'), 'abc')
  236. self.assertEqual('{0:2.2s}'.format('abc'), 'ab')
  237. self.assertEqual('{0:3.2s}'.format('abc'), 'ab ')
  238. self.assertEqual('{0:x<0s}'.format('result'), 'result')
  239. self.assertEqual('{0:x<5s}'.format('result'), 'result')
  240. self.assertEqual('{0:x<6s}'.format('result'), 'result')
  241. self.assertEqual('{0:x<7s}'.format('result'), 'resultx')
  242. self.assertEqual('{0:x<8s}'.format('result'), 'resultxx')
  243. self.assertEqual('{0: <7s}'.format('result'), 'result ')
  244. self.assertEqual('{0:<7s}'.format('result'), 'result ')
  245. self.assertEqual('{0:>7s}'.format('result'), ' result')
  246. self.assertEqual('{0:>8s}'.format('result'), ' result')
  247. self.assertEqual('{0:^8s}'.format('result'), ' result ')
  248. self.assertEqual('{0:^9s}'.format('result'), ' result ')
  249. self.assertEqual('{0:^10s}'.format('result'), ' result ')
  250. self.assertEqual('{0:10000}'.format('a'), 'a' + ' ' * 9999)
  251. self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
  252. self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
  253. # format specifiers for user defined type
  254. self.assertEqual('{0:abc}'.format(C()), 'abc')
  255. # !r and !s coercions
  256. self.assertEqual('{0!s}'.format('Hello'), 'Hello')
  257. self.assertEqual('{0!s:}'.format('Hello'), 'Hello')
  258. self.assertEqual('{0!s:15}'.format('Hello'), 'Hello ')
  259. self.assertEqual('{0!s:15s}'.format('Hello'), 'Hello ')
  260. self.assertEqual('{0!r}'.format('Hello'), "'Hello'")
  261. self.assertEqual('{0!r:}'.format('Hello'), "'Hello'")
  262. self.assertEqual('{0!r}'.format(F('Hello')), 'F(Hello)')
  263. # test fallback to object.__format__
  264. self.assertEqual('{0}'.format({}), '{}')
  265. self.assertEqual('{0}'.format([]), '[]')
  266. self.assertEqual('{0}'.format([1]), '[1]')
  267. self.assertEqual('{0}'.format(E('data')), 'E(data)')
  268. self.assertEqual('{0:d}'.format(G('data')), 'G(data)')
  269. self.assertEqual('{0!s}'.format(G('data')), 'string is data')
  270. msg = 'object.__format__ with a non-empty format string is deprecated'
  271. with test_support.check_warnings((msg, PendingDeprecationWarning)):
  272. self.assertEqual('{0:^10}'.format(E('data')), ' E(data) ')
  273. self.assertEqual('{0:^10s}'.format(E('data')), ' E(data) ')
  274. self.assertEqual('{0:>15s}'.format(G('data')), ' string is data')
  275. self.assertEqual("{0:date: %Y-%m-%d}".format(I(year=2007,
  276. month=8,
  277. day=27)),
  278. "date: 2007-08-27")
  279. # test deriving from a builtin type and overriding __format__
  280. self.assertEqual("{0}".format(J(10)), "20")
  281. # string format specifiers
  282. self.assertEqual('{0:}'.format('a'), 'a')
  283. # computed format specifiers
  284. self.assertEqual("{0:.{1}}".format('hello world', 5), 'hello')
  285. self.assertEqual("{0:.{1}s}".format('hello world', 5), 'hello')
  286. self.assertEqual("{0:.{precision}s}".format('hello world', precision=5), 'hello')
  287. self.assertEqual("{0:{width}.{precision}s}".format('hello world', width=10, precision=5), 'hello ')
  288. self.assertEqual("{0:{width}.{precision}s}".format('hello world', width='10', precision='5'), 'hello ')
  289. # test various errors
  290. self.assertRaises(ValueError, '{'.format)
  291. self.assertRaises(ValueError, '}'.format)
  292. self.assertRaises(ValueError, 'a{'.format)
  293. self.assertRaises(ValueError, 'a}'.format)
  294. self.assertRaises(ValueError, '{a'.format)
  295. self.assertRaises(ValueError, '}a'.format)
  296. self.assertRaises(IndexError, '{0}'.format)
  297. self.assertRaises(IndexError, '{1}'.format, 'abc')
  298. self.assertRaises(KeyError, '{x}'.format)
  299. self.assertRaises(ValueError, "}{".format)
  300. self.assertRaises(ValueError, "{".format)
  301. self.assertRaises(ValueError, "}".format)
  302. self.assertRaises(ValueError, "abc{0:{}".format)
  303. self.assertRaises(ValueError, "{0".format)
  304. self.assertRaises(IndexError, "{0.}".format)
  305. self.assertRaises(ValueError, "{0.}".format, 0)
  306. self.assertRaises(IndexError, "{0[}".format)
  307. self.assertRaises(ValueError, "{0[}".format, [])
  308. self.assertRaises(KeyError, "{0]}".format)
  309. self.assertRaises(ValueError, "{0.[]}".format, 0)
  310. self.assertRaises(ValueError, "{0..foo}".format, 0)
  311. self.assertRaises(ValueError, "{0[0}".format, 0)
  312. self.assertRaises(ValueError, "{0[0:foo}".format, 0)
  313. self.assertRaises(KeyError, "{c]}".format)
  314. self.assertRaises(ValueError, "{{ {{{0}}".format, 0)
  315. self.assertRaises(ValueError, "{0}}".format, 0)
  316. self.assertRaises(KeyError, "{foo}".format, bar=3)
  317. self.assertRaises(ValueError, "{0!x}".format, 3)
  318. self.assertRaises(ValueError, "{0!}".format, 0)
  319. self.assertRaises(ValueError, "{0!rs}".format, 0)
  320. self.assertRaises(ValueError, "{!}".format)
  321. self.assertRaises(IndexError, "{:}".format)
  322. self.assertRaises(IndexError, "{:s}".format)
  323. self.assertRaises(IndexError, "{}".format)
  324. # issue 6089
  325. self.assertRaises(ValueError, "{0[0]x}".format, [None])
  326. self.assertRaises(ValueError, "{0[0](10)}".format, [None])
  327. # can't have a replacement on the field name portion
  328. self.assertRaises(TypeError, '{0[{1}]}'.format, 'abcdefg', 4)
  329. # exceed maximum recursion depth
  330. self.assertRaises(ValueError, "{0:{1:{2}}}".format, 'abc', 's', '')
  331. self.assertRaises(ValueError, "{0:{1:{2:{3:{4:{5:{6}}}}}}}".format,
  332. 0, 1, 2, 3, 4, 5, 6, 7)
  333. # string format spec errors
  334. self.assertRaises(ValueError, "{0:-s}".format, '')
  335. self.assertRaises(ValueError, format, "", "-")
  336. self.assertRaises(ValueError, "{0:=s}".format, '')
  337. def test_format_huge_precision(self):
  338. format_string = ".{}f".format(sys.maxsize + 1)
  339. with self.assertRaises(ValueError):
  340. result = format(2.34, format_string)
  341. def test_format_huge_width(self):
  342. format_string = "{}f".format(sys.maxsize + 1)
  343. with self.assertRaises(ValueError):
  344. result = format(2.34, format_string)
  345. def test_format_huge_item_number(self):
  346. format_string = "{{{}:.6f}}".format(sys.maxsize + 1)
  347. with self.assertRaises(ValueError):
  348. result = format_string.format(2.34)
  349. def test_format_auto_numbering(self):
  350. class C:
  351. def __init__(self, x=100):
  352. self._x = x
  353. def __format__(self, spec):
  354. return spec
  355. self.assertEqual('{}'.format(10), '10')
  356. self.assertEqual('{:5}'.format('s'), 's ')
  357. self.assertEqual('{!r}'.format('s'), "'s'")
  358. self.assertEqual('{._x}'.format(C(10)), '10')
  359. self.assertEqual('{[1]}'.format([1, 2]), '2')
  360. self.assertEqual('{[a]}'.format({'a':4, 'b':2}), '4')
  361. self.assertEqual('a{}b{}c'.format(0, 1), 'a0b1c')
  362. self.assertEqual('a{:{}}b'.format('x', '^10'), 'a x b')
  363. self.assertEqual('a{:{}x}b'.format(20, '#'), 'a0x14b')
  364. # can't mix and match numbering and auto-numbering
  365. self.assertRaises(ValueError, '{}{1}'.format, 1, 2)
  366. self.assertRaises(ValueError, '{1}{}'.format, 1, 2)
  367. self.assertRaises(ValueError, '{:{1}}'.format, 1, 2)
  368. self.assertRaises(ValueError, '{0:{}}'.format, 1, 2)
  369. # can mix and match auto-numbering and named
  370. self.assertEqual('{f}{}'.format(4, f='test'), 'test4')
  371. self.assertEqual('{}{f}'.format(4, f='test'), '4test')
  372. self.assertEqual('{:{f}}{g}{}'.format(1, 3, g='g', f=2), ' 1g3')
  373. self.assertEqual('{f:{}}{}{g}'.format(2, 4, f=1, g='g'), ' 14g')
  374. def test_format_c_overflow(self):
  375. # issue #7267
  376. self.assertRaises(OverflowError, '{0:c}'.format, -1)
  377. self.assertRaises(OverflowError, '{0:c}'.format, 256)
  378. def test_buffer_is_readonly(self):
  379. self.assertRaises(TypeError, sys.stdin.readinto, b"")
  380. def test_encode_and_decode_kwargs(self):
  381. self.assertEqual('abcde'.encode('ascii', 'replace'),
  382. 'abcde'.encode('ascii', errors='replace'))
  383. self.assertEqual('abcde'.encode('ascii', 'ignore'),
  384. 'abcde'.encode(encoding='ascii', errors='ignore'))
  385. self.assertEqual('Andr\202 x'.decode('ascii', 'ignore'),
  386. 'Andr\202 x'.decode('ascii', errors='ignore'))
  387. self.assertEqual('Andr\202 x'.decode('ascii', 'replace'),
  388. 'Andr\202 x'.decode(encoding='ascii', errors='replace'))
  389. def test_startswith_endswith_errors(self):
  390. with self.assertRaises(UnicodeDecodeError):
  391. '\xff'.startswith(u'x')
  392. with self.assertRaises(UnicodeDecodeError):
  393. '\xff'.endswith(u'x')
  394. for meth in ('foo'.startswith, 'foo'.endswith):
  395. with self.assertRaises(TypeError) as cm:
  396. meth(['f'])
  397. exc = str(cm.exception)
  398. self.assertIn('unicode', exc)
  399. self.assertIn('str', exc)
  400. self.assertIn('tuple', exc)
  401. def test_main():
  402. test_support.run_unittest(StrTest)
  403. if __name__ == "__main__":
  404. test_main()