blob: f4d3400b6e1cb3d780c41b218cd44f47d1dbe004 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Mark Dickinsonad731b92009-11-09 17:12:30 +00003import platform
Georg Brandl1b37e872010-03-14 10:45:50 +00004import unittest
Benjamin Peterson076e0312010-08-23 21:58:59 +00005import sys
6import warnings
7import collections
8import io
Antoine Pitrou0d776b12011-11-06 00:34:26 +01009import os
Georg Brandl8334fd92010-12-04 10:26:46 +000010import ast
Benjamin Peterson076e0312010-08-23 21:58:59 +000011import types
12import builtins
13import random
Antoine Pitrou413d4972011-11-06 02:51:25 +010014import traceback
Brett Cannon77628992010-03-20 20:59:33 +000015from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000016from operator import neg
Antoine Pitrou0d776b12011-11-06 00:34:26 +010017try:
Antoine Pitrou413d4972011-11-06 02:51:25 +010018 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010019except ImportError:
Antoine Pitrou413d4972011-11-06 02:51:25 +010020 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000021
Guido van Rossum3bead091992-01-27 17:00:37 +000022
Walter Dörwald919497e2003-01-19 16:23:59 +000023class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000024
Walter Dörwald919497e2003-01-19 16:23:59 +000025 def __init__(self, max):
26 self.max = max
27 self.sofar = []
28
29 def __len__(self): return len(self.sofar)
30
31 def __getitem__(self, i):
32 if not 0 <= i < self.max: raise IndexError
33 n = len(self.sofar)
34 while n <= i:
35 self.sofar.append(n*n)
36 n += 1
37 return self.sofar[i]
38
39class StrSquares:
40
41 def __init__(self, max):
42 self.max = max
43 self.sofar = []
44
45 def __len__(self):
46 return len(self.sofar)
47
48 def __getitem__(self, i):
49 if not 0 <= i < self.max:
50 raise IndexError
51 n = len(self.sofar)
52 while n <= i:
53 self.sofar.append(str(n*n))
54 n += 1
55 return self.sofar[i]
56
57class BitBucket:
58 def write(self, line):
59 pass
60
Facundo Batista2336bdd2008-01-19 19:12:01 +000061test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000062 ('0', 0),
63 ('1', 1),
64 ('9', 9),
65 ('10', 10),
66 ('99', 99),
67 ('100', 100),
68 ('314', 314),
69 (' 314', 314),
70 ('314 ', 314),
71 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000072 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000073 (' 1x', ValueError),
74 (' 1 ', 1),
75 (' 1\02 ', ValueError),
76 ('', ValueError),
77 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000078 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000079 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000080 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000081]
82
Facundo Batista2336bdd2008-01-19 19:12:01 +000083test_conv_sign = [
84 ('0', 0),
85 ('1', 1),
86 ('9', 9),
87 ('10', 10),
88 ('99', 99),
89 ('100', 100),
90 ('314', 314),
91 (' 314', ValueError),
92 ('314 ', 314),
93 (' \t\t 314 \t\t ', ValueError),
94 (repr(sys.maxsize), sys.maxsize),
95 (' 1x', ValueError),
96 (' 1 ', ValueError),
97 (' 1\02 ', ValueError),
98 ('', ValueError),
99 (' ', ValueError),
100 (' \t\t ', ValueError),
101 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
102 (chr(0x200), ValueError),
103]
104
Raymond Hettinger96229b12005-03-11 06:49:40 +0000105class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000106 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000107 raise RuntimeError
108
109class TestFailingIter:
110 def __iter__(self):
111 raise RuntimeError
112
Walter Dörwald919497e2003-01-19 16:23:59 +0000113class BuiltinTest(unittest.TestCase):
114
115 def test_import(self):
116 __import__('sys')
117 __import__('time')
118 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000119 __import__(name='sys')
120 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000121 self.assertRaises(ImportError, __import__, 'spamspam')
122 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000123 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000124 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000125
126 def test_abs(self):
127 # int
128 self.assertEqual(abs(0), 0)
129 self.assertEqual(abs(1234), 1234)
130 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000131 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000132 # float
133 self.assertEqual(abs(0.0), 0.0)
134 self.assertEqual(abs(3.14), 3.14)
135 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000136 # str
137 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000138 # bool
139 self.assertEqual(abs(True), 1)
140 self.assertEqual(abs(False), 0)
141 # other
142 self.assertRaises(TypeError, abs)
143 self.assertRaises(TypeError, abs, None)
144 class AbsClass(object):
145 def __abs__(self):
146 return -5
147 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000148
Raymond Hettinger96229b12005-03-11 06:49:40 +0000149 def test_all(self):
150 self.assertEqual(all([2, 4, 6]), True)
151 self.assertEqual(all([2, None, 6]), False)
152 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
153 self.assertRaises(RuntimeError, all, TestFailingIter())
154 self.assertRaises(TypeError, all, 10) # Non-iterable
155 self.assertRaises(TypeError, all) # No args
156 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
157 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200158 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000159 S = [50, 60]
160 self.assertEqual(all(x > 42 for x in S), True)
161 S = [50, 40, 60]
162 self.assertEqual(all(x > 42 for x in S), False)
163
164 def test_any(self):
165 self.assertEqual(any([None, None, None]), False)
166 self.assertEqual(any([None, 4, None]), True)
167 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500168 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000169 self.assertRaises(TypeError, any, 10) # Non-iterable
170 self.assertRaises(TypeError, any) # No args
171 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
172 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200173 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000174 S = [40, 60, 30]
175 self.assertEqual(any(x > 42 for x in S), True)
176 S = [10, 20, 30]
177 self.assertEqual(any(x > 42 for x in S), False)
178
Georg Brandl559e5d72008-06-11 18:37:52 +0000179 def test_ascii(self):
180 self.assertEqual(ascii(''), '\'\'')
181 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000182 self.assertEqual(ascii(()), '()')
183 self.assertEqual(ascii([]), '[]')
184 self.assertEqual(ascii({}), '{}')
185 a = []
186 a.append(a)
187 self.assertEqual(ascii(a), '[[...]]')
188 a = {}
189 a[0] = a
190 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000191 # Advanced checks for unicode strings
192 def _check_uni(s):
193 self.assertEqual(ascii(s), repr(s))
194 _check_uni("'")
195 _check_uni('"')
196 _check_uni('"\'')
197 _check_uni('\0')
198 _check_uni('\r\n\t .')
199 # Unprintable non-ASCII characters
200 _check_uni('\x85')
201 _check_uni('\u1fff')
202 _check_uni('\U00012fff')
203 # Lone surrogates
204 _check_uni('\ud800')
205 _check_uni('\udfff')
206 # Issue #9804: surrogates should be joined even for printable
207 # wide characters (UCS-2 builds).
208 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
209 # All together
210 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
211 self.assertEqual(ascii(s),
212 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000213
Thomas Wouters89f507f2006-12-13 04:49:30 +0000214 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000215 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000216 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000217 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000218
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000220 self.assertTrue(callable(len))
221 self.assertFalse(callable("a"))
222 self.assertTrue(callable(callable))
223 self.assertTrue(callable(lambda x, y: x + y))
224 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000226 self.assertTrue(callable(f))
227
228 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000229 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000230 self.assertTrue(callable(C1))
231 c = C1()
232 self.assertTrue(callable(c.meth))
233 self.assertFalse(callable(c))
234
235 # __call__ is looked up on the class, not the instance
236 c.__call__ = None
237 self.assertFalse(callable(c))
238 c.__call__ = lambda self: 0
239 self.assertFalse(callable(c))
240 del c.__call__
241 self.assertFalse(callable(c))
242
243 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000244 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000245 c2 = C2()
246 self.assertTrue(callable(c2))
247 c2.__call__ = None
248 self.assertTrue(callable(c2))
249 class C3(C2): pass
250 c3 = C3()
251 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000252
253 def test_chr(self):
254 self.assertEqual(chr(32), ' ')
255 self.assertEqual(chr(65), 'A')
256 self.assertEqual(chr(97), 'a')
257 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000258 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000259 self.assertEqual(chr(sys.maxunicode),
260 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
261 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000262 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000263 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
264 self.assertEqual(chr(0x00010000), "\U00010000")
265 self.assertEqual(chr(0x00010001), "\U00010001")
266 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
267 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
268 self.assertEqual(chr(0x00100000), "\U00100000")
269 self.assertEqual(chr(0x00100001), "\U00100001")
270 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
271 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
272 self.assertRaises(ValueError, chr, -1)
273 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000274 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000275
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000276 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000277 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000278
Walter Dörwald919497e2003-01-19 16:23:59 +0000279 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000280 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000281 bom = b'\xef\xbb\xbf'
282 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000283 compile(source='pass', filename='?', mode='exec')
284 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
285 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000286 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000287 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000288 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
289 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000290 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000291 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
292 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000293 compile('print("\xe5")\n', '', 'exec')
294 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
295 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296
Georg Brandl8334fd92010-12-04 10:26:46 +0000297 # test the optimize argument
298
299 codestr = '''def f():
300 """doc"""
301 try:
302 assert False
303 except AssertionError:
304 return (True, f.__doc__)
305 else:
306 return (False, f.__doc__)
307 '''
308 def f(): """doc"""
309 values = [(-1, __debug__, f.__doc__),
310 (0, True, 'doc'),
311 (1, False, 'doc'),
312 (2, False, None)]
313 for optval, debugval, docstring in values:
314 # test both direct compilation and compilation via AST
315 codeobjs = []
316 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
317 tree = ast.parse(codestr)
318 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
319 for code in codeobjs:
320 ns = {}
321 exec(code, ns)
322 rv = ns['f']()
323 self.assertEqual(rv, (debugval, docstring))
324
Walter Dörwald919497e2003-01-19 16:23:59 +0000325 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000326 sys.spam = 1
327 delattr(sys, 'spam')
328 self.assertRaises(TypeError, delattr)
329
330 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000331 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 self.assertRaises(TypeError, dir, 42, 42)
333
Georg Brandle32b4222007-03-10 22:13:27 +0000334 # dir() - local scope
335 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000336 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000337
338 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000339 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000340
341 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000342 class Foo(types.ModuleType):
343 __dict__ = 8
344 f = Foo("foo")
345 self.assertRaises(TypeError, dir, f)
346
347 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000348 self.assertIn("strip", dir(str))
349 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000350
351 # dir(obj)
352 class Foo(object):
353 def __init__(self):
354 self.x = 7
355 self.y = 8
356 self.z = 9
357 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000358 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000359
360 # dir(obj_no__dict__)
361 class Foo(object):
362 __slots__ = []
363 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000364 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000365
366 # dir(obj_no__class__with__dict__)
367 # (an ugly trick to cause getattr(f, "__class__") to fail)
368 class Foo(object):
369 __slots__ = ["__class__", "__dict__"]
370 def __init__(self):
371 self.bar = "wow"
372 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000373 self.assertNotIn("__repr__", dir(f))
374 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000375
376 # dir(obj_using __dir__)
377 class Foo(object):
378 def __dir__(self):
379 return ["kan", "ga", "roo"]
380 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000381 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000382
383 # dir(obj__dir__not_list)
384 class Foo(object):
385 def __dir__(self):
386 return 7
387 f = Foo()
388 self.assertRaises(TypeError, dir, f)
389
Collin Winter3eed7652007-08-14 17:53:54 +0000390 # dir(traceback)
391 try:
392 raise IndexError
393 except:
394 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
395
396
Walter Dörwald919497e2003-01-19 16:23:59 +0000397 def test_divmod(self):
398 self.assertEqual(divmod(12, 7), (1, 5))
399 self.assertEqual(divmod(-12, 7), (-2, 2))
400 self.assertEqual(divmod(12, -7), (-2, -2))
401 self.assertEqual(divmod(-12, -7), (1, -5))
402
Mark Dickinson5c2db372009-12-05 20:28:34 +0000403 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000404
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000405 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
406 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
407 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
408 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000409
410 self.assertRaises(TypeError, divmod)
411
412 def test_eval(self):
413 self.assertEqual(eval('1+1'), 2)
414 self.assertEqual(eval(' 1+1\n'), 2)
415 globals = {'a': 1, 'b': 2}
416 locals = {'b': 200, 'c': 300}
417 self.assertEqual(eval('a', globals) , 1)
418 self.assertEqual(eval('a', globals, locals), 1)
419 self.assertEqual(eval('b', globals, locals), 200)
420 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000421 globals = {'a': 1, 'b': 2}
422 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000423 bom = b'\xef\xbb\xbf'
424 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000425 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000426 self.assertRaises(TypeError, eval)
427 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000428 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000429
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000430 def test_general_eval(self):
431 # Tests that general mappings can be used for the locals argument
432
433 class M:
434 "Test mapping interface versus possible calls from eval()."
435 def __getitem__(self, key):
436 if key == 'a':
437 return 12
438 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000439 def keys(self):
440 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000441
442 m = M()
443 g = globals()
444 self.assertEqual(eval('a', g, m), 12)
445 self.assertRaises(NameError, eval, 'b', g, m)
446 self.assertEqual(eval('dir()', g, m), list('xyz'))
447 self.assertEqual(eval('globals()', g, m), g)
448 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000449 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000450 class A:
451 "Non-mapping"
452 pass
453 m = A()
454 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000455
456 # Verify that dict subclasses work as well
457 class D(dict):
458 def __getitem__(self, key):
459 if key == 'a':
460 return 12
461 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000462 def keys(self):
463 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000464
465 d = D()
466 self.assertEqual(eval('a', g, d), 12)
467 self.assertRaises(NameError, eval, 'b', g, d)
468 self.assertEqual(eval('dir()', g, d), list('xyz'))
469 self.assertEqual(eval('globals()', g, d), g)
470 self.assertEqual(eval('locals()', g, d), d)
471
472 # Verify locals stores (used by list comps)
473 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000474 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000475
476 class SpreadSheet:
477 "Sample application showing nested, calculated lookups."
478 _cells = {}
479 def __setitem__(self, key, formula):
480 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000481 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000482 return eval(self._cells[key], globals(), self)
483
484 ss = SpreadSheet()
485 ss['a1'] = '5'
486 ss['a2'] = 'a1*6'
487 ss['a3'] = 'a2*7'
488 self.assertEqual(ss['a3'], 210)
489
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000490 # Verify that dir() catches a non-list returned by eval
491 # SF bug #1004669
492 class C:
493 def __getitem__(self, item):
494 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000495 def keys(self):
496 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000497 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
498
Georg Brandl7cae87c2006-09-06 06:51:57 +0000499 def test_exec(self):
500 g = {}
501 exec('z = 1', g)
502 if '__builtins__' in g:
503 del g['__builtins__']
504 self.assertEqual(g, {'z': 1})
505
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000506 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000507 if '__builtins__' in g:
508 del g['__builtins__']
509 self.assertEqual(g, {'z': 2})
510 g = {}
511 l = {}
512
Brett Cannon77628992010-03-20 20:59:33 +0000513 with check_warnings():
514 warnings.filterwarnings("ignore", "global statement",
515 module="<string>")
516 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000517 if '__builtins__' in g:
518 del g['__builtins__']
519 if '__builtins__' in l:
520 del l['__builtins__']
521 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
522
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000523 def test_exec_redirected(self):
524 savestdout = sys.stdout
525 sys.stdout = None # Whatever that cannot flush()
526 try:
527 # Used to raise SystemError('error return without exception set')
528 exec('a')
529 except NameError:
530 pass
531 finally:
532 sys.stdout = savestdout
533
Walter Dörwald919497e2003-01-19 16:23:59 +0000534 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000535 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
536 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
537 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
538 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
539 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000540 def identity(item):
541 return 1
542 filter(identity, Squares(5))
543 self.assertRaises(TypeError, filter)
544 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000545 def __getitem__(self, index):
546 if index<4:
547 return 42
548 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000549 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000550 def badfunc():
551 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000552 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000553
Walter Dörwaldbf517072003-01-27 15:57:14 +0000554 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000555 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
556 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
557 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000558
Walter Dörwald919497e2003-01-19 16:23:59 +0000559 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000560 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000561 self.assertRaises(TypeError, getattr, sys, 1)
562 self.assertRaises(TypeError, getattr, sys, 1, "foo")
563 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000564 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000565 # unicode surrogates are not encodable to the default encoding (utf8)
566 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000567
568 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000569 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000570 self.assertRaises(TypeError, hasattr, sys, 1)
571 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000572 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000573
Benjamin Peterson17689992010-08-24 03:26:23 +0000574 # Check that hasattr propagates all exceptions outside of
575 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000576 class A:
577 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000578 raise SystemExit
579 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000580 class B:
581 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000582 raise ValueError
583 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000584
Walter Dörwald919497e2003-01-19 16:23:59 +0000585 def test_hash(self):
586 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000587 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000588 self.assertEqual(hash(1), hash(1.0))
589 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000590 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000591 hash((0,1,2,3))
592 def f(): pass
593 self.assertRaises(TypeError, hash, [])
594 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000595 # Bug 1536021: Allow hash to return long objects
596 class X:
597 def __hash__(self):
598 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000599 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000600 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000601 def __hash__(self):
602 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000603 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000604
605 def test_hex(self):
606 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000607 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000608 self.assertRaises(TypeError, hex, {})
609
610 def test_id(self):
611 id(None)
612 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000613 id(1.0)
614 id('spam')
615 id((0,1,2,3))
616 id([0,1,2,3])
617 id({'spam': 1, 'eggs': 2, 'ham': 3})
618
Guido van Rossuma88a0332007-02-26 16:59:55 +0000619 # Test input() later, alphabetized as if it were raw_input
620
Walter Dörwald919497e2003-01-19 16:23:59 +0000621 def test_iter(self):
622 self.assertRaises(TypeError, iter)
623 self.assertRaises(TypeError, iter, 42, 42)
624 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000625 for l in lists:
626 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000627 self.assertEqual(next(i), '1')
628 self.assertEqual(next(i), '2')
629 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000630
631 def test_isinstance(self):
632 class C:
633 pass
634 class D(C):
635 pass
636 class E:
637 pass
638 c = C()
639 d = D()
640 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000641 self.assertTrue(isinstance(c, C))
642 self.assertTrue(isinstance(d, C))
643 self.assertTrue(not isinstance(e, C))
644 self.assertTrue(not isinstance(c, D))
645 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000646 self.assertRaises(TypeError, isinstance, E, 'foo')
647 self.assertRaises(TypeError, isinstance)
648
649 def test_issubclass(self):
650 class C:
651 pass
652 class D(C):
653 pass
654 class E:
655 pass
656 c = C()
657 d = D()
658 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000659 self.assertTrue(issubclass(D, C))
660 self.assertTrue(issubclass(C, C))
661 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000662 self.assertRaises(TypeError, issubclass, 'foo', E)
663 self.assertRaises(TypeError, issubclass, E, 'foo')
664 self.assertRaises(TypeError, issubclass)
665
666 def test_len(self):
667 self.assertEqual(len('123'), 3)
668 self.assertEqual(len(()), 0)
669 self.assertEqual(len((1, 2, 3, 4)), 4)
670 self.assertEqual(len([1, 2, 3, 4]), 4)
671 self.assertEqual(len({}), 0)
672 self.assertEqual(len({'a':1, 'b': 2}), 2)
673 class BadSeq:
674 def __len__(self):
675 raise ValueError
676 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000677 class InvalidLen:
678 def __len__(self):
679 return None
680 self.assertRaises(TypeError, len, InvalidLen())
681 class FloatLen:
682 def __len__(self):
683 return 4.5
684 self.assertRaises(TypeError, len, FloatLen())
685 class HugeLen:
686 def __len__(self):
687 return sys.maxsize + 1
688 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000689 class NoLenMethod(object): pass
690 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000691
Walter Dörwald919497e2003-01-19 16:23:59 +0000692 def test_map(self):
693 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000694 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000695 [1, 4, 9]
696 )
697 try:
698 from math import sqrt
699 except ImportError:
700 def sqrt(x):
701 return pow(x, 0.5)
702 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000703 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000704 [[4.0, 2.0], [9.0, 3.0]]
705 )
706 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000707 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000708 [10, 4, 6]
709 )
710
711 def plus(*v):
712 accu = 0
713 for i in v: accu = accu + i
714 return accu
715 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000716 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000717 [1, 3, 7]
718 )
719 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000720 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000721 [1+4, 3+9, 7+2]
722 )
723 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000724 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000725 [1+4+1, 3+9+1, 7+2+0]
726 )
727 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000728 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000729 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
730 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000731 def Max(a, b):
732 if a is None:
733 return b
734 if b is None:
735 return a
736 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000737 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000738 list(map(Max, Squares(3), Squares(2))),
739 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000740 )
741 self.assertRaises(TypeError, map)
742 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000743 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000744 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000745 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000746 yield None
747 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000748 def badfunc(x):
749 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000750 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000751
752 def test_max(self):
753 self.assertEqual(max('123123'), '3')
754 self.assertEqual(max(1, 2, 3), 3)
755 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
756 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
757
Guido van Rossume2a383d2007-01-15 16:59:06 +0000758 self.assertEqual(max(1, 2, 3.0), 3.0)
759 self.assertEqual(max(1, 2.0, 3), 3)
760 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000761
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000762 for stmt in (
763 "max(key=int)", # no args
764 "max(1, key=int)", # single arg not iterable
765 "max(1, 2, keystone=int)", # wrong keyword
766 "max(1, 2, key=int, abc=int)", # two many keywords
767 "max(1, 2, key=1)", # keyfunc is not callable
768 ):
Tim Peters7f061872004-12-07 21:17:46 +0000769 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000770 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000771 except TypeError:
772 pass
773 else:
774 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000775
776 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
777 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
778 self.assertEqual(max(1, 2, key=neg), 1) # two elems
779
780 data = [random.randrange(200) for i in range(100)]
781 keys = dict((elem, random.randrange(50)) for elem in data)
782 f = keys.__getitem__
783 self.assertEqual(max(data, key=f),
784 sorted(reversed(data), key=f)[-1])
785
Walter Dörwald919497e2003-01-19 16:23:59 +0000786 def test_min(self):
787 self.assertEqual(min('123123'), '1')
788 self.assertEqual(min(1, 2, 3), 1)
789 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
790 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
791
Guido van Rossume2a383d2007-01-15 16:59:06 +0000792 self.assertEqual(min(1, 2, 3.0), 1)
793 self.assertEqual(min(1, 2.0, 3), 1)
794 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000795
796 self.assertRaises(TypeError, min)
797 self.assertRaises(TypeError, min, 42)
798 self.assertRaises(ValueError, min, ())
799 class BadSeq:
800 def __getitem__(self, index):
801 raise ValueError
802 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000803
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000804 for stmt in (
805 "min(key=int)", # no args
806 "min(1, key=int)", # single arg not iterable
807 "min(1, 2, keystone=int)", # wrong keyword
808 "min(1, 2, key=int, abc=int)", # two many keywords
809 "min(1, 2, key=1)", # keyfunc is not callable
810 ):
Tim Peters7f061872004-12-07 21:17:46 +0000811 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000812 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000813 except TypeError:
814 pass
815 else:
816 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000817
818 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
819 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
820 self.assertEqual(min(1, 2, key=neg), 2) # two elems
821
822 data = [random.randrange(200) for i in range(100)]
823 keys = dict((elem, random.randrange(50)) for elem in data)
824 f = keys.__getitem__
825 self.assertEqual(min(data, key=f),
826 sorted(data, key=f)[0])
827
Georg Brandla18af4e2007-04-21 15:47:16 +0000828 def test_next(self):
829 it = iter(range(2))
830 self.assertEqual(next(it), 0)
831 self.assertEqual(next(it), 1)
832 self.assertRaises(StopIteration, next, it)
833 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000834 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000835
836 class Iter(object):
837 def __iter__(self):
838 return self
839 def __next__(self):
840 raise StopIteration
841
842 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000843 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000844 self.assertRaises(StopIteration, next, it)
845
846 def gen():
847 yield 1
848 return
849
850 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000851 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000852 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000853 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000854
Walter Dörwald919497e2003-01-19 16:23:59 +0000855 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000856 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000857 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000858 self.assertRaises(TypeError, oct, ())
859
860 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000861 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000862 fp = open(TESTFN, 'w')
863 try:
864 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000865 fp.write('The quick brown fox jumps over the lazy dog')
866 fp.write('.\n')
867 fp.write('Dear John\n')
868 fp.write('XXX'*100)
869 fp.write('YYY'*100)
870 finally:
871 fp.close()
872
873 def test_open(self):
874 self.write_testfile()
875 fp = open(TESTFN, 'r')
876 try:
877 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000878 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
879 self.assertEqual(fp.readline(4), 'Dear')
880 self.assertEqual(fp.readline(100), ' John\n')
881 self.assertEqual(fp.read(300), 'XXX'*100)
882 self.assertEqual(fp.read(1000), 'YYY'*100)
883 finally:
884 fp.close()
885 unlink(TESTFN)
886
887 def test_ord(self):
888 self.assertEqual(ord(' '), 32)
889 self.assertEqual(ord('A'), 65)
890 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000891 self.assertEqual(ord('\x80'), 128)
892 self.assertEqual(ord('\xff'), 255)
893
894 self.assertEqual(ord(b' '), 32)
895 self.assertEqual(ord(b'A'), 65)
896 self.assertEqual(ord(b'a'), 97)
897 self.assertEqual(ord(b'\x80'), 128)
898 self.assertEqual(ord(b'\xff'), 255)
899
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000900 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000901 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000902
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000903 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
904 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
905 self.assertEqual(ord("\U00010000"), 0x00010000)
906 self.assertEqual(ord("\U00010001"), 0x00010001)
907 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
908 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
909 self.assertEqual(ord("\U00100000"), 0x00100000)
910 self.assertEqual(ord("\U00100001"), 0x00100001)
911 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
912 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
913
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 def test_pow(self):
915 self.assertEqual(pow(0,0), 1)
916 self.assertEqual(pow(0,1), 0)
917 self.assertEqual(pow(1,0), 1)
918 self.assertEqual(pow(1,1), 1)
919
920 self.assertEqual(pow(2,0), 1)
921 self.assertEqual(pow(2,10), 1024)
922 self.assertEqual(pow(2,20), 1024*1024)
923 self.assertEqual(pow(2,30), 1024*1024*1024)
924
925 self.assertEqual(pow(-2,0), 1)
926 self.assertEqual(pow(-2,1), -2)
927 self.assertEqual(pow(-2,2), 4)
928 self.assertEqual(pow(-2,3), -8)
929
Walter Dörwald919497e2003-01-19 16:23:59 +0000930 self.assertAlmostEqual(pow(0.,0), 1.)
931 self.assertAlmostEqual(pow(0.,1), 0.)
932 self.assertAlmostEqual(pow(1.,0), 1.)
933 self.assertAlmostEqual(pow(1.,1), 1.)
934
935 self.assertAlmostEqual(pow(2.,0), 1.)
936 self.assertAlmostEqual(pow(2.,10), 1024.)
937 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
938 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
939
940 self.assertAlmostEqual(pow(-2.,0), 1.)
941 self.assertAlmostEqual(pow(-2.,1), -2.)
942 self.assertAlmostEqual(pow(-2.,2), 4.)
943 self.assertAlmostEqual(pow(-2.,3), -8.)
944
Mark Dickinson5c2db372009-12-05 20:28:34 +0000945 for x in 2, 2.0:
946 for y in 10, 10.0:
947 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000948 if isinstance(x, float) or \
949 isinstance(y, float) or \
950 isinstance(z, float):
951 self.assertRaises(TypeError, pow, x, y, z)
952 else:
953 self.assertAlmostEqual(pow(x, y, z), 24.0)
954
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000955 self.assertAlmostEqual(pow(-1, 0.5), 1j)
956 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
957
Walter Dörwald919497e2003-01-19 16:23:59 +0000958 self.assertRaises(TypeError, pow, -1, -2, 3)
959 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000960
961 self.assertRaises(TypeError, pow)
962
Guido van Rossuma88a0332007-02-26 16:59:55 +0000963 def test_input(self):
964 self.write_testfile()
965 fp = open(TESTFN, 'r')
966 savestdin = sys.stdin
967 savestdout = sys.stdout # Eats the echo
968 try:
969 sys.stdin = fp
970 sys.stdout = BitBucket()
971 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000972 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
973 self.assertEqual(input('testing\n'), 'Dear John')
974
975 # SF 1535165: don't segfault on closed stdin
976 # sys.stdout must be a regular file for triggering
977 sys.stdout = savestdout
978 sys.stdin.close()
979 self.assertRaises(ValueError, input)
980
981 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000982 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000983 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000984 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000985 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000986 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000987 self.assertRaises(EOFError, input)
988
989 del sys.stdout
990 self.assertRaises(RuntimeError, input, 'prompt')
991 del sys.stdin
992 self.assertRaises(RuntimeError, input, 'prompt')
993 finally:
994 sys.stdin = savestdin
995 sys.stdout = savestdout
996 fp.close()
997 unlink(TESTFN)
998
Antoine Pitrou413d4972011-11-06 02:51:25 +0100999 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001000 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001001 if not sys.stdin.isatty() or not sys.stdout.isatty():
1002 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001003 r, w = os.pipe()
1004 try:
1005 pid, fd = pty.fork()
1006 except (OSError, AttributeError) as e:
1007 os.close(r)
1008 os.close(w)
1009 self.skipTest("pty.fork() raised {}".format(e))
1010 if pid == 0:
1011 # Child
Antoine Pitrou413d4972011-11-06 02:51:25 +01001012 try:
1013 # Make sure we don't get stuck if there's a problem
1014 signal.alarm(2)
1015 os.close(r)
1016 # Check the error handlers are accounted for
1017 if stdio_encoding:
1018 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1019 encoding=stdio_encoding,
1020 errors='surrogateescape')
1021 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1022 encoding=stdio_encoding,
1023 errors='replace')
1024 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001025 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1026 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou413d4972011-11-06 02:51:25 +01001027 except:
1028 traceback.print_exc()
1029 finally:
1030 # We don't want to return to unittest...
1031 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001032 # Parent
1033 os.close(w)
1034 os.write(fd, terminal_input + b"\r\n")
1035 # Get results from the pipe
1036 with open(r, "r") as rpipe:
1037 lines = []
1038 while True:
1039 line = rpipe.readline().strip()
Antoine Pitrou413d4972011-11-06 02:51:25 +01001040 if line == "":
1041 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001042 break
1043 lines.append(line)
Antoine Pitrou413d4972011-11-06 02:51:25 +01001044 # Check the result was got and corresponds to the user's terminal input
1045 if len(lines) != 2:
1046 # Something went wrong, try to get at stderr
1047 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1048 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1049 % (len(lines), child_output.read()))
1050 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001051 # Check we did exercise the GNU readline path
1052 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1053 if lines[0] != 'tty = True':
1054 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001055 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1056 if stdio_encoding:
1057 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1058 else:
1059 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1060 self.assertEqual(input_result, expected)
1061
1062 def test_input_tty(self):
1063 # Test input() functionality when wired to a tty (the code path
1064 # is different and invokes GNU readline if available).
1065 self.check_input_tty("prompt", b"quux")
1066
1067 def test_input_tty_non_ascii(self):
1068 # Check stdin/stdout encoding is used when invoking GNU readline
1069 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1070
1071 def test_input_tty_non_ascii_unicode_errors(self):
1072 # Check stdin/stdout error handler is used when invoking GNU readline
1073 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1074
Walter Dörwald919497e2003-01-19 16:23:59 +00001075 def test_repr(self):
1076 self.assertEqual(repr(''), '\'\'')
1077 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001078 self.assertEqual(repr(()), '()')
1079 self.assertEqual(repr([]), '[]')
1080 self.assertEqual(repr({}), '{}')
1081 a = []
1082 a.append(a)
1083 self.assertEqual(repr(a), '[[...]]')
1084 a = {}
1085 a[0] = a
1086 self.assertEqual(repr(a), '{0: {...}}')
1087
1088 def test_round(self):
1089 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001090 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001091 self.assertEqual(round(1.0), 1.0)
1092 self.assertEqual(round(10.0), 10.0)
1093 self.assertEqual(round(1000000000.0), 1000000000.0)
1094 self.assertEqual(round(1e20), 1e20)
1095
1096 self.assertEqual(round(-1.0), -1.0)
1097 self.assertEqual(round(-10.0), -10.0)
1098 self.assertEqual(round(-1000000000.0), -1000000000.0)
1099 self.assertEqual(round(-1e20), -1e20)
1100
1101 self.assertEqual(round(0.1), 0.0)
1102 self.assertEqual(round(1.1), 1.0)
1103 self.assertEqual(round(10.1), 10.0)
1104 self.assertEqual(round(1000000000.1), 1000000000.0)
1105
1106 self.assertEqual(round(-1.1), -1.0)
1107 self.assertEqual(round(-10.1), -10.0)
1108 self.assertEqual(round(-1000000000.1), -1000000000.0)
1109
1110 self.assertEqual(round(0.9), 1.0)
1111 self.assertEqual(round(9.9), 10.0)
1112 self.assertEqual(round(999999999.9), 1000000000.0)
1113
1114 self.assertEqual(round(-0.9), -1.0)
1115 self.assertEqual(round(-9.9), -10.0)
1116 self.assertEqual(round(-999999999.9), -1000000000.0)
1117
1118 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001119 self.assertEqual(type(round(-8.0, -1)), float)
1120
1121 self.assertEqual(type(round(-8.0, 0)), float)
1122 self.assertEqual(type(round(-8.0, 1)), float)
1123
1124 # Check even / odd rounding behaviour
1125 self.assertEqual(round(5.5), 6)
1126 self.assertEqual(round(6.5), 6)
1127 self.assertEqual(round(-5.5), -6)
1128 self.assertEqual(round(-6.5), -6)
1129
1130 # Check behavior on ints
1131 self.assertEqual(round(0), 0)
1132 self.assertEqual(round(8), 8)
1133 self.assertEqual(round(-8), -8)
1134 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001135 self.assertEqual(type(round(-8, -1)), int)
1136 self.assertEqual(type(round(-8, 0)), int)
1137 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001138
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001139 # test new kwargs
1140 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1141
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 self.assertRaises(TypeError, round)
1143
Alex Martelliae211f92007-08-22 23:21:33 +00001144 # test generic rounding delegation for reals
1145 class TestRound:
1146 def __round__(self):
1147 return 23
1148
1149 class TestNoRound:
1150 pass
1151
1152 self.assertEqual(round(TestRound()), 23)
1153
1154 self.assertRaises(TypeError, round, 1, 2, 3)
1155 self.assertRaises(TypeError, round, TestNoRound())
1156
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001157 t = TestNoRound()
1158 t.__round__ = lambda *args: args
1159 self.assertRaises(TypeError, round, t)
1160 self.assertRaises(TypeError, round, t, 0)
1161
Mark Dickinsonad731b92009-11-09 17:12:30 +00001162 # Some versions of glibc for alpha have a bug that affects
1163 # float -> integer rounding (floor, ceil, rint, round) for
1164 # values in the range [2**52, 2**53). See:
1165 #
1166 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1167 #
1168 # We skip this test on Linux/alpha if it would fail.
1169 linux_alpha = (platform.system().startswith('Linux') and
1170 platform.machine().startswith('alpha'))
1171 system_round_bug = round(5e15+1) != 5e15+1
1172 @unittest.skipIf(linux_alpha and system_round_bug,
1173 "test will fail; failure is probably due to a "
1174 "buggy system round function")
1175 def test_round_large(self):
1176 # Issue #1869: integral floats should remain unchanged
1177 self.assertEqual(round(5e15-1), 5e15-1)
1178 self.assertEqual(round(5e15), 5e15)
1179 self.assertEqual(round(5e15+1), 5e15+1)
1180 self.assertEqual(round(5e15+2), 5e15+2)
1181 self.assertEqual(round(5e15+3), 5e15+3)
1182
Walter Dörwald919497e2003-01-19 16:23:59 +00001183 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001184 setattr(sys, 'spam', 1)
1185 self.assertEqual(sys.spam, 1)
1186 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1187 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001188
Chris Jerdonek17fc44c2012-11-20 17:31:02 -08001189 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001190
Alex Martellia70b1912003-04-22 08:12:33 +00001191 def test_sum(self):
1192 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001193 self.assertEqual(sum(list(range(2,8))), 27)
1194 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001195 self.assertEqual(sum(Squares(10)), 285)
1196 self.assertEqual(sum(iter(Squares(10))), 285)
1197 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1198
1199 self.assertRaises(TypeError, sum)
1200 self.assertRaises(TypeError, sum, 42)
1201 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1202 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1203 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1204 self.assertRaises(TypeError, sum, [{2:3}])
1205 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1206
1207 class BadSeq:
1208 def __getitem__(self, index):
1209 raise ValueError
1210 self.assertRaises(ValueError, sum, BadSeq())
1211
Mark Dickinson3a22b472009-10-17 21:48:16 +00001212 empty = []
1213 sum(([x] for x in range(10)), empty)
1214 self.assertEqual(empty, [])
1215
Walter Dörwald919497e2003-01-19 16:23:59 +00001216 def test_type(self):
1217 self.assertEqual(type(''), type('123'))
1218 self.assertNotEqual(type(''), type(()))
1219
Guido van Rossumfee7b932005-01-16 00:21:28 +00001220 # We don't want self in vars(), so these are static methods
1221
1222 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001223 def get_vars_f0():
1224 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001225
Guido van Rossumfee7b932005-01-16 00:21:28 +00001226 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001227 def get_vars_f2():
1228 BuiltinTest.get_vars_f0()
1229 a = 1
1230 b = 2
1231 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001232
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001233 class C_get_vars(object):
1234 def getDict(self):
1235 return {'a':2}
1236 __dict__ = property(fget=getDict)
1237
Walter Dörwald919497e2003-01-19 16:23:59 +00001238 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001239 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001240 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 self.assertEqual(self.get_vars_f0(), {})
1242 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1243 self.assertRaises(TypeError, vars, 42, 42)
1244 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001245 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001246
1247 def test_zip(self):
1248 a = (1, 2, 3)
1249 b = (4, 5, 6)
1250 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001251 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001252 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001253 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001254 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001255 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001256 class I:
1257 def __getitem__(self, i):
1258 if i < 0 or i > 2: raise IndexError
1259 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001260 self.assertEqual(list(zip(a, I())), t)
1261 self.assertEqual(list(zip()), [])
1262 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001263 self.assertRaises(TypeError, zip, None)
1264 class G:
1265 pass
1266 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001267 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001268
1269 # Make sure zip doesn't try to allocate a billion elements for the
1270 # result list when one of its arguments doesn't say how long it is.
1271 # A MemoryError is the most likely failure mode.
1272 class SequenceWithoutALength:
1273 def __getitem__(self, i):
1274 if i == 5:
1275 raise IndexError
1276 else:
1277 return i
1278 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001279 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001280 list(enumerate(range(5)))
1281 )
1282
1283 class BadSeq:
1284 def __getitem__(self, i):
1285 if i == 5:
1286 raise ValueError
1287 else:
1288 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001289 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001290
Eric Smithe4d63172010-09-13 20:48:43 +00001291 def test_format(self):
1292 # Test the basic machinery of the format() builtin. Don't test
1293 # the specifics of the various formatters
1294 self.assertEqual(format(3, ''), '3')
1295
1296 # Returns some classes to use for various tests. There's
1297 # an old-style version, and a new-style version
1298 def classes_new():
1299 class A(object):
1300 def __init__(self, x):
1301 self.x = x
1302 def __format__(self, format_spec):
1303 return str(self.x) + format_spec
1304 class DerivedFromA(A):
1305 pass
1306
1307 class Simple(object): pass
1308 class DerivedFromSimple(Simple):
1309 def __init__(self, x):
1310 self.x = x
1311 def __format__(self, format_spec):
1312 return str(self.x) + format_spec
1313 class DerivedFromSimple2(DerivedFromSimple): pass
1314 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1315
1316 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1317 self.assertEqual(format(A(3), 'spec'), '3spec')
1318 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1319 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1320 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1321 '10abcdef')
1322
1323 class_test(*classes_new())
1324
1325 def empty_format_spec(value):
1326 # test that:
1327 # format(x, '') == str(x)
1328 # format(x) == str(x)
1329 self.assertEqual(format(value, ""), str(value))
1330 self.assertEqual(format(value), str(value))
1331
1332 # for builtin types, format(x, "") == str(x)
1333 empty_format_spec(17**13)
1334 empty_format_spec(1.0)
1335 empty_format_spec(3.1415e104)
1336 empty_format_spec(-3.1415e104)
1337 empty_format_spec(3.1415e-104)
1338 empty_format_spec(-3.1415e-104)
1339 empty_format_spec(object)
1340 empty_format_spec(None)
1341
1342 # TypeError because self.__format__ returns the wrong type
1343 class BadFormatResult:
1344 def __format__(self, format_spec):
1345 return 1.0
1346 self.assertRaises(TypeError, format, BadFormatResult(), "")
1347
1348 # TypeError because format_spec is not unicode or str
1349 self.assertRaises(TypeError, format, object(), 4)
1350 self.assertRaises(TypeError, format, object(), object())
1351
1352 # tests for object.__format__ really belong elsewhere, but
1353 # there's no good place to put them
1354 x = object().__format__('')
1355 self.assertTrue(x.startswith('<object object at'))
1356
1357 # first argument to object.__format__ must be string
1358 self.assertRaises(TypeError, object().__format__, 3)
1359 self.assertRaises(TypeError, object().__format__, object())
1360 self.assertRaises(TypeError, object().__format__, None)
1361
1362 # --------------------------------------------------------------------
1363 # Issue #7994: object.__format__ with a non-empty format string is
1364 # pending deprecated
1365 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1366 with warnings.catch_warnings(record=True) as w:
1367 warnings.simplefilter("always", PendingDeprecationWarning)
1368 format(obj, fmt_str)
1369 if should_raise_warning:
1370 self.assertEqual(len(w), 1)
1371 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1372 self.assertIn('object.__format__ with a non-empty format '
1373 'string', str(w[0].message))
1374 else:
1375 self.assertEqual(len(w), 0)
1376
1377 fmt_strs = ['', 's']
1378
1379 class A:
1380 def __format__(self, fmt_str):
1381 return format('', fmt_str)
1382
1383 for fmt_str in fmt_strs:
1384 test_deprecated_format_string(A(), fmt_str, False)
1385
1386 class B:
1387 pass
1388
1389 class C(object):
1390 pass
1391
1392 for cls in [object, B, C]:
1393 for fmt_str in fmt_strs:
1394 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1395 # --------------------------------------------------------------------
1396
1397 # make sure we can take a subclass of str as a format spec
1398 class DerivedFromStr(str): pass
1399 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1400
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001401 def test_bin(self):
1402 self.assertEqual(bin(0), '0b0')
1403 self.assertEqual(bin(1), '0b1')
1404 self.assertEqual(bin(-1), '-0b1')
1405 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1406 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1407 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1408 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1409
Georg Brandl953152f2009-07-22 12:03:59 +00001410 def test_bytearray_translate(self):
1411 x = bytearray(b"abc")
1412 self.assertRaises(ValueError, x.translate, b"1", 1)
1413 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1414
Raymond Hettinger64958a12003-12-17 20:43:33 +00001415class TestSorted(unittest.TestCase):
1416
1417 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001418 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001419 copy = data[:]
1420 random.shuffle(copy)
1421 self.assertEqual(data, sorted(copy))
1422 self.assertNotEqual(data, copy)
1423
1424 data.reverse()
1425 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001426 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1427 self.assertNotEqual(data, copy)
1428 random.shuffle(copy)
1429 self.assertEqual(data, sorted(copy, reverse=1))
1430 self.assertNotEqual(data, copy)
1431
1432 def test_inputtypes(self):
1433 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001434 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001435 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001436 self.assertEqual(sorted(s), sorted(T(s)))
1437
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001438 s = ''.join(set(s)) # unique letters only
1439 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001440 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001441 self.assertEqual(sorted(s), sorted(T(s)))
1442
1443 def test_baddecorator(self):
1444 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1445 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1446
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001447def test_main(verbose=None):
1448 test_classes = (BuiltinTest, TestSorted)
1449
1450 run_unittest(*test_classes)
1451
1452 # verify reference counting
1453 if verbose and hasattr(sys, "gettotalrefcount"):
1454 import gc
1455 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001456 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001457 run_unittest(*test_classes)
1458 gc.collect()
1459 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001460 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001461
Walter Dörwald919497e2003-01-19 16:23:59 +00001462
1463if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001464 test_main(verbose=True)