blob: 7b3c054d5eb9e8fb09f585de33229636d30aaf08 [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')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300323 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
324 compile('pass', '?', dont_inherit=True, 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
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400370 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
371 set, and make sure the generated code object has the CO_COROUTINE flag
372 set in order to execute it with `await eval(.....)` instead of exec,
373 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700374 """
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')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400382 code_samples = [
383 '''a = await asyncio.sleep(0, result=1)''',
384 '''async for i in arange(1):
385 a = 1''',
386 '''async with asyncio.Lock() as l:
387 a = 1'''
388 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700389 policy = maybe_get_event_loop_policy()
390 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400391 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700392 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400393 with self.assertRaises(
394 SyntaxError, msg=f"source={source} mode={mode}"):
395 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700396
397 co = compile(source,
398 '?',
399 mode,
400 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
401
402 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400403 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700404
405 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400406 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700407 async_f = FunctionType(co, globals_)
408 asyncio.run(async_f())
409 self.assertEqual(globals_['a'], 1)
410
411 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 asyncio.run(eval(co, globals_))
414 self.assertEqual(globals_['a'], 1)
415 finally:
416 asyncio.set_event_loop_policy(policy)
417
418 def test_compile_async_generator(self):
419 """
420 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400421 make sure AsyncGenerators are still properly not marked with the
422 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700423 """
424 code = dedent("""async def ticker():
425 for i in range(10):
426 yield i
427 await asyncio.sleep(0)""")
428
429 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
430 glob = {}
431 exec(co, glob)
432 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
433
Walter Dörwald919497e2003-01-19 16:23:59 +0000434 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000435 sys.spam = 1
436 delattr(sys, 'spam')
437 self.assertRaises(TypeError, delattr)
438
439 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000440 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000441 self.assertRaises(TypeError, dir, 42, 42)
442
Georg Brandle32b4222007-03-10 22:13:27 +0000443 # dir() - local scope
444 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000445 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000446
447 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000448 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000449
450 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000451 class Foo(types.ModuleType):
452 __dict__ = 8
453 f = Foo("foo")
454 self.assertRaises(TypeError, dir, f)
455
456 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000457 self.assertIn("strip", dir(str))
458 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000459
460 # dir(obj)
461 class Foo(object):
462 def __init__(self):
463 self.x = 7
464 self.y = 8
465 self.z = 9
466 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000467 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000468
469 # dir(obj_no__dict__)
470 class Foo(object):
471 __slots__ = []
472 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000473 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000474
475 # dir(obj_no__class__with__dict__)
476 # (an ugly trick to cause getattr(f, "__class__") to fail)
477 class Foo(object):
478 __slots__ = ["__class__", "__dict__"]
479 def __init__(self):
480 self.bar = "wow"
481 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000482 self.assertNotIn("__repr__", dir(f))
483 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000484
485 # dir(obj_using __dir__)
486 class Foo(object):
487 def __dir__(self):
488 return ["kan", "ga", "roo"]
489 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000490 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000491
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500492 # dir(obj__dir__tuple)
493 class Foo(object):
494 def __dir__(self):
495 return ("b", "c", "a")
496 res = dir(Foo())
497 self.assertIsInstance(res, list)
498 self.assertTrue(res == ["a", "b", "c"])
499
500 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000501 class Foo(object):
502 def __dir__(self):
503 return 7
504 f = Foo()
505 self.assertRaises(TypeError, dir, f)
506
Collin Winter3eed7652007-08-14 17:53:54 +0000507 # dir(traceback)
508 try:
509 raise IndexError
510 except:
511 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
512
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500513 # test that object has a __dir__()
514 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000515
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 def test_divmod(self):
517 self.assertEqual(divmod(12, 7), (1, 5))
518 self.assertEqual(divmod(-12, 7), (-2, 2))
519 self.assertEqual(divmod(12, -7), (-2, -2))
520 self.assertEqual(divmod(-12, -7), (1, -5))
521
Mark Dickinson5c2db372009-12-05 20:28:34 +0000522 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000523
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000524 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
525 (-3.25, 1.0, (-4.0, 0.75)),
526 (3.25, -1.0, (-4.0, -0.75)),
527 (-3.25, -1.0, (3.0, -0.25))]:
528 result = divmod(num, denom)
529 self.assertAlmostEqual(result[0], exp_result[0])
530 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000531
532 self.assertRaises(TypeError, divmod)
533
534 def test_eval(self):
535 self.assertEqual(eval('1+1'), 2)
536 self.assertEqual(eval(' 1+1\n'), 2)
537 globals = {'a': 1, 'b': 2}
538 locals = {'b': 200, 'c': 300}
539 self.assertEqual(eval('a', globals) , 1)
540 self.assertEqual(eval('a', globals, locals), 1)
541 self.assertEqual(eval('b', globals, locals), 200)
542 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000543 globals = {'a': 1, 'b': 2}
544 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000545 bom = b'\xef\xbb\xbf'
546 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000547 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000548 self.assertRaises(TypeError, eval)
549 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000550 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000551
Benjamin Peterson92722792012-12-15 12:51:05 -0500552 class X:
553 def __getitem__(self, key):
554 raise ValueError
555 self.assertRaises(ValueError, eval, "foo", {}, X())
556
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000557 def test_general_eval(self):
558 # Tests that general mappings can be used for the locals argument
559
560 class M:
561 "Test mapping interface versus possible calls from eval()."
562 def __getitem__(self, key):
563 if key == 'a':
564 return 12
565 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000566 def keys(self):
567 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000568
569 m = M()
570 g = globals()
571 self.assertEqual(eval('a', g, m), 12)
572 self.assertRaises(NameError, eval, 'b', g, m)
573 self.assertEqual(eval('dir()', g, m), list('xyz'))
574 self.assertEqual(eval('globals()', g, m), g)
575 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000576 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000577 class A:
578 "Non-mapping"
579 pass
580 m = A()
581 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000582
583 # Verify that dict subclasses work as well
584 class D(dict):
585 def __getitem__(self, key):
586 if key == 'a':
587 return 12
588 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000589 def keys(self):
590 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000591
592 d = D()
593 self.assertEqual(eval('a', g, d), 12)
594 self.assertRaises(NameError, eval, 'b', g, d)
595 self.assertEqual(eval('dir()', g, d), list('xyz'))
596 self.assertEqual(eval('globals()', g, d), g)
597 self.assertEqual(eval('locals()', g, d), d)
598
599 # Verify locals stores (used by list comps)
600 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000601 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000602
603 class SpreadSheet:
604 "Sample application showing nested, calculated lookups."
605 _cells = {}
606 def __setitem__(self, key, formula):
607 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000608 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000609 return eval(self._cells[key], globals(), self)
610
611 ss = SpreadSheet()
612 ss['a1'] = '5'
613 ss['a2'] = 'a1*6'
614 ss['a3'] = 'a2*7'
615 self.assertEqual(ss['a3'], 210)
616
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000617 # Verify that dir() catches a non-list returned by eval
618 # SF bug #1004669
619 class C:
620 def __getitem__(self, item):
621 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000622 def keys(self):
623 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000624 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
625
Georg Brandl7cae87c2006-09-06 06:51:57 +0000626 def test_exec(self):
627 g = {}
628 exec('z = 1', g)
629 if '__builtins__' in g:
630 del g['__builtins__']
631 self.assertEqual(g, {'z': 1})
632
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000633 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000634 if '__builtins__' in g:
635 del g['__builtins__']
636 self.assertEqual(g, {'z': 2})
637 g = {}
638 l = {}
639
Brett Cannon77628992010-03-20 20:59:33 +0000640 with check_warnings():
641 warnings.filterwarnings("ignore", "global statement",
642 module="<string>")
643 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000644 if '__builtins__' in g:
645 del g['__builtins__']
646 if '__builtins__' in l:
647 del l['__builtins__']
648 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
649
Victor Stinnerb0b22422012-04-19 00:57:45 +0200650 def test_exec_globals(self):
651 code = compile("print('Hello World!')", "", "exec")
652 # no builtin function
653 self.assertRaisesRegex(NameError, "name 'print' is not defined",
654 exec, code, {'__builtins__': {}})
655 # __builtins__ must be a mapping type
656 self.assertRaises(TypeError,
657 exec, code, {'__builtins__': 123})
658
659 # no __build_class__ function
660 code = compile("class A: pass", "", "exec")
661 self.assertRaisesRegex(NameError, "__build_class__ not found",
662 exec, code, {'__builtins__': {}})
663
664 class frozendict_error(Exception):
665 pass
666
667 class frozendict(dict):
668 def __setitem__(self, key, value):
669 raise frozendict_error("frozendict is readonly")
670
671 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400672 if isinstance(__builtins__, types.ModuleType):
673 frozen_builtins = frozendict(__builtins__.__dict__)
674 else:
675 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200676 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
677 self.assertRaises(frozendict_error,
678 exec, code, {'__builtins__': frozen_builtins})
679
680 # read-only globals
681 namespace = frozendict({})
682 code = compile("x=1", "test", "exec")
683 self.assertRaises(frozendict_error,
684 exec, code, namespace)
685
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000686 def test_exec_redirected(self):
687 savestdout = sys.stdout
688 sys.stdout = None # Whatever that cannot flush()
689 try:
690 # Used to raise SystemError('error return without exception set')
691 exec('a')
692 except NameError:
693 pass
694 finally:
695 sys.stdout = savestdout
696
Walter Dörwald919497e2003-01-19 16:23:59 +0000697 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000698 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
699 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
700 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
701 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
702 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 def identity(item):
704 return 1
705 filter(identity, Squares(5))
706 self.assertRaises(TypeError, filter)
707 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000708 def __getitem__(self, index):
709 if index<4:
710 return 42
711 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000712 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000713 def badfunc():
714 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000715 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000716
Walter Dörwaldbf517072003-01-27 15:57:14 +0000717 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000718 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
719 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
720 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000721
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000722 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200723 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
724 f1 = filter(filter_char, "abcdeabcde")
725 f2 = filter(filter_char, "abcdeabcde")
726 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000727
Walter Dörwald919497e2003-01-19 16:23:59 +0000728 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000729 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000730 self.assertRaises(TypeError, getattr, sys, 1)
731 self.assertRaises(TypeError, getattr, sys, 1, "foo")
732 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000733 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000734 # unicode surrogates are not encodable to the default encoding (utf8)
735 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000736
737 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000738 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000739 self.assertRaises(TypeError, hasattr, sys, 1)
740 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000741 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000742
Benjamin Peterson17689992010-08-24 03:26:23 +0000743 # Check that hasattr propagates all exceptions outside of
744 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000745 class A:
746 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000747 raise SystemExit
748 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000749 class B:
750 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000751 raise ValueError
752 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000753
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 def test_hash(self):
755 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000756 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000757 self.assertEqual(hash(1), hash(1.0))
758 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000759 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 hash((0,1,2,3))
761 def f(): pass
762 self.assertRaises(TypeError, hash, [])
763 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000764 # Bug 1536021: Allow hash to return long objects
765 class X:
766 def __hash__(self):
767 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000768 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000769 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000770 def __hash__(self):
771 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000772 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000773
774 def test_hex(self):
775 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000776 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 self.assertRaises(TypeError, hex, {})
778
779 def test_id(self):
780 id(None)
781 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 id(1.0)
783 id('spam')
784 id((0,1,2,3))
785 id([0,1,2,3])
786 id({'spam': 1, 'eggs': 2, 'ham': 3})
787
Guido van Rossuma88a0332007-02-26 16:59:55 +0000788 # Test input() later, alphabetized as if it were raw_input
789
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 def test_iter(self):
791 self.assertRaises(TypeError, iter)
792 self.assertRaises(TypeError, iter, 42, 42)
793 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000794 for l in lists:
795 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000796 self.assertEqual(next(i), '1')
797 self.assertEqual(next(i), '2')
798 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000799
800 def test_isinstance(self):
801 class C:
802 pass
803 class D(C):
804 pass
805 class E:
806 pass
807 c = C()
808 d = D()
809 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000810 self.assertTrue(isinstance(c, C))
811 self.assertTrue(isinstance(d, C))
812 self.assertTrue(not isinstance(e, C))
813 self.assertTrue(not isinstance(c, D))
814 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 self.assertRaises(TypeError, isinstance, E, 'foo')
816 self.assertRaises(TypeError, isinstance)
817
818 def test_issubclass(self):
819 class C:
820 pass
821 class D(C):
822 pass
823 class E:
824 pass
825 c = C()
826 d = D()
827 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000828 self.assertTrue(issubclass(D, C))
829 self.assertTrue(issubclass(C, C))
830 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000831 self.assertRaises(TypeError, issubclass, 'foo', E)
832 self.assertRaises(TypeError, issubclass, E, 'foo')
833 self.assertRaises(TypeError, issubclass)
834
835 def test_len(self):
836 self.assertEqual(len('123'), 3)
837 self.assertEqual(len(()), 0)
838 self.assertEqual(len((1, 2, 3, 4)), 4)
839 self.assertEqual(len([1, 2, 3, 4]), 4)
840 self.assertEqual(len({}), 0)
841 self.assertEqual(len({'a':1, 'b': 2}), 2)
842 class BadSeq:
843 def __len__(self):
844 raise ValueError
845 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000846 class InvalidLen:
847 def __len__(self):
848 return None
849 self.assertRaises(TypeError, len, InvalidLen())
850 class FloatLen:
851 def __len__(self):
852 return 4.5
853 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300854 class NegativeLen:
855 def __len__(self):
856 return -10
857 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000858 class HugeLen:
859 def __len__(self):
860 return sys.maxsize + 1
861 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300862 class HugeNegativeLen:
863 def __len__(self):
864 return -sys.maxsize-10
865 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000866 class NoLenMethod(object): pass
867 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000868
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 def test_map(self):
870 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000871 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000872 [1, 4, 9]
873 )
874 try:
875 from math import sqrt
876 except ImportError:
877 def sqrt(x):
878 return pow(x, 0.5)
879 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000880 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000881 [[4.0, 2.0], [9.0, 3.0]]
882 )
883 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000884 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000885 [10, 4, 6]
886 )
887
888 def plus(*v):
889 accu = 0
890 for i in v: accu = accu + i
891 return accu
892 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000893 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000894 [1, 3, 7]
895 )
896 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000897 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000898 [1+4, 3+9, 7+2]
899 )
900 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000901 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 [1+4+1, 3+9+1, 7+2+0]
903 )
904 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000905 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
907 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000908 def Max(a, b):
909 if a is None:
910 return b
911 if b is None:
912 return a
913 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000915 list(map(Max, Squares(3), Squares(2))),
916 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 )
918 self.assertRaises(TypeError, map)
919 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000920 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000921 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000923 yield None
924 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000925 def badfunc(x):
926 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000927 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000928
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000929 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200930 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
931 m1 = map(map_char, "Is this the real life?")
932 m2 = map(map_char, "Is this the real life?")
933 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000934
Walter Dörwald919497e2003-01-19 16:23:59 +0000935 def test_max(self):
936 self.assertEqual(max('123123'), '3')
937 self.assertEqual(max(1, 2, 3), 3)
938 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
939 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
940
Guido van Rossume2a383d2007-01-15 16:59:06 +0000941 self.assertEqual(max(1, 2, 3.0), 3.0)
942 self.assertEqual(max(1, 2.0, 3), 3)
943 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000944
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700945 self.assertRaises(TypeError, max)
946 self.assertRaises(TypeError, max, 42)
947 self.assertRaises(ValueError, max, ())
948 class BadSeq:
949 def __getitem__(self, index):
950 raise ValueError
951 self.assertRaises(ValueError, max, BadSeq())
952
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000953 for stmt in (
954 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700955 "max(default=None)",
956 "max(1, 2, default=None)", # require container for default
957 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000958 "max(1, key=int)", # single arg not iterable
959 "max(1, 2, keystone=int)", # wrong keyword
960 "max(1, 2, key=int, abc=int)", # two many keywords
961 "max(1, 2, key=1)", # keyfunc is not callable
962 ):
Tim Peters7f061872004-12-07 21:17:46 +0000963 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000964 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000965 except TypeError:
966 pass
967 else:
968 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000969
970 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
971 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
972 self.assertEqual(max(1, 2, key=neg), 1) # two elems
973
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700974 self.assertEqual(max((), default=None), None) # zero elem iterable
975 self.assertEqual(max((1,), default=None), 1) # one elem iterable
976 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
977
978 self.assertEqual(max((), default=1, key=neg), 1)
979 self.assertEqual(max((1, 2), default=3, key=neg), 1)
980
Alexander Marshalove22072f2018-07-24 10:58:21 +0700981 self.assertEqual(max((1, 2), key=None), 2)
982
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000983 data = [random.randrange(200) for i in range(100)]
984 keys = dict((elem, random.randrange(50)) for elem in data)
985 f = keys.__getitem__
986 self.assertEqual(max(data, key=f),
987 sorted(reversed(data), key=f)[-1])
988
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 def test_min(self):
990 self.assertEqual(min('123123'), '1')
991 self.assertEqual(min(1, 2, 3), 1)
992 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
993 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
994
Guido van Rossume2a383d2007-01-15 16:59:06 +0000995 self.assertEqual(min(1, 2, 3.0), 1)
996 self.assertEqual(min(1, 2.0, 3), 1)
997 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000998
999 self.assertRaises(TypeError, min)
1000 self.assertRaises(TypeError, min, 42)
1001 self.assertRaises(ValueError, min, ())
1002 class BadSeq:
1003 def __getitem__(self, index):
1004 raise ValueError
1005 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001006
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001007 for stmt in (
1008 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001009 "min(default=None)",
1010 "min(1, 2, default=None)", # require container for default
1011 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001012 "min(1, key=int)", # single arg not iterable
1013 "min(1, 2, keystone=int)", # wrong keyword
1014 "min(1, 2, key=int, abc=int)", # two many keywords
1015 "min(1, 2, key=1)", # keyfunc is not callable
1016 ):
Tim Peters7f061872004-12-07 21:17:46 +00001017 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001018 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001019 except TypeError:
1020 pass
1021 else:
1022 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001023
1024 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1025 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1026 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1027
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001028 self.assertEqual(min((), default=None), None) # zero elem iterable
1029 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1030 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1031
1032 self.assertEqual(min((), default=1, key=neg), 1)
1033 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1034
Alexander Marshalove22072f2018-07-24 10:58:21 +07001035 self.assertEqual(min((1, 2), key=None), 1)
1036
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001037 data = [random.randrange(200) for i in range(100)]
1038 keys = dict((elem, random.randrange(50)) for elem in data)
1039 f = keys.__getitem__
1040 self.assertEqual(min(data, key=f),
1041 sorted(data, key=f)[0])
1042
Georg Brandla18af4e2007-04-21 15:47:16 +00001043 def test_next(self):
1044 it = iter(range(2))
1045 self.assertEqual(next(it), 0)
1046 self.assertEqual(next(it), 1)
1047 self.assertRaises(StopIteration, next, it)
1048 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001049 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001050
1051 class Iter(object):
1052 def __iter__(self):
1053 return self
1054 def __next__(self):
1055 raise StopIteration
1056
1057 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001058 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001059 self.assertRaises(StopIteration, next, it)
1060
1061 def gen():
1062 yield 1
1063 return
1064
1065 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001067 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001068 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001071 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001072 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001073 self.assertRaises(TypeError, oct, ())
1074
1075 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001076 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001078 self.addCleanup(unlink, TESTFN)
1079 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001081 fp.write('The quick brown fox jumps over the lazy dog')
1082 fp.write('.\n')
1083 fp.write('Dear John\n')
1084 fp.write('XXX'*100)
1085 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001086
1087 def test_open(self):
1088 self.write_testfile()
1089 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001090 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001091 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001092 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1093 self.assertEqual(fp.readline(4), 'Dear')
1094 self.assertEqual(fp.readline(100), ' John\n')
1095 self.assertEqual(fp.read(300), 'XXX'*100)
1096 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001097
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001098 # embedded null bytes and characters
1099 self.assertRaises(ValueError, open, 'a\x00b')
1100 self.assertRaises(ValueError, open, b'a\x00b')
1101
Victor Stinner91106cd2017-12-13 12:29:09 +01001102 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001103 def test_open_default_encoding(self):
1104 old_environ = dict(os.environ)
1105 try:
1106 # try to get a user preferred encoding different than the current
1107 # locale encoding to check that open() uses the current locale
1108 # encoding and not the user preferred encoding
1109 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1110 if key in os.environ:
1111 del os.environ[key]
1112
1113 self.write_testfile()
1114 current_locale_encoding = locale.getpreferredencoding(False)
1115 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001116 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001117 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001118 finally:
1119 os.environ.clear()
1120 os.environ.update(old_environ)
1121
Victor Stinnerdaf45552013-08-28 00:53:59 +02001122 def test_open_non_inheritable(self):
1123 fileobj = open(__file__)
1124 with fileobj:
1125 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1126
Walter Dörwald919497e2003-01-19 16:23:59 +00001127 def test_ord(self):
1128 self.assertEqual(ord(' '), 32)
1129 self.assertEqual(ord('A'), 65)
1130 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001131 self.assertEqual(ord('\x80'), 128)
1132 self.assertEqual(ord('\xff'), 255)
1133
1134 self.assertEqual(ord(b' '), 32)
1135 self.assertEqual(ord(b'A'), 65)
1136 self.assertEqual(ord(b'a'), 97)
1137 self.assertEqual(ord(b'\x80'), 128)
1138 self.assertEqual(ord(b'\xff'), 255)
1139
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001140 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001141 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001142
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001143 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1144 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1145 self.assertEqual(ord("\U00010000"), 0x00010000)
1146 self.assertEqual(ord("\U00010001"), 0x00010001)
1147 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1148 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1149 self.assertEqual(ord("\U00100000"), 0x00100000)
1150 self.assertEqual(ord("\U00100001"), 0x00100001)
1151 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1152 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1153
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 def test_pow(self):
1155 self.assertEqual(pow(0,0), 1)
1156 self.assertEqual(pow(0,1), 0)
1157 self.assertEqual(pow(1,0), 1)
1158 self.assertEqual(pow(1,1), 1)
1159
1160 self.assertEqual(pow(2,0), 1)
1161 self.assertEqual(pow(2,10), 1024)
1162 self.assertEqual(pow(2,20), 1024*1024)
1163 self.assertEqual(pow(2,30), 1024*1024*1024)
1164
1165 self.assertEqual(pow(-2,0), 1)
1166 self.assertEqual(pow(-2,1), -2)
1167 self.assertEqual(pow(-2,2), 4)
1168 self.assertEqual(pow(-2,3), -8)
1169
Walter Dörwald919497e2003-01-19 16:23:59 +00001170 self.assertAlmostEqual(pow(0.,0), 1.)
1171 self.assertAlmostEqual(pow(0.,1), 0.)
1172 self.assertAlmostEqual(pow(1.,0), 1.)
1173 self.assertAlmostEqual(pow(1.,1), 1.)
1174
1175 self.assertAlmostEqual(pow(2.,0), 1.)
1176 self.assertAlmostEqual(pow(2.,10), 1024.)
1177 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1178 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1179
1180 self.assertAlmostEqual(pow(-2.,0), 1.)
1181 self.assertAlmostEqual(pow(-2.,1), -2.)
1182 self.assertAlmostEqual(pow(-2.,2), 4.)
1183 self.assertAlmostEqual(pow(-2.,3), -8.)
1184
Mark Dickinson5c2db372009-12-05 20:28:34 +00001185 for x in 2, 2.0:
1186 for y in 10, 10.0:
1187 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001188 if isinstance(x, float) or \
1189 isinstance(y, float) or \
1190 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001191 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 else:
1193 self.assertAlmostEqual(pow(x, y, z), 24.0)
1194
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001195 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1196 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1197
Mark Dickinsonc5299672019-06-02 10:24:06 +01001198 # See test_pow for additional tests for three-argument pow.
1199 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001200 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001201
1202 self.assertRaises(TypeError, pow)
1203
Guido van Rossuma88a0332007-02-26 16:59:55 +00001204 def test_input(self):
1205 self.write_testfile()
1206 fp = open(TESTFN, 'r')
1207 savestdin = sys.stdin
1208 savestdout = sys.stdout # Eats the echo
1209 try:
1210 sys.stdin = fp
1211 sys.stdout = BitBucket()
1212 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001213 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1214 self.assertEqual(input('testing\n'), 'Dear John')
1215
1216 # SF 1535165: don't segfault on closed stdin
1217 # sys.stdout must be a regular file for triggering
1218 sys.stdout = savestdout
1219 sys.stdin.close()
1220 self.assertRaises(ValueError, input)
1221
1222 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001223 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001224 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001225 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001226 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001227 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001228 self.assertRaises(EOFError, input)
1229
1230 del sys.stdout
1231 self.assertRaises(RuntimeError, input, 'prompt')
1232 del sys.stdin
1233 self.assertRaises(RuntimeError, input, 'prompt')
1234 finally:
1235 sys.stdin = savestdin
1236 sys.stdout = savestdout
1237 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001238
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001239 # test_int(): see test_int.py for tests of built-in function int().
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 def test_repr(self):
1242 self.assertEqual(repr(''), '\'\'')
1243 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001244 self.assertEqual(repr(()), '()')
1245 self.assertEqual(repr([]), '[]')
1246 self.assertEqual(repr({}), '{}')
1247 a = []
1248 a.append(a)
1249 self.assertEqual(repr(a), '[[...]]')
1250 a = {}
1251 a[0] = a
1252 self.assertEqual(repr(a), '{0: {...}}')
1253
1254 def test_round(self):
1255 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001256 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001257 self.assertEqual(round(1.0), 1.0)
1258 self.assertEqual(round(10.0), 10.0)
1259 self.assertEqual(round(1000000000.0), 1000000000.0)
1260 self.assertEqual(round(1e20), 1e20)
1261
1262 self.assertEqual(round(-1.0), -1.0)
1263 self.assertEqual(round(-10.0), -10.0)
1264 self.assertEqual(round(-1000000000.0), -1000000000.0)
1265 self.assertEqual(round(-1e20), -1e20)
1266
1267 self.assertEqual(round(0.1), 0.0)
1268 self.assertEqual(round(1.1), 1.0)
1269 self.assertEqual(round(10.1), 10.0)
1270 self.assertEqual(round(1000000000.1), 1000000000.0)
1271
1272 self.assertEqual(round(-1.1), -1.0)
1273 self.assertEqual(round(-10.1), -10.0)
1274 self.assertEqual(round(-1000000000.1), -1000000000.0)
1275
1276 self.assertEqual(round(0.9), 1.0)
1277 self.assertEqual(round(9.9), 10.0)
1278 self.assertEqual(round(999999999.9), 1000000000.0)
1279
1280 self.assertEqual(round(-0.9), -1.0)
1281 self.assertEqual(round(-9.9), -10.0)
1282 self.assertEqual(round(-999999999.9), -1000000000.0)
1283
1284 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001285 self.assertEqual(type(round(-8.0, -1)), float)
1286
1287 self.assertEqual(type(round(-8.0, 0)), float)
1288 self.assertEqual(type(round(-8.0, 1)), float)
1289
1290 # Check even / odd rounding behaviour
1291 self.assertEqual(round(5.5), 6)
1292 self.assertEqual(round(6.5), 6)
1293 self.assertEqual(round(-5.5), -6)
1294 self.assertEqual(round(-6.5), -6)
1295
1296 # Check behavior on ints
1297 self.assertEqual(round(0), 0)
1298 self.assertEqual(round(8), 8)
1299 self.assertEqual(round(-8), -8)
1300 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001301 self.assertEqual(type(round(-8, -1)), int)
1302 self.assertEqual(type(round(-8, 0)), int)
1303 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001304
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001305 # test new kwargs
1306 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1307
Walter Dörwald919497e2003-01-19 16:23:59 +00001308 self.assertRaises(TypeError, round)
1309
Alex Martelliae211f92007-08-22 23:21:33 +00001310 # test generic rounding delegation for reals
1311 class TestRound:
1312 def __round__(self):
1313 return 23
1314
1315 class TestNoRound:
1316 pass
1317
1318 self.assertEqual(round(TestRound()), 23)
1319
1320 self.assertRaises(TypeError, round, 1, 2, 3)
1321 self.assertRaises(TypeError, round, TestNoRound())
1322
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001323 t = TestNoRound()
1324 t.__round__ = lambda *args: args
1325 self.assertRaises(TypeError, round, t)
1326 self.assertRaises(TypeError, round, t, 0)
1327
Mark Dickinsonad731b92009-11-09 17:12:30 +00001328 # Some versions of glibc for alpha have a bug that affects
1329 # float -> integer rounding (floor, ceil, rint, round) for
1330 # values in the range [2**52, 2**53). See:
1331 #
1332 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1333 #
1334 # We skip this test on Linux/alpha if it would fail.
1335 linux_alpha = (platform.system().startswith('Linux') and
1336 platform.machine().startswith('alpha'))
1337 system_round_bug = round(5e15+1) != 5e15+1
1338 @unittest.skipIf(linux_alpha and system_round_bug,
1339 "test will fail; failure is probably due to a "
1340 "buggy system round function")
1341 def test_round_large(self):
1342 # Issue #1869: integral floats should remain unchanged
1343 self.assertEqual(round(5e15-1), 5e15-1)
1344 self.assertEqual(round(5e15), 5e15)
1345 self.assertEqual(round(5e15+1), 5e15+1)
1346 self.assertEqual(round(5e15+2), 5e15+2)
1347 self.assertEqual(round(5e15+3), 5e15+3)
1348
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001349 def test_bug_27936(self):
1350 # Verify that ndigits=None means the same as passing in no argument
1351 for x in [1234,
1352 1234.56,
1353 decimal.Decimal('1234.56'),
1354 fractions.Fraction(123456, 100)]:
1355 self.assertEqual(round(x, None), round(x))
1356 self.assertEqual(type(round(x, None)), type(round(x)))
1357
Walter Dörwald919497e2003-01-19 16:23:59 +00001358 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001359 setattr(sys, 'spam', 1)
1360 self.assertEqual(sys.spam, 1)
1361 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1362 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001363
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001364 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001365
Alex Martellia70b1912003-04-22 08:12:33 +00001366 def test_sum(self):
1367 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001368 self.assertEqual(sum(list(range(2,8))), 27)
1369 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001370 self.assertEqual(sum(Squares(10)), 285)
1371 self.assertEqual(sum(iter(Squares(10))), 285)
1372 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1373
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001374 self.assertEqual(sum(range(10), 1000), 1045)
1375 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001376 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1377 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1378
1379 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1380 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1381 2**31+2)
1382 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1383 2**63+2)
1384 self.assertIs(sum([], False), False)
1385
1386 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1387 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1388 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1389 self.assertEqual(sum([0.5, 1]), 1.5)
1390 self.assertEqual(sum([1, 0.5]), 1.5)
1391 self.assertEqual(repr(sum([-0.0])), '0.0')
1392 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1393 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001394
Alex Martellia70b1912003-04-22 08:12:33 +00001395 self.assertRaises(TypeError, sum)
1396 self.assertRaises(TypeError, sum, 42)
1397 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1398 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001399 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1400 values = [bytearray(b'a'), bytearray(b'b')]
1401 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001402 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1403 self.assertRaises(TypeError, sum, [{2:3}])
1404 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001405 self.assertRaises(TypeError, sum, [], '')
1406 self.assertRaises(TypeError, sum, [], b'')
1407 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001408
1409 class BadSeq:
1410 def __getitem__(self, index):
1411 raise ValueError
1412 self.assertRaises(ValueError, sum, BadSeq())
1413
Mark Dickinson3a22b472009-10-17 21:48:16 +00001414 empty = []
1415 sum(([x] for x in range(10)), empty)
1416 self.assertEqual(empty, [])
1417
Walter Dörwald919497e2003-01-19 16:23:59 +00001418 def test_type(self):
1419 self.assertEqual(type(''), type('123'))
1420 self.assertNotEqual(type(''), type(()))
1421
Guido van Rossumfee7b932005-01-16 00:21:28 +00001422 # We don't want self in vars(), so these are static methods
1423
1424 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001425 def get_vars_f0():
1426 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001427
Guido van Rossumfee7b932005-01-16 00:21:28 +00001428 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001429 def get_vars_f2():
1430 BuiltinTest.get_vars_f0()
1431 a = 1
1432 b = 2
1433 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001434
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001435 class C_get_vars(object):
1436 def getDict(self):
1437 return {'a':2}
1438 __dict__ = property(fget=getDict)
1439
Walter Dörwald919497e2003-01-19 16:23:59 +00001440 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001441 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001442 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001443 self.assertEqual(self.get_vars_f0(), {})
1444 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1445 self.assertRaises(TypeError, vars, 42, 42)
1446 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001447 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001448
1449 def test_zip(self):
1450 a = (1, 2, 3)
1451 b = (4, 5, 6)
1452 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001453 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001454 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001455 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001456 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001457 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001458 class I:
1459 def __getitem__(self, i):
1460 if i < 0 or i > 2: raise IndexError
1461 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001462 self.assertEqual(list(zip(a, I())), t)
1463 self.assertEqual(list(zip()), [])
1464 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001465 self.assertRaises(TypeError, zip, None)
1466 class G:
1467 pass
1468 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001469 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001470
1471 # Make sure zip doesn't try to allocate a billion elements for the
1472 # result list when one of its arguments doesn't say how long it is.
1473 # A MemoryError is the most likely failure mode.
1474 class SequenceWithoutALength:
1475 def __getitem__(self, i):
1476 if i == 5:
1477 raise IndexError
1478 else:
1479 return i
1480 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001481 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001482 list(enumerate(range(5)))
1483 )
1484
1485 class BadSeq:
1486 def __getitem__(self, i):
1487 if i == 5:
1488 raise ValueError
1489 else:
1490 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001491 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001492
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001493 def test_zip_pickle(self):
1494 a = (1, 2, 3)
1495 b = (4, 5, 6)
1496 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001497 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1498 z1 = zip(a, b)
1499 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001500
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001501 def test_zip_bad_iterable(self):
1502 exception = TypeError()
1503
1504 class BadIterable:
1505 def __iter__(self):
1506 raise exception
1507
1508 with self.assertRaises(TypeError) as cm:
1509 zip(BadIterable())
1510
1511 self.assertIs(cm.exception, exception)
1512
Eric Smithe4d63172010-09-13 20:48:43 +00001513 def test_format(self):
1514 # Test the basic machinery of the format() builtin. Don't test
1515 # the specifics of the various formatters
1516 self.assertEqual(format(3, ''), '3')
1517
1518 # Returns some classes to use for various tests. There's
1519 # an old-style version, and a new-style version
1520 def classes_new():
1521 class A(object):
1522 def __init__(self, x):
1523 self.x = x
1524 def __format__(self, format_spec):
1525 return str(self.x) + format_spec
1526 class DerivedFromA(A):
1527 pass
1528
1529 class Simple(object): pass
1530 class DerivedFromSimple(Simple):
1531 def __init__(self, x):
1532 self.x = x
1533 def __format__(self, format_spec):
1534 return str(self.x) + format_spec
1535 class DerivedFromSimple2(DerivedFromSimple): pass
1536 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1537
1538 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1539 self.assertEqual(format(A(3), 'spec'), '3spec')
1540 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1541 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1542 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1543 '10abcdef')
1544
1545 class_test(*classes_new())
1546
1547 def empty_format_spec(value):
1548 # test that:
1549 # format(x, '') == str(x)
1550 # format(x) == str(x)
1551 self.assertEqual(format(value, ""), str(value))
1552 self.assertEqual(format(value), str(value))
1553
1554 # for builtin types, format(x, "") == str(x)
1555 empty_format_spec(17**13)
1556 empty_format_spec(1.0)
1557 empty_format_spec(3.1415e104)
1558 empty_format_spec(-3.1415e104)
1559 empty_format_spec(3.1415e-104)
1560 empty_format_spec(-3.1415e-104)
1561 empty_format_spec(object)
1562 empty_format_spec(None)
1563
1564 # TypeError because self.__format__ returns the wrong type
1565 class BadFormatResult:
1566 def __format__(self, format_spec):
1567 return 1.0
1568 self.assertRaises(TypeError, format, BadFormatResult(), "")
1569
1570 # TypeError because format_spec is not unicode or str
1571 self.assertRaises(TypeError, format, object(), 4)
1572 self.assertRaises(TypeError, format, object(), object())
1573
1574 # tests for object.__format__ really belong elsewhere, but
1575 # there's no good place to put them
1576 x = object().__format__('')
1577 self.assertTrue(x.startswith('<object object at'))
1578
1579 # first argument to object.__format__ must be string
1580 self.assertRaises(TypeError, object().__format__, 3)
1581 self.assertRaises(TypeError, object().__format__, object())
1582 self.assertRaises(TypeError, object().__format__, None)
1583
1584 # --------------------------------------------------------------------
1585 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001586 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001587 class A:
1588 def __format__(self, fmt_str):
1589 return format('', fmt_str)
1590
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001591 self.assertEqual(format(A()), '')
1592 self.assertEqual(format(A(), ''), '')
1593 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001594
1595 class B:
1596 pass
1597
1598 class C(object):
1599 pass
1600
1601 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001602 obj = cls()
1603 self.assertEqual(format(obj), str(obj))
1604 self.assertEqual(format(obj, ''), str(obj))
1605 with self.assertRaisesRegex(TypeError,
1606 r'\b%s\b' % re.escape(cls.__name__)):
1607 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001608 # --------------------------------------------------------------------
1609
1610 # make sure we can take a subclass of str as a format spec
1611 class DerivedFromStr(str): pass
1612 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1613
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001614 def test_bin(self):
1615 self.assertEqual(bin(0), '0b0')
1616 self.assertEqual(bin(1), '0b1')
1617 self.assertEqual(bin(-1), '-0b1')
1618 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1619 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1620 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1621 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1622
Georg Brandl953152f2009-07-22 12:03:59 +00001623 def test_bytearray_translate(self):
1624 x = bytearray(b"abc")
1625 self.assertRaises(ValueError, x.translate, b"1", 1)
1626 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1627
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001628 def test_bytearray_extend_error(self):
1629 array = bytearray()
1630 bad_iter = map(int, "X")
1631 self.assertRaises(ValueError, array.extend, bad_iter)
1632
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001633 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001634 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001635 tp = type(const)
1636 self.assertIs(tp(), const)
1637 self.assertRaises(TypeError, tp, 1, 2)
1638 self.assertRaises(TypeError, tp, a=1, b=2)
1639
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001640
1641class TestBreakpoint(unittest.TestCase):
1642 def setUp(self):
1643 # These tests require a clean slate environment. For example, if the
1644 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1645 # will mess up these tests. Similarly for sys.breakpointhook.
1646 # Cleaning the slate here means you can't use breakpoint() to debug
1647 # these tests, but I think that's okay. Just use pdb.set_trace() if
1648 # you must.
1649 self.resources = ExitStack()
1650 self.addCleanup(self.resources.close)
1651 self.env = self.resources.enter_context(EnvironmentVarGuard())
1652 del self.env['PYTHONBREAKPOINT']
1653 self.resources.enter_context(
1654 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1655
1656 def test_breakpoint(self):
1657 with patch('pdb.set_trace') as mock:
1658 breakpoint()
1659 mock.assert_called_once()
1660
1661 def test_breakpoint_with_breakpointhook_set(self):
1662 my_breakpointhook = MagicMock()
1663 sys.breakpointhook = my_breakpointhook
1664 breakpoint()
1665 my_breakpointhook.assert_called_once_with()
1666
1667 def test_breakpoint_with_breakpointhook_reset(self):
1668 my_breakpointhook = MagicMock()
1669 sys.breakpointhook = my_breakpointhook
1670 breakpoint()
1671 my_breakpointhook.assert_called_once_with()
1672 # Reset the hook and it will not be called again.
1673 sys.breakpointhook = sys.__breakpointhook__
1674 with patch('pdb.set_trace') as mock:
1675 breakpoint()
1676 mock.assert_called_once_with()
1677 my_breakpointhook.assert_called_once_with()
1678
1679 def test_breakpoint_with_args_and_keywords(self):
1680 my_breakpointhook = MagicMock()
1681 sys.breakpointhook = my_breakpointhook
1682 breakpoint(1, 2, 3, four=4, five=5)
1683 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1684
1685 def test_breakpoint_with_passthru_error(self):
1686 def my_breakpointhook():
1687 pass
1688 sys.breakpointhook = my_breakpointhook
1689 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1690
1691 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1692 def test_envar_good_path_builtin(self):
1693 self.env['PYTHONBREAKPOINT'] = 'int'
1694 with patch('builtins.int') as mock:
1695 breakpoint('7')
1696 mock.assert_called_once_with('7')
1697
1698 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1699 def test_envar_good_path_other(self):
1700 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1701 with patch('sys.exit') as mock:
1702 breakpoint()
1703 mock.assert_called_once_with()
1704
1705 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1706 def test_envar_good_path_noop_0(self):
1707 self.env['PYTHONBREAKPOINT'] = '0'
1708 with patch('pdb.set_trace') as mock:
1709 breakpoint()
1710 mock.assert_not_called()
1711
1712 def test_envar_good_path_empty_string(self):
1713 # PYTHONBREAKPOINT='' is the same as it not being set.
1714 self.env['PYTHONBREAKPOINT'] = ''
1715 with patch('pdb.set_trace') as mock:
1716 breakpoint()
1717 mock.assert_called_once_with()
1718
1719 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1720 def test_envar_unimportable(self):
1721 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001722 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001723 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001724 'nosuchbuiltin',
1725 'nosuchmodule.nosuchcallable',
1726 ):
1727 with self.subTest(envar=envar):
1728 self.env['PYTHONBREAKPOINT'] = envar
1729 mock = self.resources.enter_context(patch('pdb.set_trace'))
1730 w = self.resources.enter_context(check_warnings(quiet=True))
1731 breakpoint()
1732 self.assertEqual(
1733 str(w.message),
1734 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1735 self.assertEqual(w.category, RuntimeWarning)
1736 mock.assert_not_called()
1737
1738 def test_envar_ignored_when_hook_is_set(self):
1739 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1740 with patch('sys.exit') as mock:
1741 sys.breakpointhook = int
1742 breakpoint()
1743 mock.assert_not_called()
1744
1745
Martin Panterc9a6ab52015-10-10 01:25:38 +00001746@unittest.skipUnless(pty, "the pty and signal modules must be available")
1747class PtyTests(unittest.TestCase):
1748 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1749 terminals in the test environment"""
1750
Martin Pantere44dba32015-10-10 05:27:15 +00001751 def run_child(self, child, terminal_input):
1752 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001753 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001754 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001755 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001756 os.close(r)
1757 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001758 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001759 raise
1760 if pid == 0:
1761 # Child
1762 try:
1763 # Make sure we don't get stuck if there's a problem
1764 signal.alarm(2)
1765 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001766 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001767 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001768 except:
1769 traceback.print_exc()
1770 finally:
1771 # We don't want to return to unittest...
1772 os._exit(0)
1773 # Parent
1774 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001775 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001776 # Get results from the pipe
1777 with open(r, "r") as rpipe:
1778 lines = []
1779 while True:
1780 line = rpipe.readline().strip()
1781 if line == "":
1782 # The other end was closed => the child exited
1783 break
1784 lines.append(line)
1785 # Check the result was got and corresponds to the user's terminal input
1786 if len(lines) != 2:
1787 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001788 # Beware of Linux raising EIO when the slave is closed
1789 child_output = bytearray()
1790 while True:
1791 try:
1792 chunk = os.read(fd, 3000)
1793 except OSError: # Assume EIO
1794 break
1795 if not chunk:
1796 break
1797 child_output.extend(chunk)
1798 os.close(fd)
1799 child_output = child_output.decode("ascii", "ignore")
1800 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1801 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001802 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001803
Victor Stinner3ca9f502017-08-09 23:08:22 +02001804 # Wait until the child process completes
1805 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001806
Martin Pantere44dba32015-10-10 05:27:15 +00001807 return lines
1808
1809 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1810 if not sys.stdin.isatty() or not sys.stdout.isatty():
1811 self.skipTest("stdin and stdout must be ttys")
1812 def child(wpipe):
1813 # Check the error handlers are accounted for
1814 if stdio_encoding:
1815 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1816 encoding=stdio_encoding,
1817 errors='surrogateescape')
1818 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1819 encoding=stdio_encoding,
1820 errors='replace')
1821 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1822 print(ascii(input(prompt)), file=wpipe)
1823 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001824 # Check we did exercise the GNU readline path
1825 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1826 if lines[0] != 'tty = True':
1827 self.skipTest("standard IO in should have been a tty")
1828 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1829 if stdio_encoding:
1830 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1831 else:
1832 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1833 self.assertEqual(input_result, expected)
1834
1835 def test_input_tty(self):
1836 # Test input() functionality when wired to a tty (the code path
1837 # is different and invokes GNU readline if available).
1838 self.check_input_tty("prompt", b"quux")
1839
1840 def test_input_tty_non_ascii(self):
1841 # Check stdin/stdout encoding is used when invoking GNU readline
1842 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1843
1844 def test_input_tty_non_ascii_unicode_errors(self):
1845 # Check stdin/stdout error handler is used when invoking GNU readline
1846 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1847
1848 def test_input_no_stdout_fileno(self):
1849 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1850 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001851 def child(wpipe):
1852 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1853 sys.stdout = io.StringIO() # Does not support fileno()
1854 input("prompt")
1855 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1856 lines = self.run_child(child, b"quux\r")
1857 expected = (
1858 "stdin.isatty(): True",
1859 "captured: 'prompt'",
1860 )
1861 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001862
Raymond Hettinger64958a12003-12-17 20:43:33 +00001863class TestSorted(unittest.TestCase):
1864
1865 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001866 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001867 copy = data[:]
1868 random.shuffle(copy)
1869 self.assertEqual(data, sorted(copy))
1870 self.assertNotEqual(data, copy)
1871
1872 data.reverse()
1873 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001874 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1875 self.assertNotEqual(data, copy)
1876 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001877 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001878 self.assertNotEqual(data, copy)
1879
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001880 def test_bad_arguments(self):
1881 # Issue #29327: The first argument is positional-only.
1882 sorted([])
1883 with self.assertRaises(TypeError):
1884 sorted(iterable=[])
1885 # Other arguments are keyword-only
1886 sorted([], key=None)
1887 with self.assertRaises(TypeError):
1888 sorted([], None)
1889
Raymond Hettinger64958a12003-12-17 20:43:33 +00001890 def test_inputtypes(self):
1891 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001892 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001893 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001894 self.assertEqual(sorted(s), sorted(T(s)))
1895
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001896 s = ''.join(set(s)) # unique letters only
1897 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001898 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001899 self.assertEqual(sorted(s), sorted(T(s)))
1900
1901 def test_baddecorator(self):
1902 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1903 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1904
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001905
1906class ShutdownTest(unittest.TestCase):
1907
1908 def test_cleanup(self):
1909 # Issue #19255: builtins are still available at shutdown
1910 code = """if 1:
1911 import builtins
1912 import sys
1913
1914 class C:
1915 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001916 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001917 # Check that builtins still exist
1918 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001919 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001920
1921 c = C()
1922 # Make this module survive until builtins and sys are cleaned
1923 builtins.here = sys.modules[__name__]
1924 sys.here = sys.modules[__name__]
1925 # Create a reference loop so that this module needs to go
1926 # through a GC phase.
1927 here = sys.modules[__name__]
1928 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001929 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1930 # otherwise the codec may be unloaded before C.__del__() is called, and
1931 # so print("before") fails because the codec cannot be used to encode
1932 # "before" to sys.stdout.encoding. For example, on Windows,
1933 # sys.stdout.encoding is the OEM code page and these code pages are
1934 # implemented in Python
1935 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001936 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001937 self.assertEqual(["before", "after"], out.decode().splitlines())
1938
1939
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001940class TestType(unittest.TestCase):
1941 def test_new_type(self):
1942 A = type('A', (), {})
1943 self.assertEqual(A.__name__, 'A')
1944 self.assertEqual(A.__qualname__, 'A')
1945 self.assertEqual(A.__module__, __name__)
1946 self.assertEqual(A.__bases__, (object,))
1947 self.assertIs(A.__base__, object)
1948 x = A()
1949 self.assertIs(type(x), A)
1950 self.assertIs(x.__class__, A)
1951
1952 class B:
1953 def ham(self):
1954 return 'ham%d' % self
1955 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1956 self.assertEqual(C.__name__, 'C')
1957 self.assertEqual(C.__qualname__, 'C')
1958 self.assertEqual(C.__module__, __name__)
1959 self.assertEqual(C.__bases__, (B, int))
1960 self.assertIs(C.__base__, int)
1961 self.assertIn('spam', C.__dict__)
1962 self.assertNotIn('ham', C.__dict__)
1963 x = C(42)
1964 self.assertEqual(x, 42)
1965 self.assertIs(type(x), C)
1966 self.assertIs(x.__class__, C)
1967 self.assertEqual(x.ham(), 'ham42')
1968 self.assertEqual(x.spam(), 'spam42')
1969 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1970
Nick Coghland78448e2016-07-30 16:26:03 +10001971 def test_type_nokwargs(self):
1972 with self.assertRaises(TypeError):
1973 type('a', (), {}, x=5)
1974 with self.assertRaises(TypeError):
1975 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001976
1977 def test_type_name(self):
1978 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1979 with self.subTest(name=name):
1980 A = type(name, (), {})
1981 self.assertEqual(A.__name__, name)
1982 self.assertEqual(A.__qualname__, name)
1983 self.assertEqual(A.__module__, __name__)
1984 with self.assertRaises(ValueError):
1985 type('A\x00B', (), {})
1986 with self.assertRaises(ValueError):
1987 type('A\udcdcB', (), {})
1988 with self.assertRaises(TypeError):
1989 type(b'A', (), {})
1990
1991 C = type('C', (), {})
1992 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1993 with self.subTest(name=name):
1994 C.__name__ = name
1995 self.assertEqual(C.__name__, name)
1996 self.assertEqual(C.__qualname__, 'C')
1997 self.assertEqual(C.__module__, __name__)
1998
1999 A = type('C', (), {})
2000 with self.assertRaises(ValueError):
2001 A.__name__ = 'A\x00B'
2002 self.assertEqual(A.__name__, 'C')
2003 with self.assertRaises(ValueError):
2004 A.__name__ = 'A\udcdcB'
2005 self.assertEqual(A.__name__, 'C')
2006 with self.assertRaises(TypeError):
2007 A.__name__ = b'A'
2008 self.assertEqual(A.__name__, 'C')
2009
2010 def test_type_qualname(self):
2011 A = type('A', (), {'__qualname__': 'B.C'})
2012 self.assertEqual(A.__name__, 'A')
2013 self.assertEqual(A.__qualname__, 'B.C')
2014 self.assertEqual(A.__module__, __name__)
2015 with self.assertRaises(TypeError):
2016 type('A', (), {'__qualname__': b'B'})
2017 self.assertEqual(A.__qualname__, 'B.C')
2018
2019 A.__qualname__ = 'D.E'
2020 self.assertEqual(A.__name__, 'A')
2021 self.assertEqual(A.__qualname__, 'D.E')
2022 with self.assertRaises(TypeError):
2023 A.__qualname__ = b'B'
2024 self.assertEqual(A.__qualname__, 'D.E')
2025
2026 def test_type_doc(self):
2027 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2028 A = type('A', (), {'__doc__': doc})
2029 self.assertEqual(A.__doc__, doc)
2030 with self.assertRaises(UnicodeEncodeError):
2031 type('A', (), {'__doc__': 'x\udcdcy'})
2032
2033 A = type('A', (), {})
2034 self.assertEqual(A.__doc__, None)
2035 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2036 A.__doc__ = doc
2037 self.assertEqual(A.__doc__, doc)
2038
2039 def test_bad_args(self):
2040 with self.assertRaises(TypeError):
2041 type()
2042 with self.assertRaises(TypeError):
2043 type('A', ())
2044 with self.assertRaises(TypeError):
2045 type('A', (), {}, ())
2046 with self.assertRaises(TypeError):
2047 type('A', (), dict={})
2048 with self.assertRaises(TypeError):
2049 type('A', [], {})
2050 with self.assertRaises(TypeError):
2051 type('A', (), types.MappingProxyType({}))
2052 with self.assertRaises(TypeError):
2053 type('A', (None,), {})
2054 with self.assertRaises(TypeError):
2055 type('A', (bool,), {})
2056 with self.assertRaises(TypeError):
2057 type('A', (int, str), {})
2058
2059 def test_bad_slots(self):
2060 with self.assertRaises(TypeError):
2061 type('A', (), {'__slots__': b'x'})
2062 with self.assertRaises(TypeError):
2063 type('A', (int,), {'__slots__': 'x'})
2064 with self.assertRaises(TypeError):
2065 type('A', (), {'__slots__': ''})
2066 with self.assertRaises(TypeError):
2067 type('A', (), {'__slots__': '42'})
2068 with self.assertRaises(TypeError):
2069 type('A', (), {'__slots__': 'x\x00y'})
2070 with self.assertRaises(ValueError):
2071 type('A', (), {'__slots__': 'x', 'x': 0})
2072 with self.assertRaises(TypeError):
2073 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2074 with self.assertRaises(TypeError):
2075 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2076
2077 class B:
2078 pass
2079 with self.assertRaises(TypeError):
2080 type('A', (B,), {'__slots__': '__dict__'})
2081 with self.assertRaises(TypeError):
2082 type('A', (B,), {'__slots__': '__weakref__'})
2083
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002084 def test_namespace_order(self):
2085 # bpo-34320: namespace should preserve order
2086 od = collections.OrderedDict([('a', 1), ('b', 2)])
2087 od.move_to_end('a')
2088 expected = list(od.items())
2089
2090 C = type('C', (), od)
2091 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2092
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002093
Zachary Warea4b7a752013-11-24 01:19:09 -06002094def load_tests(loader, tests, pattern):
2095 from doctest import DocTestSuite
2096 tests.addTest(DocTestSuite(builtins))
2097 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002098
2099if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002100 unittest.main()