blob: 1100c49e9b8831d2b5cd253d31534942749b87b9 [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
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)
1376
Alex Martellia70b1912003-04-22 08:12:33 +00001377 self.assertRaises(TypeError, sum)
1378 self.assertRaises(TypeError, sum, 42)
1379 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1380 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001381 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1382 values = [bytearray(b'a'), bytearray(b'b')]
1383 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001384 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1385 self.assertRaises(TypeError, sum, [{2:3}])
1386 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1387
1388 class BadSeq:
1389 def __getitem__(self, index):
1390 raise ValueError
1391 self.assertRaises(ValueError, sum, BadSeq())
1392
Mark Dickinson3a22b472009-10-17 21:48:16 +00001393 empty = []
1394 sum(([x] for x in range(10)), empty)
1395 self.assertEqual(empty, [])
1396
Walter Dörwald919497e2003-01-19 16:23:59 +00001397 def test_type(self):
1398 self.assertEqual(type(''), type('123'))
1399 self.assertNotEqual(type(''), type(()))
1400
Guido van Rossumfee7b932005-01-16 00:21:28 +00001401 # We don't want self in vars(), so these are static methods
1402
1403 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001404 def get_vars_f0():
1405 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001406
Guido van Rossumfee7b932005-01-16 00:21:28 +00001407 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001408 def get_vars_f2():
1409 BuiltinTest.get_vars_f0()
1410 a = 1
1411 b = 2
1412 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001413
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001414 class C_get_vars(object):
1415 def getDict(self):
1416 return {'a':2}
1417 __dict__ = property(fget=getDict)
1418
Walter Dörwald919497e2003-01-19 16:23:59 +00001419 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001420 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001421 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001422 self.assertEqual(self.get_vars_f0(), {})
1423 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1424 self.assertRaises(TypeError, vars, 42, 42)
1425 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001426 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001427
1428 def test_zip(self):
1429 a = (1, 2, 3)
1430 b = (4, 5, 6)
1431 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001432 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001433 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001434 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001435 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001436 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001437 class I:
1438 def __getitem__(self, i):
1439 if i < 0 or i > 2: raise IndexError
1440 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001441 self.assertEqual(list(zip(a, I())), t)
1442 self.assertEqual(list(zip()), [])
1443 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001444 self.assertRaises(TypeError, zip, None)
1445 class G:
1446 pass
1447 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001448 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001449
1450 # Make sure zip doesn't try to allocate a billion elements for the
1451 # result list when one of its arguments doesn't say how long it is.
1452 # A MemoryError is the most likely failure mode.
1453 class SequenceWithoutALength:
1454 def __getitem__(self, i):
1455 if i == 5:
1456 raise IndexError
1457 else:
1458 return i
1459 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001460 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001461 list(enumerate(range(5)))
1462 )
1463
1464 class BadSeq:
1465 def __getitem__(self, i):
1466 if i == 5:
1467 raise ValueError
1468 else:
1469 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001470 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001471
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001472 def test_zip_pickle(self):
1473 a = (1, 2, 3)
1474 b = (4, 5, 6)
1475 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001476 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1477 z1 = zip(a, b)
1478 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001479
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001480 def test_zip_bad_iterable(self):
1481 exception = TypeError()
1482
1483 class BadIterable:
1484 def __iter__(self):
1485 raise exception
1486
1487 with self.assertRaises(TypeError) as cm:
1488 zip(BadIterable())
1489
1490 self.assertIs(cm.exception, exception)
1491
Eric Smithe4d63172010-09-13 20:48:43 +00001492 def test_format(self):
1493 # Test the basic machinery of the format() builtin. Don't test
1494 # the specifics of the various formatters
1495 self.assertEqual(format(3, ''), '3')
1496
1497 # Returns some classes to use for various tests. There's
1498 # an old-style version, and a new-style version
1499 def classes_new():
1500 class A(object):
1501 def __init__(self, x):
1502 self.x = x
1503 def __format__(self, format_spec):
1504 return str(self.x) + format_spec
1505 class DerivedFromA(A):
1506 pass
1507
1508 class Simple(object): pass
1509 class DerivedFromSimple(Simple):
1510 def __init__(self, x):
1511 self.x = x
1512 def __format__(self, format_spec):
1513 return str(self.x) + format_spec
1514 class DerivedFromSimple2(DerivedFromSimple): pass
1515 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1516
1517 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1518 self.assertEqual(format(A(3), 'spec'), '3spec')
1519 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1520 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1521 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1522 '10abcdef')
1523
1524 class_test(*classes_new())
1525
1526 def empty_format_spec(value):
1527 # test that:
1528 # format(x, '') == str(x)
1529 # format(x) == str(x)
1530 self.assertEqual(format(value, ""), str(value))
1531 self.assertEqual(format(value), str(value))
1532
1533 # for builtin types, format(x, "") == str(x)
1534 empty_format_spec(17**13)
1535 empty_format_spec(1.0)
1536 empty_format_spec(3.1415e104)
1537 empty_format_spec(-3.1415e104)
1538 empty_format_spec(3.1415e-104)
1539 empty_format_spec(-3.1415e-104)
1540 empty_format_spec(object)
1541 empty_format_spec(None)
1542
1543 # TypeError because self.__format__ returns the wrong type
1544 class BadFormatResult:
1545 def __format__(self, format_spec):
1546 return 1.0
1547 self.assertRaises(TypeError, format, BadFormatResult(), "")
1548
1549 # TypeError because format_spec is not unicode or str
1550 self.assertRaises(TypeError, format, object(), 4)
1551 self.assertRaises(TypeError, format, object(), object())
1552
1553 # tests for object.__format__ really belong elsewhere, but
1554 # there's no good place to put them
1555 x = object().__format__('')
1556 self.assertTrue(x.startswith('<object object at'))
1557
1558 # first argument to object.__format__ must be string
1559 self.assertRaises(TypeError, object().__format__, 3)
1560 self.assertRaises(TypeError, object().__format__, object())
1561 self.assertRaises(TypeError, object().__format__, None)
1562
1563 # --------------------------------------------------------------------
1564 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001565 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001566 class A:
1567 def __format__(self, fmt_str):
1568 return format('', fmt_str)
1569
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001570 self.assertEqual(format(A()), '')
1571 self.assertEqual(format(A(), ''), '')
1572 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001573
1574 class B:
1575 pass
1576
1577 class C(object):
1578 pass
1579
1580 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001581 obj = cls()
1582 self.assertEqual(format(obj), str(obj))
1583 self.assertEqual(format(obj, ''), str(obj))
1584 with self.assertRaisesRegex(TypeError,
1585 r'\b%s\b' % re.escape(cls.__name__)):
1586 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001587 # --------------------------------------------------------------------
1588
1589 # make sure we can take a subclass of str as a format spec
1590 class DerivedFromStr(str): pass
1591 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1592
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001593 def test_bin(self):
1594 self.assertEqual(bin(0), '0b0')
1595 self.assertEqual(bin(1), '0b1')
1596 self.assertEqual(bin(-1), '-0b1')
1597 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1598 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1599 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1600 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1601
Georg Brandl953152f2009-07-22 12:03:59 +00001602 def test_bytearray_translate(self):
1603 x = bytearray(b"abc")
1604 self.assertRaises(ValueError, x.translate, b"1", 1)
1605 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1606
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001607 def test_bytearray_extend_error(self):
1608 array = bytearray()
1609 bad_iter = map(int, "X")
1610 self.assertRaises(ValueError, array.extend, bad_iter)
1611
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001612 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001613 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001614 tp = type(const)
1615 self.assertIs(tp(), const)
1616 self.assertRaises(TypeError, tp, 1, 2)
1617 self.assertRaises(TypeError, tp, a=1, b=2)
1618
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001619
1620class TestBreakpoint(unittest.TestCase):
1621 def setUp(self):
1622 # These tests require a clean slate environment. For example, if the
1623 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1624 # will mess up these tests. Similarly for sys.breakpointhook.
1625 # Cleaning the slate here means you can't use breakpoint() to debug
1626 # these tests, but I think that's okay. Just use pdb.set_trace() if
1627 # you must.
1628 self.resources = ExitStack()
1629 self.addCleanup(self.resources.close)
1630 self.env = self.resources.enter_context(EnvironmentVarGuard())
1631 del self.env['PYTHONBREAKPOINT']
1632 self.resources.enter_context(
1633 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1634
1635 def test_breakpoint(self):
1636 with patch('pdb.set_trace') as mock:
1637 breakpoint()
1638 mock.assert_called_once()
1639
1640 def test_breakpoint_with_breakpointhook_set(self):
1641 my_breakpointhook = MagicMock()
1642 sys.breakpointhook = my_breakpointhook
1643 breakpoint()
1644 my_breakpointhook.assert_called_once_with()
1645
1646 def test_breakpoint_with_breakpointhook_reset(self):
1647 my_breakpointhook = MagicMock()
1648 sys.breakpointhook = my_breakpointhook
1649 breakpoint()
1650 my_breakpointhook.assert_called_once_with()
1651 # Reset the hook and it will not be called again.
1652 sys.breakpointhook = sys.__breakpointhook__
1653 with patch('pdb.set_trace') as mock:
1654 breakpoint()
1655 mock.assert_called_once_with()
1656 my_breakpointhook.assert_called_once_with()
1657
1658 def test_breakpoint_with_args_and_keywords(self):
1659 my_breakpointhook = MagicMock()
1660 sys.breakpointhook = my_breakpointhook
1661 breakpoint(1, 2, 3, four=4, five=5)
1662 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1663
1664 def test_breakpoint_with_passthru_error(self):
1665 def my_breakpointhook():
1666 pass
1667 sys.breakpointhook = my_breakpointhook
1668 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1669
1670 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1671 def test_envar_good_path_builtin(self):
1672 self.env['PYTHONBREAKPOINT'] = 'int'
1673 with patch('builtins.int') as mock:
1674 breakpoint('7')
1675 mock.assert_called_once_with('7')
1676
1677 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1678 def test_envar_good_path_other(self):
1679 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1680 with patch('sys.exit') as mock:
1681 breakpoint()
1682 mock.assert_called_once_with()
1683
1684 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1685 def test_envar_good_path_noop_0(self):
1686 self.env['PYTHONBREAKPOINT'] = '0'
1687 with patch('pdb.set_trace') as mock:
1688 breakpoint()
1689 mock.assert_not_called()
1690
1691 def test_envar_good_path_empty_string(self):
1692 # PYTHONBREAKPOINT='' is the same as it not being set.
1693 self.env['PYTHONBREAKPOINT'] = ''
1694 with patch('pdb.set_trace') as mock:
1695 breakpoint()
1696 mock.assert_called_once_with()
1697
1698 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1699 def test_envar_unimportable(self):
1700 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001701 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001702 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001703 'nosuchbuiltin',
1704 'nosuchmodule.nosuchcallable',
1705 ):
1706 with self.subTest(envar=envar):
1707 self.env['PYTHONBREAKPOINT'] = envar
1708 mock = self.resources.enter_context(patch('pdb.set_trace'))
1709 w = self.resources.enter_context(check_warnings(quiet=True))
1710 breakpoint()
1711 self.assertEqual(
1712 str(w.message),
1713 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1714 self.assertEqual(w.category, RuntimeWarning)
1715 mock.assert_not_called()
1716
1717 def test_envar_ignored_when_hook_is_set(self):
1718 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1719 with patch('sys.exit') as mock:
1720 sys.breakpointhook = int
1721 breakpoint()
1722 mock.assert_not_called()
1723
1724
Martin Panterc9a6ab52015-10-10 01:25:38 +00001725@unittest.skipUnless(pty, "the pty and signal modules must be available")
1726class PtyTests(unittest.TestCase):
1727 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1728 terminals in the test environment"""
1729
Martin Pantere44dba32015-10-10 05:27:15 +00001730 def run_child(self, child, terminal_input):
1731 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001732 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001733 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001734 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001735 os.close(r)
1736 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001737 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001738 raise
1739 if pid == 0:
1740 # Child
1741 try:
1742 # Make sure we don't get stuck if there's a problem
1743 signal.alarm(2)
1744 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001745 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001746 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001747 except:
1748 traceback.print_exc()
1749 finally:
1750 # We don't want to return to unittest...
1751 os._exit(0)
1752 # Parent
1753 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001754 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001755 # Get results from the pipe
1756 with open(r, "r") as rpipe:
1757 lines = []
1758 while True:
1759 line = rpipe.readline().strip()
1760 if line == "":
1761 # The other end was closed => the child exited
1762 break
1763 lines.append(line)
1764 # Check the result was got and corresponds to the user's terminal input
1765 if len(lines) != 2:
1766 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001767 # Beware of Linux raising EIO when the slave is closed
1768 child_output = bytearray()
1769 while True:
1770 try:
1771 chunk = os.read(fd, 3000)
1772 except OSError: # Assume EIO
1773 break
1774 if not chunk:
1775 break
1776 child_output.extend(chunk)
1777 os.close(fd)
1778 child_output = child_output.decode("ascii", "ignore")
1779 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1780 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001781 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001782
Victor Stinner3ca9f502017-08-09 23:08:22 +02001783 # Wait until the child process completes
1784 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001785
Martin Pantere44dba32015-10-10 05:27:15 +00001786 return lines
1787
1788 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1789 if not sys.stdin.isatty() or not sys.stdout.isatty():
1790 self.skipTest("stdin and stdout must be ttys")
1791 def child(wpipe):
1792 # Check the error handlers are accounted for
1793 if stdio_encoding:
1794 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1795 encoding=stdio_encoding,
1796 errors='surrogateescape')
1797 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1798 encoding=stdio_encoding,
1799 errors='replace')
1800 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1801 print(ascii(input(prompt)), file=wpipe)
1802 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001803 # Check we did exercise the GNU readline path
1804 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1805 if lines[0] != 'tty = True':
1806 self.skipTest("standard IO in should have been a tty")
1807 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1808 if stdio_encoding:
1809 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1810 else:
1811 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1812 self.assertEqual(input_result, expected)
1813
1814 def test_input_tty(self):
1815 # Test input() functionality when wired to a tty (the code path
1816 # is different and invokes GNU readline if available).
1817 self.check_input_tty("prompt", b"quux")
1818
1819 def test_input_tty_non_ascii(self):
1820 # Check stdin/stdout encoding is used when invoking GNU readline
1821 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1822
1823 def test_input_tty_non_ascii_unicode_errors(self):
1824 # Check stdin/stdout error handler is used when invoking GNU readline
1825 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1826
1827 def test_input_no_stdout_fileno(self):
1828 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1829 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001830 def child(wpipe):
1831 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1832 sys.stdout = io.StringIO() # Does not support fileno()
1833 input("prompt")
1834 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1835 lines = self.run_child(child, b"quux\r")
1836 expected = (
1837 "stdin.isatty(): True",
1838 "captured: 'prompt'",
1839 )
1840 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001841
Raymond Hettinger64958a12003-12-17 20:43:33 +00001842class TestSorted(unittest.TestCase):
1843
1844 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001845 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001846 copy = data[:]
1847 random.shuffle(copy)
1848 self.assertEqual(data, sorted(copy))
1849 self.assertNotEqual(data, copy)
1850
1851 data.reverse()
1852 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001853 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1854 self.assertNotEqual(data, copy)
1855 random.shuffle(copy)
1856 self.assertEqual(data, sorted(copy, reverse=1))
1857 self.assertNotEqual(data, copy)
1858
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001859 def test_bad_arguments(self):
1860 # Issue #29327: The first argument is positional-only.
1861 sorted([])
1862 with self.assertRaises(TypeError):
1863 sorted(iterable=[])
1864 # Other arguments are keyword-only
1865 sorted([], key=None)
1866 with self.assertRaises(TypeError):
1867 sorted([], None)
1868
Raymond Hettinger64958a12003-12-17 20:43:33 +00001869 def test_inputtypes(self):
1870 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001871 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001872 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001873 self.assertEqual(sorted(s), sorted(T(s)))
1874
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001875 s = ''.join(set(s)) # unique letters only
1876 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001877 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001878 self.assertEqual(sorted(s), sorted(T(s)))
1879
1880 def test_baddecorator(self):
1881 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1882 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1883
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001884
1885class ShutdownTest(unittest.TestCase):
1886
1887 def test_cleanup(self):
1888 # Issue #19255: builtins are still available at shutdown
1889 code = """if 1:
1890 import builtins
1891 import sys
1892
1893 class C:
1894 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001895 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001896 # Check that builtins still exist
1897 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001898 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001899
1900 c = C()
1901 # Make this module survive until builtins and sys are cleaned
1902 builtins.here = sys.modules[__name__]
1903 sys.here = sys.modules[__name__]
1904 # Create a reference loop so that this module needs to go
1905 # through a GC phase.
1906 here = sys.modules[__name__]
1907 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001908 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1909 # otherwise the codec may be unloaded before C.__del__() is called, and
1910 # so print("before") fails because the codec cannot be used to encode
1911 # "before" to sys.stdout.encoding. For example, on Windows,
1912 # sys.stdout.encoding is the OEM code page and these code pages are
1913 # implemented in Python
1914 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001915 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001916 self.assertEqual(["before", "after"], out.decode().splitlines())
1917
1918
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001919class TestType(unittest.TestCase):
1920 def test_new_type(self):
1921 A = type('A', (), {})
1922 self.assertEqual(A.__name__, 'A')
1923 self.assertEqual(A.__qualname__, 'A')
1924 self.assertEqual(A.__module__, __name__)
1925 self.assertEqual(A.__bases__, (object,))
1926 self.assertIs(A.__base__, object)
1927 x = A()
1928 self.assertIs(type(x), A)
1929 self.assertIs(x.__class__, A)
1930
1931 class B:
1932 def ham(self):
1933 return 'ham%d' % self
1934 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1935 self.assertEqual(C.__name__, 'C')
1936 self.assertEqual(C.__qualname__, 'C')
1937 self.assertEqual(C.__module__, __name__)
1938 self.assertEqual(C.__bases__, (B, int))
1939 self.assertIs(C.__base__, int)
1940 self.assertIn('spam', C.__dict__)
1941 self.assertNotIn('ham', C.__dict__)
1942 x = C(42)
1943 self.assertEqual(x, 42)
1944 self.assertIs(type(x), C)
1945 self.assertIs(x.__class__, C)
1946 self.assertEqual(x.ham(), 'ham42')
1947 self.assertEqual(x.spam(), 'spam42')
1948 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1949
Nick Coghland78448e2016-07-30 16:26:03 +10001950 def test_type_nokwargs(self):
1951 with self.assertRaises(TypeError):
1952 type('a', (), {}, x=5)
1953 with self.assertRaises(TypeError):
1954 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001955
1956 def test_type_name(self):
1957 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1958 with self.subTest(name=name):
1959 A = type(name, (), {})
1960 self.assertEqual(A.__name__, name)
1961 self.assertEqual(A.__qualname__, name)
1962 self.assertEqual(A.__module__, __name__)
1963 with self.assertRaises(ValueError):
1964 type('A\x00B', (), {})
1965 with self.assertRaises(ValueError):
1966 type('A\udcdcB', (), {})
1967 with self.assertRaises(TypeError):
1968 type(b'A', (), {})
1969
1970 C = type('C', (), {})
1971 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1972 with self.subTest(name=name):
1973 C.__name__ = name
1974 self.assertEqual(C.__name__, name)
1975 self.assertEqual(C.__qualname__, 'C')
1976 self.assertEqual(C.__module__, __name__)
1977
1978 A = type('C', (), {})
1979 with self.assertRaises(ValueError):
1980 A.__name__ = 'A\x00B'
1981 self.assertEqual(A.__name__, 'C')
1982 with self.assertRaises(ValueError):
1983 A.__name__ = 'A\udcdcB'
1984 self.assertEqual(A.__name__, 'C')
1985 with self.assertRaises(TypeError):
1986 A.__name__ = b'A'
1987 self.assertEqual(A.__name__, 'C')
1988
1989 def test_type_qualname(self):
1990 A = type('A', (), {'__qualname__': 'B.C'})
1991 self.assertEqual(A.__name__, 'A')
1992 self.assertEqual(A.__qualname__, 'B.C')
1993 self.assertEqual(A.__module__, __name__)
1994 with self.assertRaises(TypeError):
1995 type('A', (), {'__qualname__': b'B'})
1996 self.assertEqual(A.__qualname__, 'B.C')
1997
1998 A.__qualname__ = 'D.E'
1999 self.assertEqual(A.__name__, 'A')
2000 self.assertEqual(A.__qualname__, 'D.E')
2001 with self.assertRaises(TypeError):
2002 A.__qualname__ = b'B'
2003 self.assertEqual(A.__qualname__, 'D.E')
2004
2005 def test_type_doc(self):
2006 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2007 A = type('A', (), {'__doc__': doc})
2008 self.assertEqual(A.__doc__, doc)
2009 with self.assertRaises(UnicodeEncodeError):
2010 type('A', (), {'__doc__': 'x\udcdcy'})
2011
2012 A = type('A', (), {})
2013 self.assertEqual(A.__doc__, None)
2014 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2015 A.__doc__ = doc
2016 self.assertEqual(A.__doc__, doc)
2017
2018 def test_bad_args(self):
2019 with self.assertRaises(TypeError):
2020 type()
2021 with self.assertRaises(TypeError):
2022 type('A', ())
2023 with self.assertRaises(TypeError):
2024 type('A', (), {}, ())
2025 with self.assertRaises(TypeError):
2026 type('A', (), dict={})
2027 with self.assertRaises(TypeError):
2028 type('A', [], {})
2029 with self.assertRaises(TypeError):
2030 type('A', (), types.MappingProxyType({}))
2031 with self.assertRaises(TypeError):
2032 type('A', (None,), {})
2033 with self.assertRaises(TypeError):
2034 type('A', (bool,), {})
2035 with self.assertRaises(TypeError):
2036 type('A', (int, str), {})
2037
2038 def test_bad_slots(self):
2039 with self.assertRaises(TypeError):
2040 type('A', (), {'__slots__': b'x'})
2041 with self.assertRaises(TypeError):
2042 type('A', (int,), {'__slots__': 'x'})
2043 with self.assertRaises(TypeError):
2044 type('A', (), {'__slots__': ''})
2045 with self.assertRaises(TypeError):
2046 type('A', (), {'__slots__': '42'})
2047 with self.assertRaises(TypeError):
2048 type('A', (), {'__slots__': 'x\x00y'})
2049 with self.assertRaises(ValueError):
2050 type('A', (), {'__slots__': 'x', 'x': 0})
2051 with self.assertRaises(TypeError):
2052 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2053 with self.assertRaises(TypeError):
2054 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2055
2056 class B:
2057 pass
2058 with self.assertRaises(TypeError):
2059 type('A', (B,), {'__slots__': '__dict__'})
2060 with self.assertRaises(TypeError):
2061 type('A', (B,), {'__slots__': '__weakref__'})
2062
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002063 def test_namespace_order(self):
2064 # bpo-34320: namespace should preserve order
2065 od = collections.OrderedDict([('a', 1), ('b', 2)])
2066 od.move_to_end('a')
2067 expected = list(od.items())
2068
2069 C = type('C', (), od)
2070 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2071
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002072
Zachary Warea4b7a752013-11-24 01:19:09 -06002073def load_tests(loader, tests, pattern):
2074 from doctest import DocTestSuite
2075 tests.addTest(DocTestSuite(builtins))
2076 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002077
2078if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002079 unittest.main()