blob: 4a358e89d1c2e5fd10c4dd0f74ccc95f53180e94 [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
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004import asyncio
Victor Stinnerf86a5e82012-06-05 13:43:22 +02005import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00006import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07007import decimal
8import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00009import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010011import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020013import platform
14import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020015import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020016import sys
17import traceback
18import types
19import unittest
20import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040021from contextlib import ExitStack
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070022from inspect import CO_COROUTINE
23from itertools import product
24from textwrap import dedent
25from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020026from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040027from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070028 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
29 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030030from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040031from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010032try:
Antoine Pitrou772add72011-11-06 02:37:42 +010033 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010034except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010035 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000036
Guido van Rossum3bead091992-01-27 17:00:37 +000037
Walter Dörwald919497e2003-01-19 16:23:59 +000038class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Walter Dörwald919497e2003-01-19 16:23:59 +000040 def __init__(self, max):
41 self.max = max
42 self.sofar = []
43
44 def __len__(self): return len(self.sofar)
45
46 def __getitem__(self, i):
47 if not 0 <= i < self.max: raise IndexError
48 n = len(self.sofar)
49 while n <= i:
50 self.sofar.append(n*n)
51 n += 1
52 return self.sofar[i]
53
54class StrSquares:
55
56 def __init__(self, max):
57 self.max = max
58 self.sofar = []
59
60 def __len__(self):
61 return len(self.sofar)
62
63 def __getitem__(self, i):
64 if not 0 <= i < self.max:
65 raise IndexError
66 n = len(self.sofar)
67 while n <= i:
68 self.sofar.append(str(n*n))
69 n += 1
70 return self.sofar[i]
71
72class BitBucket:
73 def write(self, line):
74 pass
75
Facundo Batista2336bdd2008-01-19 19:12:01 +000076test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000077 ('0', 0),
78 ('1', 1),
79 ('9', 9),
80 ('10', 10),
81 ('99', 99),
82 ('100', 100),
83 ('314', 314),
84 (' 314', 314),
85 ('314 ', 314),
86 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000087 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000088 (' 1x', ValueError),
89 (' 1 ', 1),
90 (' 1\02 ', ValueError),
91 ('', ValueError),
92 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000093 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040094 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000095 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000096]
97
Facundo Batista2336bdd2008-01-19 19:12:01 +000098test_conv_sign = [
99 ('0', 0),
100 ('1', 1),
101 ('9', 9),
102 ('10', 10),
103 ('99', 99),
104 ('100', 100),
105 ('314', 314),
106 (' 314', ValueError),
107 ('314 ', 314),
108 (' \t\t 314 \t\t ', ValueError),
109 (repr(sys.maxsize), sys.maxsize),
110 (' 1x', ValueError),
111 (' 1 ', ValueError),
112 (' 1\02 ', ValueError),
113 ('', ValueError),
114 (' ', ValueError),
115 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400116 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000117 (chr(0x200), ValueError),
118]
119
Raymond Hettinger96229b12005-03-11 06:49:40 +0000120class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000121 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000122 raise RuntimeError
123
124class TestFailingIter:
125 def __iter__(self):
126 raise RuntimeError
127
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000128def filter_char(arg):
129 return ord(arg) > ord("d")
130
131def map_char(arg):
132 return chr(ord(arg)+1)
133
Walter Dörwald919497e2003-01-19 16:23:59 +0000134class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000135 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200136 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000137 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200138 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000139 it = pickle.loads(d)
140 self.assertEqual(type(itorg), type(it))
141 self.assertEqual(list(it), seq)
142
143 #test the iterator after dropping one from it
144 it = pickle.loads(d)
145 try:
146 next(it)
147 except StopIteration:
148 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200149 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000150 it = pickle.loads(d)
151 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000152
153 def test_import(self):
154 __import__('sys')
155 __import__('time')
156 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000157 __import__(name='sys')
158 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000159 self.assertRaises(ImportError, __import__, 'spamspam')
160 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000161 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000162 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300163 # embedded null character
164 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000165
166 def test_abs(self):
167 # int
168 self.assertEqual(abs(0), 0)
169 self.assertEqual(abs(1234), 1234)
170 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000171 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000172 # float
173 self.assertEqual(abs(0.0), 0.0)
174 self.assertEqual(abs(3.14), 3.14)
175 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000176 # str
177 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000178 # bool
179 self.assertEqual(abs(True), 1)
180 self.assertEqual(abs(False), 0)
181 # other
182 self.assertRaises(TypeError, abs)
183 self.assertRaises(TypeError, abs, None)
184 class AbsClass(object):
185 def __abs__(self):
186 return -5
187 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000188
Raymond Hettinger96229b12005-03-11 06:49:40 +0000189 def test_all(self):
190 self.assertEqual(all([2, 4, 6]), True)
191 self.assertEqual(all([2, None, 6]), False)
192 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
193 self.assertRaises(RuntimeError, all, TestFailingIter())
194 self.assertRaises(TypeError, all, 10) # Non-iterable
195 self.assertRaises(TypeError, all) # No args
196 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
197 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200198 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000199 S = [50, 60]
200 self.assertEqual(all(x > 42 for x in S), True)
201 S = [50, 40, 60]
202 self.assertEqual(all(x > 42 for x in S), False)
203
204 def test_any(self):
205 self.assertEqual(any([None, None, None]), False)
206 self.assertEqual(any([None, 4, None]), True)
207 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500208 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000209 self.assertRaises(TypeError, any, 10) # Non-iterable
210 self.assertRaises(TypeError, any) # No args
211 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
212 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200213 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000214 S = [40, 60, 30]
215 self.assertEqual(any(x > 42 for x in S), True)
216 S = [10, 20, 30]
217 self.assertEqual(any(x > 42 for x in S), False)
218
Georg Brandl559e5d72008-06-11 18:37:52 +0000219 def test_ascii(self):
220 self.assertEqual(ascii(''), '\'\'')
221 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000222 self.assertEqual(ascii(()), '()')
223 self.assertEqual(ascii([]), '[]')
224 self.assertEqual(ascii({}), '{}')
225 a = []
226 a.append(a)
227 self.assertEqual(ascii(a), '[[...]]')
228 a = {}
229 a[0] = a
230 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000231 # Advanced checks for unicode strings
232 def _check_uni(s):
233 self.assertEqual(ascii(s), repr(s))
234 _check_uni("'")
235 _check_uni('"')
236 _check_uni('"\'')
237 _check_uni('\0')
238 _check_uni('\r\n\t .')
239 # Unprintable non-ASCII characters
240 _check_uni('\x85')
241 _check_uni('\u1fff')
242 _check_uni('\U00012fff')
243 # Lone surrogates
244 _check_uni('\ud800')
245 _check_uni('\udfff')
246 # Issue #9804: surrogates should be joined even for printable
247 # wide characters (UCS-2 builds).
248 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
249 # All together
250 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
251 self.assertEqual(ascii(s),
252 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000253
Thomas Wouters89f507f2006-12-13 04:49:30 +0000254 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000255 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000257 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258
Walter Dörwald919497e2003-01-19 16:23:59 +0000259 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000260 self.assertTrue(callable(len))
261 self.assertFalse(callable("a"))
262 self.assertTrue(callable(callable))
263 self.assertTrue(callable(lambda x, y: x + y))
264 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000265 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000266 self.assertTrue(callable(f))
267
268 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000269 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000270 self.assertTrue(callable(C1))
271 c = C1()
272 self.assertTrue(callable(c.meth))
273 self.assertFalse(callable(c))
274
275 # __call__ is looked up on the class, not the instance
276 c.__call__ = None
277 self.assertFalse(callable(c))
278 c.__call__ = lambda self: 0
279 self.assertFalse(callable(c))
280 del c.__call__
281 self.assertFalse(callable(c))
282
283 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000284 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000285 c2 = C2()
286 self.assertTrue(callable(c2))
287 c2.__call__ = None
288 self.assertTrue(callable(c2))
289 class C3(C2): pass
290 c3 = C3()
291 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000292
293 def test_chr(self):
294 self.assertEqual(chr(32), ' ')
295 self.assertEqual(chr(65), 'A')
296 self.assertEqual(chr(97), 'a')
297 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000298 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000299 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300300 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000301 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000302 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
303 self.assertEqual(chr(0x00010000), "\U00010000")
304 self.assertEqual(chr(0x00010001), "\U00010001")
305 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
306 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
307 self.assertEqual(chr(0x00100000), "\U00100000")
308 self.assertEqual(chr(0x00100001), "\U00100001")
309 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
310 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
311 self.assertRaises(ValueError, chr, -1)
312 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000313 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000314
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000315 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000316 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000317
Walter Dörwald919497e2003-01-19 16:23:59 +0000318 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000319 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000320 bom = b'\xef\xbb\xbf'
321 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000322 compile(source='pass', filename='?', mode='exec')
323 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
324 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000325 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000326 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000327 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
328 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300329 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
331 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000332 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300333 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000334 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335
Georg Brandl8334fd92010-12-04 10:26:46 +0000336 # test the optimize argument
337
338 codestr = '''def f():
339 """doc"""
diana543386b2017-10-03 10:46:56 -0600340 debug_enabled = False
341 if __debug__:
342 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 try:
344 assert False
345 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200346 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000347 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200348 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000349 '''
350 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200351 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
352 (0, True, 'doc', True, True),
353 (1, False, 'doc', False, False),
354 (2, False, None, False, False)]
355 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000356 # test both direct compilation and compilation via AST
357 codeobjs = []
358 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
359 tree = ast.parse(codestr)
360 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
361 for code in codeobjs:
362 ns = {}
363 exec(code, ns)
364 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200365 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000366
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700367 def test_compile_top_level_await(self):
368 """Test whether code some top level await can be compiled.
369
370 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag set,
371 and make sure the generated code object has the CO_COROUTINE flag set in
372 order to execute it with `await eval(.....)` instead of exec, or via a
373 FunctionType.
374 """
375
376 # helper function just to check we can run top=level async-for
377 async def arange(n):
378 for i in range(n):
379 yield i
380
381 modes = ('single', 'exec')
382 code_samples = ['''a = await asyncio.sleep(0, result=1)''',
383 '''async for i in arange(1):
384 a = 1''',
385 '''async with asyncio.Lock() as l:
386 a = 1''']
387 policy = maybe_get_event_loop_policy()
388 try:
389 for mode, code_sample in product(modes,code_samples):
390 source = dedent(code_sample)
391 with self.assertRaises(SyntaxError, msg=f"{source=} {mode=}"):
392 compile(source, '?' , mode)
393
394 co = compile(source,
395 '?',
396 mode,
397 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
398
399 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
400 msg=f"{source=} {mode=}")
401
402
403 # test we can create and advance a function type
404 globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange}
405 async_f = FunctionType(co, globals_)
406 asyncio.run(async_f())
407 self.assertEqual(globals_['a'], 1)
408
409 # test we can await-eval,
410 globals_ = {'asyncio': asyncio, 'a':0, 'arange': arange}
411 asyncio.run(eval(co, globals_))
412 self.assertEqual(globals_['a'], 1)
413 finally:
414 asyncio.set_event_loop_policy(policy)
415
416 def test_compile_async_generator(self):
417 """
418 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
419 make sure AsyncGenerators are still properly not marked with CO_COROUTINE
420 """
421 code = dedent("""async def ticker():
422 for i in range(10):
423 yield i
424 await asyncio.sleep(0)""")
425
426 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
427 glob = {}
428 exec(co, glob)
429 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
430
431
Walter Dörwald919497e2003-01-19 16:23:59 +0000432 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000433 sys.spam = 1
434 delattr(sys, 'spam')
435 self.assertRaises(TypeError, delattr)
436
437 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000438 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000439 self.assertRaises(TypeError, dir, 42, 42)
440
Georg Brandle32b4222007-03-10 22:13:27 +0000441 # dir() - local scope
442 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000443 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000444
445 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000446 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000447
448 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000449 class Foo(types.ModuleType):
450 __dict__ = 8
451 f = Foo("foo")
452 self.assertRaises(TypeError, dir, f)
453
454 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000455 self.assertIn("strip", dir(str))
456 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000457
458 # dir(obj)
459 class Foo(object):
460 def __init__(self):
461 self.x = 7
462 self.y = 8
463 self.z = 9
464 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000465 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000466
467 # dir(obj_no__dict__)
468 class Foo(object):
469 __slots__ = []
470 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000471 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000472
473 # dir(obj_no__class__with__dict__)
474 # (an ugly trick to cause getattr(f, "__class__") to fail)
475 class Foo(object):
476 __slots__ = ["__class__", "__dict__"]
477 def __init__(self):
478 self.bar = "wow"
479 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000480 self.assertNotIn("__repr__", dir(f))
481 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000482
483 # dir(obj_using __dir__)
484 class Foo(object):
485 def __dir__(self):
486 return ["kan", "ga", "roo"]
487 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000488 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000489
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500490 # dir(obj__dir__tuple)
491 class Foo(object):
492 def __dir__(self):
493 return ("b", "c", "a")
494 res = dir(Foo())
495 self.assertIsInstance(res, list)
496 self.assertTrue(res == ["a", "b", "c"])
497
498 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000499 class Foo(object):
500 def __dir__(self):
501 return 7
502 f = Foo()
503 self.assertRaises(TypeError, dir, f)
504
Collin Winter3eed7652007-08-14 17:53:54 +0000505 # dir(traceback)
506 try:
507 raise IndexError
508 except:
509 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
510
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500511 # test that object has a __dir__()
512 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000513
Walter Dörwald919497e2003-01-19 16:23:59 +0000514 def test_divmod(self):
515 self.assertEqual(divmod(12, 7), (1, 5))
516 self.assertEqual(divmod(-12, 7), (-2, 2))
517 self.assertEqual(divmod(12, -7), (-2, -2))
518 self.assertEqual(divmod(-12, -7), (1, -5))
519
Mark Dickinson5c2db372009-12-05 20:28:34 +0000520 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000521
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000522 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
523 (-3.25, 1.0, (-4.0, 0.75)),
524 (3.25, -1.0, (-4.0, -0.75)),
525 (-3.25, -1.0, (3.0, -0.25))]:
526 result = divmod(num, denom)
527 self.assertAlmostEqual(result[0], exp_result[0])
528 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000529
530 self.assertRaises(TypeError, divmod)
531
532 def test_eval(self):
533 self.assertEqual(eval('1+1'), 2)
534 self.assertEqual(eval(' 1+1\n'), 2)
535 globals = {'a': 1, 'b': 2}
536 locals = {'b': 200, 'c': 300}
537 self.assertEqual(eval('a', globals) , 1)
538 self.assertEqual(eval('a', globals, locals), 1)
539 self.assertEqual(eval('b', globals, locals), 200)
540 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000541 globals = {'a': 1, 'b': 2}
542 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000543 bom = b'\xef\xbb\xbf'
544 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000545 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000546 self.assertRaises(TypeError, eval)
547 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000548 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000549
Benjamin Peterson92722792012-12-15 12:51:05 -0500550 class X:
551 def __getitem__(self, key):
552 raise ValueError
553 self.assertRaises(ValueError, eval, "foo", {}, X())
554
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000555 def test_general_eval(self):
556 # Tests that general mappings can be used for the locals argument
557
558 class M:
559 "Test mapping interface versus possible calls from eval()."
560 def __getitem__(self, key):
561 if key == 'a':
562 return 12
563 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000564 def keys(self):
565 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000566
567 m = M()
568 g = globals()
569 self.assertEqual(eval('a', g, m), 12)
570 self.assertRaises(NameError, eval, 'b', g, m)
571 self.assertEqual(eval('dir()', g, m), list('xyz'))
572 self.assertEqual(eval('globals()', g, m), g)
573 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000574 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000575 class A:
576 "Non-mapping"
577 pass
578 m = A()
579 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000580
581 # Verify that dict subclasses work as well
582 class D(dict):
583 def __getitem__(self, key):
584 if key == 'a':
585 return 12
586 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000587 def keys(self):
588 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000589
590 d = D()
591 self.assertEqual(eval('a', g, d), 12)
592 self.assertRaises(NameError, eval, 'b', g, d)
593 self.assertEqual(eval('dir()', g, d), list('xyz'))
594 self.assertEqual(eval('globals()', g, d), g)
595 self.assertEqual(eval('locals()', g, d), d)
596
597 # Verify locals stores (used by list comps)
598 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000599 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000600
601 class SpreadSheet:
602 "Sample application showing nested, calculated lookups."
603 _cells = {}
604 def __setitem__(self, key, formula):
605 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000606 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000607 return eval(self._cells[key], globals(), self)
608
609 ss = SpreadSheet()
610 ss['a1'] = '5'
611 ss['a2'] = 'a1*6'
612 ss['a3'] = 'a2*7'
613 self.assertEqual(ss['a3'], 210)
614
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000615 # Verify that dir() catches a non-list returned by eval
616 # SF bug #1004669
617 class C:
618 def __getitem__(self, item):
619 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000620 def keys(self):
621 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000622 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
623
Georg Brandl7cae87c2006-09-06 06:51:57 +0000624 def test_exec(self):
625 g = {}
626 exec('z = 1', g)
627 if '__builtins__' in g:
628 del g['__builtins__']
629 self.assertEqual(g, {'z': 1})
630
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000631 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000632 if '__builtins__' in g:
633 del g['__builtins__']
634 self.assertEqual(g, {'z': 2})
635 g = {}
636 l = {}
637
Brett Cannon77628992010-03-20 20:59:33 +0000638 with check_warnings():
639 warnings.filterwarnings("ignore", "global statement",
640 module="<string>")
641 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000642 if '__builtins__' in g:
643 del g['__builtins__']
644 if '__builtins__' in l:
645 del l['__builtins__']
646 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
647
Victor Stinnerb0b22422012-04-19 00:57:45 +0200648 def test_exec_globals(self):
649 code = compile("print('Hello World!')", "", "exec")
650 # no builtin function
651 self.assertRaisesRegex(NameError, "name 'print' is not defined",
652 exec, code, {'__builtins__': {}})
653 # __builtins__ must be a mapping type
654 self.assertRaises(TypeError,
655 exec, code, {'__builtins__': 123})
656
657 # no __build_class__ function
658 code = compile("class A: pass", "", "exec")
659 self.assertRaisesRegex(NameError, "__build_class__ not found",
660 exec, code, {'__builtins__': {}})
661
662 class frozendict_error(Exception):
663 pass
664
665 class frozendict(dict):
666 def __setitem__(self, key, value):
667 raise frozendict_error("frozendict is readonly")
668
669 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400670 if isinstance(__builtins__, types.ModuleType):
671 frozen_builtins = frozendict(__builtins__.__dict__)
672 else:
673 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200674 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
675 self.assertRaises(frozendict_error,
676 exec, code, {'__builtins__': frozen_builtins})
677
678 # read-only globals
679 namespace = frozendict({})
680 code = compile("x=1", "test", "exec")
681 self.assertRaises(frozendict_error,
682 exec, code, namespace)
683
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000684 def test_exec_redirected(self):
685 savestdout = sys.stdout
686 sys.stdout = None # Whatever that cannot flush()
687 try:
688 # Used to raise SystemError('error return without exception set')
689 exec('a')
690 except NameError:
691 pass
692 finally:
693 sys.stdout = savestdout
694
Walter Dörwald919497e2003-01-19 16:23:59 +0000695 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000696 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
697 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
698 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
699 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
700 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000701 def identity(item):
702 return 1
703 filter(identity, Squares(5))
704 self.assertRaises(TypeError, filter)
705 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000706 def __getitem__(self, index):
707 if index<4:
708 return 42
709 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000710 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000711 def badfunc():
712 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000713 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000714
Walter Dörwaldbf517072003-01-27 15:57:14 +0000715 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000716 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
717 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
718 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000719
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000720 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200721 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
722 f1 = filter(filter_char, "abcdeabcde")
723 f2 = filter(filter_char, "abcdeabcde")
724 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000725
Walter Dörwald919497e2003-01-19 16:23:59 +0000726 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000727 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000728 self.assertRaises(TypeError, getattr, sys, 1)
729 self.assertRaises(TypeError, getattr, sys, 1, "foo")
730 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000731 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000732 # unicode surrogates are not encodable to the default encoding (utf8)
733 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000734
735 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000736 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000737 self.assertRaises(TypeError, hasattr, sys, 1)
738 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000739 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000740
Benjamin Peterson17689992010-08-24 03:26:23 +0000741 # Check that hasattr propagates all exceptions outside of
742 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000743 class A:
744 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000745 raise SystemExit
746 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000747 class B:
748 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000749 raise ValueError
750 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000751
Walter Dörwald919497e2003-01-19 16:23:59 +0000752 def test_hash(self):
753 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000754 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000755 self.assertEqual(hash(1), hash(1.0))
756 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000757 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000758 hash((0,1,2,3))
759 def f(): pass
760 self.assertRaises(TypeError, hash, [])
761 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000762 # Bug 1536021: Allow hash to return long objects
763 class X:
764 def __hash__(self):
765 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000766 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000767 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000768 def __hash__(self):
769 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000770 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000771
772 def test_hex(self):
773 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000774 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000775 self.assertRaises(TypeError, hex, {})
776
777 def test_id(self):
778 id(None)
779 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000780 id(1.0)
781 id('spam')
782 id((0,1,2,3))
783 id([0,1,2,3])
784 id({'spam': 1, 'eggs': 2, 'ham': 3})
785
Guido van Rossuma88a0332007-02-26 16:59:55 +0000786 # Test input() later, alphabetized as if it were raw_input
787
Walter Dörwald919497e2003-01-19 16:23:59 +0000788 def test_iter(self):
789 self.assertRaises(TypeError, iter)
790 self.assertRaises(TypeError, iter, 42, 42)
791 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000792 for l in lists:
793 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000794 self.assertEqual(next(i), '1')
795 self.assertEqual(next(i), '2')
796 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000797
798 def test_isinstance(self):
799 class C:
800 pass
801 class D(C):
802 pass
803 class E:
804 pass
805 c = C()
806 d = D()
807 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000808 self.assertTrue(isinstance(c, C))
809 self.assertTrue(isinstance(d, C))
810 self.assertTrue(not isinstance(e, C))
811 self.assertTrue(not isinstance(c, D))
812 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 self.assertRaises(TypeError, isinstance, E, 'foo')
814 self.assertRaises(TypeError, isinstance)
815
816 def test_issubclass(self):
817 class C:
818 pass
819 class D(C):
820 pass
821 class E:
822 pass
823 c = C()
824 d = D()
825 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000826 self.assertTrue(issubclass(D, C))
827 self.assertTrue(issubclass(C, C))
828 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000829 self.assertRaises(TypeError, issubclass, 'foo', E)
830 self.assertRaises(TypeError, issubclass, E, 'foo')
831 self.assertRaises(TypeError, issubclass)
832
833 def test_len(self):
834 self.assertEqual(len('123'), 3)
835 self.assertEqual(len(()), 0)
836 self.assertEqual(len((1, 2, 3, 4)), 4)
837 self.assertEqual(len([1, 2, 3, 4]), 4)
838 self.assertEqual(len({}), 0)
839 self.assertEqual(len({'a':1, 'b': 2}), 2)
840 class BadSeq:
841 def __len__(self):
842 raise ValueError
843 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000844 class InvalidLen:
845 def __len__(self):
846 return None
847 self.assertRaises(TypeError, len, InvalidLen())
848 class FloatLen:
849 def __len__(self):
850 return 4.5
851 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300852 class NegativeLen:
853 def __len__(self):
854 return -10
855 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000856 class HugeLen:
857 def __len__(self):
858 return sys.maxsize + 1
859 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300860 class HugeNegativeLen:
861 def __len__(self):
862 return -sys.maxsize-10
863 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000864 class NoLenMethod(object): pass
865 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000866
Walter Dörwald919497e2003-01-19 16:23:59 +0000867 def test_map(self):
868 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000869 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000870 [1, 4, 9]
871 )
872 try:
873 from math import sqrt
874 except ImportError:
875 def sqrt(x):
876 return pow(x, 0.5)
877 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000878 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000879 [[4.0, 2.0], [9.0, 3.0]]
880 )
881 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000882 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000883 [10, 4, 6]
884 )
885
886 def plus(*v):
887 accu = 0
888 for i in v: accu = accu + i
889 return accu
890 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000891 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000892 [1, 3, 7]
893 )
894 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000895 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000896 [1+4, 3+9, 7+2]
897 )
898 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000899 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000900 [1+4+1, 3+9+1, 7+2+0]
901 )
902 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000903 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000904 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
905 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000906 def Max(a, b):
907 if a is None:
908 return b
909 if b is None:
910 return a
911 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000912 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000913 list(map(Max, Squares(3), Squares(2))),
914 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000915 )
916 self.assertRaises(TypeError, map)
917 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000918 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000919 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000920 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000921 yield None
922 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000923 def badfunc(x):
924 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000925 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000926
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000927 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200928 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
929 m1 = map(map_char, "Is this the real life?")
930 m2 = map(map_char, "Is this the real life?")
931 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000932
Walter Dörwald919497e2003-01-19 16:23:59 +0000933 def test_max(self):
934 self.assertEqual(max('123123'), '3')
935 self.assertEqual(max(1, 2, 3), 3)
936 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
937 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
938
Guido van Rossume2a383d2007-01-15 16:59:06 +0000939 self.assertEqual(max(1, 2, 3.0), 3.0)
940 self.assertEqual(max(1, 2.0, 3), 3)
941 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000942
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700943 self.assertRaises(TypeError, max)
944 self.assertRaises(TypeError, max, 42)
945 self.assertRaises(ValueError, max, ())
946 class BadSeq:
947 def __getitem__(self, index):
948 raise ValueError
949 self.assertRaises(ValueError, max, BadSeq())
950
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000951 for stmt in (
952 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700953 "max(default=None)",
954 "max(1, 2, default=None)", # require container for default
955 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000956 "max(1, key=int)", # single arg not iterable
957 "max(1, 2, keystone=int)", # wrong keyword
958 "max(1, 2, key=int, abc=int)", # two many keywords
959 "max(1, 2, key=1)", # keyfunc is not callable
960 ):
Tim Peters7f061872004-12-07 21:17:46 +0000961 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000962 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000963 except TypeError:
964 pass
965 else:
966 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000967
968 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
969 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
970 self.assertEqual(max(1, 2, key=neg), 1) # two elems
971
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700972 self.assertEqual(max((), default=None), None) # zero elem iterable
973 self.assertEqual(max((1,), default=None), 1) # one elem iterable
974 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
975
976 self.assertEqual(max((), default=1, key=neg), 1)
977 self.assertEqual(max((1, 2), default=3, key=neg), 1)
978
Alexander Marshalove22072f2018-07-24 10:58:21 +0700979 self.assertEqual(max((1, 2), key=None), 2)
980
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000981 data = [random.randrange(200) for i in range(100)]
982 keys = dict((elem, random.randrange(50)) for elem in data)
983 f = keys.__getitem__
984 self.assertEqual(max(data, key=f),
985 sorted(reversed(data), key=f)[-1])
986
Walter Dörwald919497e2003-01-19 16:23:59 +0000987 def test_min(self):
988 self.assertEqual(min('123123'), '1')
989 self.assertEqual(min(1, 2, 3), 1)
990 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
991 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
992
Guido van Rossume2a383d2007-01-15 16:59:06 +0000993 self.assertEqual(min(1, 2, 3.0), 1)
994 self.assertEqual(min(1, 2.0, 3), 1)
995 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000996
997 self.assertRaises(TypeError, min)
998 self.assertRaises(TypeError, min, 42)
999 self.assertRaises(ValueError, min, ())
1000 class BadSeq:
1001 def __getitem__(self, index):
1002 raise ValueError
1003 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001004
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001005 for stmt in (
1006 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001007 "min(default=None)",
1008 "min(1, 2, default=None)", # require container for default
1009 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001010 "min(1, key=int)", # single arg not iterable
1011 "min(1, 2, keystone=int)", # wrong keyword
1012 "min(1, 2, key=int, abc=int)", # two many keywords
1013 "min(1, 2, key=1)", # keyfunc is not callable
1014 ):
Tim Peters7f061872004-12-07 21:17:46 +00001015 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001016 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001017 except TypeError:
1018 pass
1019 else:
1020 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001021
1022 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1023 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1024 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1025
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001026 self.assertEqual(min((), default=None), None) # zero elem iterable
1027 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1028 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1029
1030 self.assertEqual(min((), default=1, key=neg), 1)
1031 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1032
Alexander Marshalove22072f2018-07-24 10:58:21 +07001033 self.assertEqual(min((1, 2), key=None), 1)
1034
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001035 data = [random.randrange(200) for i in range(100)]
1036 keys = dict((elem, random.randrange(50)) for elem in data)
1037 f = keys.__getitem__
1038 self.assertEqual(min(data, key=f),
1039 sorted(data, key=f)[0])
1040
Georg Brandla18af4e2007-04-21 15:47:16 +00001041 def test_next(self):
1042 it = iter(range(2))
1043 self.assertEqual(next(it), 0)
1044 self.assertEqual(next(it), 1)
1045 self.assertRaises(StopIteration, next, it)
1046 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001047 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001048
1049 class Iter(object):
1050 def __iter__(self):
1051 return self
1052 def __next__(self):
1053 raise StopIteration
1054
1055 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001056 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001057 self.assertRaises(StopIteration, next, it)
1058
1059 def gen():
1060 yield 1
1061 return
1062
1063 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001064 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001065 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001067
Walter Dörwald919497e2003-01-19 16:23:59 +00001068 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001069 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001070 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001071 self.assertRaises(TypeError, oct, ())
1072
1073 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001074 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001075 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001076 self.addCleanup(unlink, TESTFN)
1077 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001078 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 fp.write('The quick brown fox jumps over the lazy dog')
1080 fp.write('.\n')
1081 fp.write('Dear John\n')
1082 fp.write('XXX'*100)
1083 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001084
1085 def test_open(self):
1086 self.write_testfile()
1087 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001088 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001089 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001090 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1091 self.assertEqual(fp.readline(4), 'Dear')
1092 self.assertEqual(fp.readline(100), ' John\n')
1093 self.assertEqual(fp.read(300), 'XXX'*100)
1094 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001095
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001096 # embedded null bytes and characters
1097 self.assertRaises(ValueError, open, 'a\x00b')
1098 self.assertRaises(ValueError, open, b'a\x00b')
1099
Victor Stinner91106cd2017-12-13 12:29:09 +01001100 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001101 def test_open_default_encoding(self):
1102 old_environ = dict(os.environ)
1103 try:
1104 # try to get a user preferred encoding different than the current
1105 # locale encoding to check that open() uses the current locale
1106 # encoding and not the user preferred encoding
1107 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1108 if key in os.environ:
1109 del os.environ[key]
1110
1111 self.write_testfile()
1112 current_locale_encoding = locale.getpreferredencoding(False)
1113 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001114 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001115 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001116 finally:
1117 os.environ.clear()
1118 os.environ.update(old_environ)
1119
Victor Stinnerdaf45552013-08-28 00:53:59 +02001120 def test_open_non_inheritable(self):
1121 fileobj = open(__file__)
1122 with fileobj:
1123 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1124
Walter Dörwald919497e2003-01-19 16:23:59 +00001125 def test_ord(self):
1126 self.assertEqual(ord(' '), 32)
1127 self.assertEqual(ord('A'), 65)
1128 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001129 self.assertEqual(ord('\x80'), 128)
1130 self.assertEqual(ord('\xff'), 255)
1131
1132 self.assertEqual(ord(b' '), 32)
1133 self.assertEqual(ord(b'A'), 65)
1134 self.assertEqual(ord(b'a'), 97)
1135 self.assertEqual(ord(b'\x80'), 128)
1136 self.assertEqual(ord(b'\xff'), 255)
1137
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001138 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001139 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001140
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001141 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1142 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1143 self.assertEqual(ord("\U00010000"), 0x00010000)
1144 self.assertEqual(ord("\U00010001"), 0x00010001)
1145 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1146 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1147 self.assertEqual(ord("\U00100000"), 0x00100000)
1148 self.assertEqual(ord("\U00100001"), 0x00100001)
1149 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1150 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1151
Walter Dörwald919497e2003-01-19 16:23:59 +00001152 def test_pow(self):
1153 self.assertEqual(pow(0,0), 1)
1154 self.assertEqual(pow(0,1), 0)
1155 self.assertEqual(pow(1,0), 1)
1156 self.assertEqual(pow(1,1), 1)
1157
1158 self.assertEqual(pow(2,0), 1)
1159 self.assertEqual(pow(2,10), 1024)
1160 self.assertEqual(pow(2,20), 1024*1024)
1161 self.assertEqual(pow(2,30), 1024*1024*1024)
1162
1163 self.assertEqual(pow(-2,0), 1)
1164 self.assertEqual(pow(-2,1), -2)
1165 self.assertEqual(pow(-2,2), 4)
1166 self.assertEqual(pow(-2,3), -8)
1167
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 self.assertAlmostEqual(pow(0.,0), 1.)
1169 self.assertAlmostEqual(pow(0.,1), 0.)
1170 self.assertAlmostEqual(pow(1.,0), 1.)
1171 self.assertAlmostEqual(pow(1.,1), 1.)
1172
1173 self.assertAlmostEqual(pow(2.,0), 1.)
1174 self.assertAlmostEqual(pow(2.,10), 1024.)
1175 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1176 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1177
1178 self.assertAlmostEqual(pow(-2.,0), 1.)
1179 self.assertAlmostEqual(pow(-2.,1), -2.)
1180 self.assertAlmostEqual(pow(-2.,2), 4.)
1181 self.assertAlmostEqual(pow(-2.,3), -8.)
1182
Mark Dickinson5c2db372009-12-05 20:28:34 +00001183 for x in 2, 2.0:
1184 for y in 10, 10.0:
1185 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001186 if isinstance(x, float) or \
1187 isinstance(y, float) or \
1188 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001189 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 else:
1191 self.assertAlmostEqual(pow(x, y, z), 24.0)
1192
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001193 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1194 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1195
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001196 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001197 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001198
1199 self.assertRaises(TypeError, pow)
1200
Guido van Rossuma88a0332007-02-26 16:59:55 +00001201 def test_input(self):
1202 self.write_testfile()
1203 fp = open(TESTFN, 'r')
1204 savestdin = sys.stdin
1205 savestdout = sys.stdout # Eats the echo
1206 try:
1207 sys.stdin = fp
1208 sys.stdout = BitBucket()
1209 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001210 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1211 self.assertEqual(input('testing\n'), 'Dear John')
1212
1213 # SF 1535165: don't segfault on closed stdin
1214 # sys.stdout must be a regular file for triggering
1215 sys.stdout = savestdout
1216 sys.stdin.close()
1217 self.assertRaises(ValueError, input)
1218
1219 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001220 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001221 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001222 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001223 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001224 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001225 self.assertRaises(EOFError, input)
1226
1227 del sys.stdout
1228 self.assertRaises(RuntimeError, input, 'prompt')
1229 del sys.stdin
1230 self.assertRaises(RuntimeError, input, 'prompt')
1231 finally:
1232 sys.stdin = savestdin
1233 sys.stdout = savestdout
1234 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001235
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001236 # test_int(): see test_int.py for tests of built-in function int().
1237
Walter Dörwald919497e2003-01-19 16:23:59 +00001238 def test_repr(self):
1239 self.assertEqual(repr(''), '\'\'')
1240 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 self.assertEqual(repr(()), '()')
1242 self.assertEqual(repr([]), '[]')
1243 self.assertEqual(repr({}), '{}')
1244 a = []
1245 a.append(a)
1246 self.assertEqual(repr(a), '[[...]]')
1247 a = {}
1248 a[0] = a
1249 self.assertEqual(repr(a), '{0: {...}}')
1250
1251 def test_round(self):
1252 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001253 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001254 self.assertEqual(round(1.0), 1.0)
1255 self.assertEqual(round(10.0), 10.0)
1256 self.assertEqual(round(1000000000.0), 1000000000.0)
1257 self.assertEqual(round(1e20), 1e20)
1258
1259 self.assertEqual(round(-1.0), -1.0)
1260 self.assertEqual(round(-10.0), -10.0)
1261 self.assertEqual(round(-1000000000.0), -1000000000.0)
1262 self.assertEqual(round(-1e20), -1e20)
1263
1264 self.assertEqual(round(0.1), 0.0)
1265 self.assertEqual(round(1.1), 1.0)
1266 self.assertEqual(round(10.1), 10.0)
1267 self.assertEqual(round(1000000000.1), 1000000000.0)
1268
1269 self.assertEqual(round(-1.1), -1.0)
1270 self.assertEqual(round(-10.1), -10.0)
1271 self.assertEqual(round(-1000000000.1), -1000000000.0)
1272
1273 self.assertEqual(round(0.9), 1.0)
1274 self.assertEqual(round(9.9), 10.0)
1275 self.assertEqual(round(999999999.9), 1000000000.0)
1276
1277 self.assertEqual(round(-0.9), -1.0)
1278 self.assertEqual(round(-9.9), -10.0)
1279 self.assertEqual(round(-999999999.9), -1000000000.0)
1280
1281 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001282 self.assertEqual(type(round(-8.0, -1)), float)
1283
1284 self.assertEqual(type(round(-8.0, 0)), float)
1285 self.assertEqual(type(round(-8.0, 1)), float)
1286
1287 # Check even / odd rounding behaviour
1288 self.assertEqual(round(5.5), 6)
1289 self.assertEqual(round(6.5), 6)
1290 self.assertEqual(round(-5.5), -6)
1291 self.assertEqual(round(-6.5), -6)
1292
1293 # Check behavior on ints
1294 self.assertEqual(round(0), 0)
1295 self.assertEqual(round(8), 8)
1296 self.assertEqual(round(-8), -8)
1297 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001298 self.assertEqual(type(round(-8, -1)), int)
1299 self.assertEqual(type(round(-8, 0)), int)
1300 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001302 # test new kwargs
1303 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1304
Walter Dörwald919497e2003-01-19 16:23:59 +00001305 self.assertRaises(TypeError, round)
1306
Alex Martelliae211f92007-08-22 23:21:33 +00001307 # test generic rounding delegation for reals
1308 class TestRound:
1309 def __round__(self):
1310 return 23
1311
1312 class TestNoRound:
1313 pass
1314
1315 self.assertEqual(round(TestRound()), 23)
1316
1317 self.assertRaises(TypeError, round, 1, 2, 3)
1318 self.assertRaises(TypeError, round, TestNoRound())
1319
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001320 t = TestNoRound()
1321 t.__round__ = lambda *args: args
1322 self.assertRaises(TypeError, round, t)
1323 self.assertRaises(TypeError, round, t, 0)
1324
Mark Dickinsonad731b92009-11-09 17:12:30 +00001325 # Some versions of glibc for alpha have a bug that affects
1326 # float -> integer rounding (floor, ceil, rint, round) for
1327 # values in the range [2**52, 2**53). See:
1328 #
1329 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1330 #
1331 # We skip this test on Linux/alpha if it would fail.
1332 linux_alpha = (platform.system().startswith('Linux') and
1333 platform.machine().startswith('alpha'))
1334 system_round_bug = round(5e15+1) != 5e15+1
1335 @unittest.skipIf(linux_alpha and system_round_bug,
1336 "test will fail; failure is probably due to a "
1337 "buggy system round function")
1338 def test_round_large(self):
1339 # Issue #1869: integral floats should remain unchanged
1340 self.assertEqual(round(5e15-1), 5e15-1)
1341 self.assertEqual(round(5e15), 5e15)
1342 self.assertEqual(round(5e15+1), 5e15+1)
1343 self.assertEqual(round(5e15+2), 5e15+2)
1344 self.assertEqual(round(5e15+3), 5e15+3)
1345
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001346 def test_bug_27936(self):
1347 # Verify that ndigits=None means the same as passing in no argument
1348 for x in [1234,
1349 1234.56,
1350 decimal.Decimal('1234.56'),
1351 fractions.Fraction(123456, 100)]:
1352 self.assertEqual(round(x, None), round(x))
1353 self.assertEqual(type(round(x, None)), type(round(x)))
1354
Walter Dörwald919497e2003-01-19 16:23:59 +00001355 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001356 setattr(sys, 'spam', 1)
1357 self.assertEqual(sys.spam, 1)
1358 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1359 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001360
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001361 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001362
Alex Martellia70b1912003-04-22 08:12:33 +00001363 def test_sum(self):
1364 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001365 self.assertEqual(sum(list(range(2,8))), 27)
1366 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001367 self.assertEqual(sum(Squares(10)), 285)
1368 self.assertEqual(sum(iter(Squares(10))), 285)
1369 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1370
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001371 self.assertEqual(sum(range(10), 1000), 1045)
1372 self.assertEqual(sum(range(10), start=1000), 1045)
1373
Alex Martellia70b1912003-04-22 08:12:33 +00001374 self.assertRaises(TypeError, sum)
1375 self.assertRaises(TypeError, sum, 42)
1376 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1377 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001378 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1379 values = [bytearray(b'a'), bytearray(b'b')]
1380 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001381 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1382 self.assertRaises(TypeError, sum, [{2:3}])
1383 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1384
1385 class BadSeq:
1386 def __getitem__(self, index):
1387 raise ValueError
1388 self.assertRaises(ValueError, sum, BadSeq())
1389
Mark Dickinson3a22b472009-10-17 21:48:16 +00001390 empty = []
1391 sum(([x] for x in range(10)), empty)
1392 self.assertEqual(empty, [])
1393
Walter Dörwald919497e2003-01-19 16:23:59 +00001394 def test_type(self):
1395 self.assertEqual(type(''), type('123'))
1396 self.assertNotEqual(type(''), type(()))
1397
Guido van Rossumfee7b932005-01-16 00:21:28 +00001398 # We don't want self in vars(), so these are static methods
1399
1400 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001401 def get_vars_f0():
1402 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001403
Guido van Rossumfee7b932005-01-16 00:21:28 +00001404 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001405 def get_vars_f2():
1406 BuiltinTest.get_vars_f0()
1407 a = 1
1408 b = 2
1409 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001410
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001411 class C_get_vars(object):
1412 def getDict(self):
1413 return {'a':2}
1414 __dict__ = property(fget=getDict)
1415
Walter Dörwald919497e2003-01-19 16:23:59 +00001416 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001417 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001418 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001419 self.assertEqual(self.get_vars_f0(), {})
1420 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1421 self.assertRaises(TypeError, vars, 42, 42)
1422 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001423 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001424
1425 def test_zip(self):
1426 a = (1, 2, 3)
1427 b = (4, 5, 6)
1428 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001429 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001430 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001431 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001432 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001433 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001434 class I:
1435 def __getitem__(self, i):
1436 if i < 0 or i > 2: raise IndexError
1437 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001438 self.assertEqual(list(zip(a, I())), t)
1439 self.assertEqual(list(zip()), [])
1440 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001441 self.assertRaises(TypeError, zip, None)
1442 class G:
1443 pass
1444 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001445 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001446
1447 # Make sure zip doesn't try to allocate a billion elements for the
1448 # result list when one of its arguments doesn't say how long it is.
1449 # A MemoryError is the most likely failure mode.
1450 class SequenceWithoutALength:
1451 def __getitem__(self, i):
1452 if i == 5:
1453 raise IndexError
1454 else:
1455 return i
1456 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001457 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001458 list(enumerate(range(5)))
1459 )
1460
1461 class BadSeq:
1462 def __getitem__(self, i):
1463 if i == 5:
1464 raise ValueError
1465 else:
1466 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001467 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001468
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001469 def test_zip_pickle(self):
1470 a = (1, 2, 3)
1471 b = (4, 5, 6)
1472 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001473 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1474 z1 = zip(a, b)
1475 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001476
Eric Smithe4d63172010-09-13 20:48:43 +00001477 def test_format(self):
1478 # Test the basic machinery of the format() builtin. Don't test
1479 # the specifics of the various formatters
1480 self.assertEqual(format(3, ''), '3')
1481
1482 # Returns some classes to use for various tests. There's
1483 # an old-style version, and a new-style version
1484 def classes_new():
1485 class A(object):
1486 def __init__(self, x):
1487 self.x = x
1488 def __format__(self, format_spec):
1489 return str(self.x) + format_spec
1490 class DerivedFromA(A):
1491 pass
1492
1493 class Simple(object): pass
1494 class DerivedFromSimple(Simple):
1495 def __init__(self, x):
1496 self.x = x
1497 def __format__(self, format_spec):
1498 return str(self.x) + format_spec
1499 class DerivedFromSimple2(DerivedFromSimple): pass
1500 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1501
1502 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1503 self.assertEqual(format(A(3), 'spec'), '3spec')
1504 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1505 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1506 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1507 '10abcdef')
1508
1509 class_test(*classes_new())
1510
1511 def empty_format_spec(value):
1512 # test that:
1513 # format(x, '') == str(x)
1514 # format(x) == str(x)
1515 self.assertEqual(format(value, ""), str(value))
1516 self.assertEqual(format(value), str(value))
1517
1518 # for builtin types, format(x, "") == str(x)
1519 empty_format_spec(17**13)
1520 empty_format_spec(1.0)
1521 empty_format_spec(3.1415e104)
1522 empty_format_spec(-3.1415e104)
1523 empty_format_spec(3.1415e-104)
1524 empty_format_spec(-3.1415e-104)
1525 empty_format_spec(object)
1526 empty_format_spec(None)
1527
1528 # TypeError because self.__format__ returns the wrong type
1529 class BadFormatResult:
1530 def __format__(self, format_spec):
1531 return 1.0
1532 self.assertRaises(TypeError, format, BadFormatResult(), "")
1533
1534 # TypeError because format_spec is not unicode or str
1535 self.assertRaises(TypeError, format, object(), 4)
1536 self.assertRaises(TypeError, format, object(), object())
1537
1538 # tests for object.__format__ really belong elsewhere, but
1539 # there's no good place to put them
1540 x = object().__format__('')
1541 self.assertTrue(x.startswith('<object object at'))
1542
1543 # first argument to object.__format__ must be string
1544 self.assertRaises(TypeError, object().__format__, 3)
1545 self.assertRaises(TypeError, object().__format__, object())
1546 self.assertRaises(TypeError, object().__format__, None)
1547
1548 # --------------------------------------------------------------------
1549 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001550 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001551 class A:
1552 def __format__(self, fmt_str):
1553 return format('', fmt_str)
1554
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001555 self.assertEqual(format(A()), '')
1556 self.assertEqual(format(A(), ''), '')
1557 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001558
1559 class B:
1560 pass
1561
1562 class C(object):
1563 pass
1564
1565 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001566 obj = cls()
1567 self.assertEqual(format(obj), str(obj))
1568 self.assertEqual(format(obj, ''), str(obj))
1569 with self.assertRaisesRegex(TypeError,
1570 r'\b%s\b' % re.escape(cls.__name__)):
1571 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001572 # --------------------------------------------------------------------
1573
1574 # make sure we can take a subclass of str as a format spec
1575 class DerivedFromStr(str): pass
1576 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1577
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001578 def test_bin(self):
1579 self.assertEqual(bin(0), '0b0')
1580 self.assertEqual(bin(1), '0b1')
1581 self.assertEqual(bin(-1), '-0b1')
1582 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1583 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1584 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1585 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1586
Georg Brandl953152f2009-07-22 12:03:59 +00001587 def test_bytearray_translate(self):
1588 x = bytearray(b"abc")
1589 self.assertRaises(ValueError, x.translate, b"1", 1)
1590 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1591
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001592 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001593 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001594 tp = type(const)
1595 self.assertIs(tp(), const)
1596 self.assertRaises(TypeError, tp, 1, 2)
1597 self.assertRaises(TypeError, tp, a=1, b=2)
1598
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001599
1600class TestBreakpoint(unittest.TestCase):
1601 def setUp(self):
1602 # These tests require a clean slate environment. For example, if the
1603 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1604 # will mess up these tests. Similarly for sys.breakpointhook.
1605 # Cleaning the slate here means you can't use breakpoint() to debug
1606 # these tests, but I think that's okay. Just use pdb.set_trace() if
1607 # you must.
1608 self.resources = ExitStack()
1609 self.addCleanup(self.resources.close)
1610 self.env = self.resources.enter_context(EnvironmentVarGuard())
1611 del self.env['PYTHONBREAKPOINT']
1612 self.resources.enter_context(
1613 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1614
1615 def test_breakpoint(self):
1616 with patch('pdb.set_trace') as mock:
1617 breakpoint()
1618 mock.assert_called_once()
1619
1620 def test_breakpoint_with_breakpointhook_set(self):
1621 my_breakpointhook = MagicMock()
1622 sys.breakpointhook = my_breakpointhook
1623 breakpoint()
1624 my_breakpointhook.assert_called_once_with()
1625
1626 def test_breakpoint_with_breakpointhook_reset(self):
1627 my_breakpointhook = MagicMock()
1628 sys.breakpointhook = my_breakpointhook
1629 breakpoint()
1630 my_breakpointhook.assert_called_once_with()
1631 # Reset the hook and it will not be called again.
1632 sys.breakpointhook = sys.__breakpointhook__
1633 with patch('pdb.set_trace') as mock:
1634 breakpoint()
1635 mock.assert_called_once_with()
1636 my_breakpointhook.assert_called_once_with()
1637
1638 def test_breakpoint_with_args_and_keywords(self):
1639 my_breakpointhook = MagicMock()
1640 sys.breakpointhook = my_breakpointhook
1641 breakpoint(1, 2, 3, four=4, five=5)
1642 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1643
1644 def test_breakpoint_with_passthru_error(self):
1645 def my_breakpointhook():
1646 pass
1647 sys.breakpointhook = my_breakpointhook
1648 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1649
1650 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1651 def test_envar_good_path_builtin(self):
1652 self.env['PYTHONBREAKPOINT'] = 'int'
1653 with patch('builtins.int') as mock:
1654 breakpoint('7')
1655 mock.assert_called_once_with('7')
1656
1657 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1658 def test_envar_good_path_other(self):
1659 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1660 with patch('sys.exit') as mock:
1661 breakpoint()
1662 mock.assert_called_once_with()
1663
1664 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1665 def test_envar_good_path_noop_0(self):
1666 self.env['PYTHONBREAKPOINT'] = '0'
1667 with patch('pdb.set_trace') as mock:
1668 breakpoint()
1669 mock.assert_not_called()
1670
1671 def test_envar_good_path_empty_string(self):
1672 # PYTHONBREAKPOINT='' is the same as it not being set.
1673 self.env['PYTHONBREAKPOINT'] = ''
1674 with patch('pdb.set_trace') as mock:
1675 breakpoint()
1676 mock.assert_called_once_with()
1677
1678 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1679 def test_envar_unimportable(self):
1680 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001681 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001682 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001683 'nosuchbuiltin',
1684 'nosuchmodule.nosuchcallable',
1685 ):
1686 with self.subTest(envar=envar):
1687 self.env['PYTHONBREAKPOINT'] = envar
1688 mock = self.resources.enter_context(patch('pdb.set_trace'))
1689 w = self.resources.enter_context(check_warnings(quiet=True))
1690 breakpoint()
1691 self.assertEqual(
1692 str(w.message),
1693 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1694 self.assertEqual(w.category, RuntimeWarning)
1695 mock.assert_not_called()
1696
1697 def test_envar_ignored_when_hook_is_set(self):
1698 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1699 with patch('sys.exit') as mock:
1700 sys.breakpointhook = int
1701 breakpoint()
1702 mock.assert_not_called()
1703
1704
Martin Panterc9a6ab52015-10-10 01:25:38 +00001705@unittest.skipUnless(pty, "the pty and signal modules must be available")
1706class PtyTests(unittest.TestCase):
1707 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1708 terminals in the test environment"""
1709
Martin Pantere44dba32015-10-10 05:27:15 +00001710 def run_child(self, child, terminal_input):
1711 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001712 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001713 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001714 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001715 os.close(r)
1716 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001717 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001718 raise
1719 if pid == 0:
1720 # Child
1721 try:
1722 # Make sure we don't get stuck if there's a problem
1723 signal.alarm(2)
1724 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001725 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001726 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001727 except:
1728 traceback.print_exc()
1729 finally:
1730 # We don't want to return to unittest...
1731 os._exit(0)
1732 # Parent
1733 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001734 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001735 # Get results from the pipe
1736 with open(r, "r") as rpipe:
1737 lines = []
1738 while True:
1739 line = rpipe.readline().strip()
1740 if line == "":
1741 # The other end was closed => the child exited
1742 break
1743 lines.append(line)
1744 # Check the result was got and corresponds to the user's terminal input
1745 if len(lines) != 2:
1746 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001747 # Beware of Linux raising EIO when the slave is closed
1748 child_output = bytearray()
1749 while True:
1750 try:
1751 chunk = os.read(fd, 3000)
1752 except OSError: # Assume EIO
1753 break
1754 if not chunk:
1755 break
1756 child_output.extend(chunk)
1757 os.close(fd)
1758 child_output = child_output.decode("ascii", "ignore")
1759 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1760 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001761 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001762
Victor Stinner3ca9f502017-08-09 23:08:22 +02001763 # Wait until the child process completes
1764 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001765
Martin Pantere44dba32015-10-10 05:27:15 +00001766 return lines
1767
1768 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1769 if not sys.stdin.isatty() or not sys.stdout.isatty():
1770 self.skipTest("stdin and stdout must be ttys")
1771 def child(wpipe):
1772 # Check the error handlers are accounted for
1773 if stdio_encoding:
1774 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1775 encoding=stdio_encoding,
1776 errors='surrogateescape')
1777 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1778 encoding=stdio_encoding,
1779 errors='replace')
1780 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1781 print(ascii(input(prompt)), file=wpipe)
1782 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001783 # Check we did exercise the GNU readline path
1784 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1785 if lines[0] != 'tty = True':
1786 self.skipTest("standard IO in should have been a tty")
1787 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1788 if stdio_encoding:
1789 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1790 else:
1791 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1792 self.assertEqual(input_result, expected)
1793
1794 def test_input_tty(self):
1795 # Test input() functionality when wired to a tty (the code path
1796 # is different and invokes GNU readline if available).
1797 self.check_input_tty("prompt", b"quux")
1798
1799 def test_input_tty_non_ascii(self):
1800 # Check stdin/stdout encoding is used when invoking GNU readline
1801 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1802
1803 def test_input_tty_non_ascii_unicode_errors(self):
1804 # Check stdin/stdout error handler is used when invoking GNU readline
1805 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1806
1807 def test_input_no_stdout_fileno(self):
1808 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1809 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001810 def child(wpipe):
1811 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1812 sys.stdout = io.StringIO() # Does not support fileno()
1813 input("prompt")
1814 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1815 lines = self.run_child(child, b"quux\r")
1816 expected = (
1817 "stdin.isatty(): True",
1818 "captured: 'prompt'",
1819 )
1820 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001821
Raymond Hettinger64958a12003-12-17 20:43:33 +00001822class TestSorted(unittest.TestCase):
1823
1824 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001825 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001826 copy = data[:]
1827 random.shuffle(copy)
1828 self.assertEqual(data, sorted(copy))
1829 self.assertNotEqual(data, copy)
1830
1831 data.reverse()
1832 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001833 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1834 self.assertNotEqual(data, copy)
1835 random.shuffle(copy)
1836 self.assertEqual(data, sorted(copy, reverse=1))
1837 self.assertNotEqual(data, copy)
1838
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001839 def test_bad_arguments(self):
1840 # Issue #29327: The first argument is positional-only.
1841 sorted([])
1842 with self.assertRaises(TypeError):
1843 sorted(iterable=[])
1844 # Other arguments are keyword-only
1845 sorted([], key=None)
1846 with self.assertRaises(TypeError):
1847 sorted([], None)
1848
Raymond Hettinger64958a12003-12-17 20:43:33 +00001849 def test_inputtypes(self):
1850 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001851 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001852 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001853 self.assertEqual(sorted(s), sorted(T(s)))
1854
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001855 s = ''.join(set(s)) # unique letters only
1856 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001857 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001858 self.assertEqual(sorted(s), sorted(T(s)))
1859
1860 def test_baddecorator(self):
1861 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1862 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1863
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001864
1865class ShutdownTest(unittest.TestCase):
1866
1867 def test_cleanup(self):
1868 # Issue #19255: builtins are still available at shutdown
1869 code = """if 1:
1870 import builtins
1871 import sys
1872
1873 class C:
1874 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001875 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001876 # Check that builtins still exist
1877 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001878 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001879
1880 c = C()
1881 # Make this module survive until builtins and sys are cleaned
1882 builtins.here = sys.modules[__name__]
1883 sys.here = sys.modules[__name__]
1884 # Create a reference loop so that this module needs to go
1885 # through a GC phase.
1886 here = sys.modules[__name__]
1887 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001888 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1889 # otherwise the codec may be unloaded before C.__del__() is called, and
1890 # so print("before") fails because the codec cannot be used to encode
1891 # "before" to sys.stdout.encoding. For example, on Windows,
1892 # sys.stdout.encoding is the OEM code page and these code pages are
1893 # implemented in Python
1894 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001895 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001896 self.assertEqual(["before", "after"], out.decode().splitlines())
1897
1898
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001899class TestType(unittest.TestCase):
1900 def test_new_type(self):
1901 A = type('A', (), {})
1902 self.assertEqual(A.__name__, 'A')
1903 self.assertEqual(A.__qualname__, 'A')
1904 self.assertEqual(A.__module__, __name__)
1905 self.assertEqual(A.__bases__, (object,))
1906 self.assertIs(A.__base__, object)
1907 x = A()
1908 self.assertIs(type(x), A)
1909 self.assertIs(x.__class__, A)
1910
1911 class B:
1912 def ham(self):
1913 return 'ham%d' % self
1914 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1915 self.assertEqual(C.__name__, 'C')
1916 self.assertEqual(C.__qualname__, 'C')
1917 self.assertEqual(C.__module__, __name__)
1918 self.assertEqual(C.__bases__, (B, int))
1919 self.assertIs(C.__base__, int)
1920 self.assertIn('spam', C.__dict__)
1921 self.assertNotIn('ham', C.__dict__)
1922 x = C(42)
1923 self.assertEqual(x, 42)
1924 self.assertIs(type(x), C)
1925 self.assertIs(x.__class__, C)
1926 self.assertEqual(x.ham(), 'ham42')
1927 self.assertEqual(x.spam(), 'spam42')
1928 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1929
Nick Coghland78448e2016-07-30 16:26:03 +10001930 def test_type_nokwargs(self):
1931 with self.assertRaises(TypeError):
1932 type('a', (), {}, x=5)
1933 with self.assertRaises(TypeError):
1934 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001935
1936 def test_type_name(self):
1937 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1938 with self.subTest(name=name):
1939 A = type(name, (), {})
1940 self.assertEqual(A.__name__, name)
1941 self.assertEqual(A.__qualname__, name)
1942 self.assertEqual(A.__module__, __name__)
1943 with self.assertRaises(ValueError):
1944 type('A\x00B', (), {})
1945 with self.assertRaises(ValueError):
1946 type('A\udcdcB', (), {})
1947 with self.assertRaises(TypeError):
1948 type(b'A', (), {})
1949
1950 C = type('C', (), {})
1951 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1952 with self.subTest(name=name):
1953 C.__name__ = name
1954 self.assertEqual(C.__name__, name)
1955 self.assertEqual(C.__qualname__, 'C')
1956 self.assertEqual(C.__module__, __name__)
1957
1958 A = type('C', (), {})
1959 with self.assertRaises(ValueError):
1960 A.__name__ = 'A\x00B'
1961 self.assertEqual(A.__name__, 'C')
1962 with self.assertRaises(ValueError):
1963 A.__name__ = 'A\udcdcB'
1964 self.assertEqual(A.__name__, 'C')
1965 with self.assertRaises(TypeError):
1966 A.__name__ = b'A'
1967 self.assertEqual(A.__name__, 'C')
1968
1969 def test_type_qualname(self):
1970 A = type('A', (), {'__qualname__': 'B.C'})
1971 self.assertEqual(A.__name__, 'A')
1972 self.assertEqual(A.__qualname__, 'B.C')
1973 self.assertEqual(A.__module__, __name__)
1974 with self.assertRaises(TypeError):
1975 type('A', (), {'__qualname__': b'B'})
1976 self.assertEqual(A.__qualname__, 'B.C')
1977
1978 A.__qualname__ = 'D.E'
1979 self.assertEqual(A.__name__, 'A')
1980 self.assertEqual(A.__qualname__, 'D.E')
1981 with self.assertRaises(TypeError):
1982 A.__qualname__ = b'B'
1983 self.assertEqual(A.__qualname__, 'D.E')
1984
1985 def test_type_doc(self):
1986 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1987 A = type('A', (), {'__doc__': doc})
1988 self.assertEqual(A.__doc__, doc)
1989 with self.assertRaises(UnicodeEncodeError):
1990 type('A', (), {'__doc__': 'x\udcdcy'})
1991
1992 A = type('A', (), {})
1993 self.assertEqual(A.__doc__, None)
1994 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1995 A.__doc__ = doc
1996 self.assertEqual(A.__doc__, doc)
1997
1998 def test_bad_args(self):
1999 with self.assertRaises(TypeError):
2000 type()
2001 with self.assertRaises(TypeError):
2002 type('A', ())
2003 with self.assertRaises(TypeError):
2004 type('A', (), {}, ())
2005 with self.assertRaises(TypeError):
2006 type('A', (), dict={})
2007 with self.assertRaises(TypeError):
2008 type('A', [], {})
2009 with self.assertRaises(TypeError):
2010 type('A', (), types.MappingProxyType({}))
2011 with self.assertRaises(TypeError):
2012 type('A', (None,), {})
2013 with self.assertRaises(TypeError):
2014 type('A', (bool,), {})
2015 with self.assertRaises(TypeError):
2016 type('A', (int, str), {})
2017
2018 def test_bad_slots(self):
2019 with self.assertRaises(TypeError):
2020 type('A', (), {'__slots__': b'x'})
2021 with self.assertRaises(TypeError):
2022 type('A', (int,), {'__slots__': 'x'})
2023 with self.assertRaises(TypeError):
2024 type('A', (), {'__slots__': ''})
2025 with self.assertRaises(TypeError):
2026 type('A', (), {'__slots__': '42'})
2027 with self.assertRaises(TypeError):
2028 type('A', (), {'__slots__': 'x\x00y'})
2029 with self.assertRaises(ValueError):
2030 type('A', (), {'__slots__': 'x', 'x': 0})
2031 with self.assertRaises(TypeError):
2032 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2033 with self.assertRaises(TypeError):
2034 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2035
2036 class B:
2037 pass
2038 with self.assertRaises(TypeError):
2039 type('A', (B,), {'__slots__': '__dict__'})
2040 with self.assertRaises(TypeError):
2041 type('A', (B,), {'__slots__': '__weakref__'})
2042
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002043 def test_namespace_order(self):
2044 # bpo-34320: namespace should preserve order
2045 od = collections.OrderedDict([('a', 1), ('b', 2)])
2046 od.move_to_end('a')
2047 expected = list(od.items())
2048
2049 C = type('C', (), od)
2050 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2051
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002052
Zachary Warea4b7a752013-11-24 01:19:09 -06002053def load_tests(loader, tests, pattern):
2054 from doctest import DocTestSuite
2055 tests.addTest(DocTestSuite(builtins))
2056 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002057
2058if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002059 unittest.main()