blob: e1d2fffb36ea7de80cceed74683baae7b11e46c3 [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')
Ben Lewis92420b32019-09-11 20:09:47 +1000163 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100164 with self.assertWarns(ImportWarning):
165 self.assertRaises(ImportError, __import__, '',
166 {'__package__': None, '__spec__': None, '__name__': '__main__'},
167 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300168 # embedded null character
169 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000170
171 def test_abs(self):
172 # int
173 self.assertEqual(abs(0), 0)
174 self.assertEqual(abs(1234), 1234)
175 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000176 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000177 # float
178 self.assertEqual(abs(0.0), 0.0)
179 self.assertEqual(abs(3.14), 3.14)
180 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000181 # str
182 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000183 # bool
184 self.assertEqual(abs(True), 1)
185 self.assertEqual(abs(False), 0)
186 # other
187 self.assertRaises(TypeError, abs)
188 self.assertRaises(TypeError, abs, None)
189 class AbsClass(object):
190 def __abs__(self):
191 return -5
192 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000193
Raymond Hettinger96229b12005-03-11 06:49:40 +0000194 def test_all(self):
195 self.assertEqual(all([2, 4, 6]), True)
196 self.assertEqual(all([2, None, 6]), False)
197 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
198 self.assertRaises(RuntimeError, all, TestFailingIter())
199 self.assertRaises(TypeError, all, 10) # Non-iterable
200 self.assertRaises(TypeError, all) # No args
201 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
202 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200203 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000204 S = [50, 60]
205 self.assertEqual(all(x > 42 for x in S), True)
206 S = [50, 40, 60]
207 self.assertEqual(all(x > 42 for x in S), False)
208
209 def test_any(self):
210 self.assertEqual(any([None, None, None]), False)
211 self.assertEqual(any([None, 4, None]), True)
212 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500213 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000214 self.assertRaises(TypeError, any, 10) # Non-iterable
215 self.assertRaises(TypeError, any) # No args
216 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
217 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200218 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000219 S = [40, 60, 30]
220 self.assertEqual(any(x > 42 for x in S), True)
221 S = [10, 20, 30]
222 self.assertEqual(any(x > 42 for x in S), False)
223
Georg Brandl559e5d72008-06-11 18:37:52 +0000224 def test_ascii(self):
225 self.assertEqual(ascii(''), '\'\'')
226 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000227 self.assertEqual(ascii(()), '()')
228 self.assertEqual(ascii([]), '[]')
229 self.assertEqual(ascii({}), '{}')
230 a = []
231 a.append(a)
232 self.assertEqual(ascii(a), '[[...]]')
233 a = {}
234 a[0] = a
235 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000236 # Advanced checks for unicode strings
237 def _check_uni(s):
238 self.assertEqual(ascii(s), repr(s))
239 _check_uni("'")
240 _check_uni('"')
241 _check_uni('"\'')
242 _check_uni('\0')
243 _check_uni('\r\n\t .')
244 # Unprintable non-ASCII characters
245 _check_uni('\x85')
246 _check_uni('\u1fff')
247 _check_uni('\U00012fff')
248 # Lone surrogates
249 _check_uni('\ud800')
250 _check_uni('\udfff')
251 # Issue #9804: surrogates should be joined even for printable
252 # wide characters (UCS-2 builds).
253 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
254 # All together
255 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
256 self.assertEqual(ascii(s),
257 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000258
Thomas Wouters89f507f2006-12-13 04:49:30 +0000259 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000260 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000261 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000262 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000263
Walter Dörwald919497e2003-01-19 16:23:59 +0000264 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000265 self.assertTrue(callable(len))
266 self.assertFalse(callable("a"))
267 self.assertTrue(callable(callable))
268 self.assertTrue(callable(lambda x, y: x + y))
269 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000270 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000271 self.assertTrue(callable(f))
272
273 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000274 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000275 self.assertTrue(callable(C1))
276 c = C1()
277 self.assertTrue(callable(c.meth))
278 self.assertFalse(callable(c))
279
280 # __call__ is looked up on the class, not the instance
281 c.__call__ = None
282 self.assertFalse(callable(c))
283 c.__call__ = lambda self: 0
284 self.assertFalse(callable(c))
285 del c.__call__
286 self.assertFalse(callable(c))
287
288 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000289 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000290 c2 = C2()
291 self.assertTrue(callable(c2))
292 c2.__call__ = None
293 self.assertTrue(callable(c2))
294 class C3(C2): pass
295 c3 = C3()
296 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000297
298 def test_chr(self):
299 self.assertEqual(chr(32), ' ')
300 self.assertEqual(chr(65), 'A')
301 self.assertEqual(chr(97), 'a')
302 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000303 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000304 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300305 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000306 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000307 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
308 self.assertEqual(chr(0x00010000), "\U00010000")
309 self.assertEqual(chr(0x00010001), "\U00010001")
310 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
311 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
312 self.assertEqual(chr(0x00100000), "\U00100000")
313 self.assertEqual(chr(0x00100001), "\U00100001")
314 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
315 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
316 self.assertRaises(ValueError, chr, -1)
317 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000318 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000319
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000320 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000321 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000322
Walter Dörwald919497e2003-01-19 16:23:59 +0000323 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000324 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000325 bom = b'\xef\xbb\xbf'
326 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000327 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300328 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
329 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000330 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000331 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000332 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
333 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300334 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
336 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000337 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300338 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000339 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000340
Georg Brandl8334fd92010-12-04 10:26:46 +0000341 # test the optimize argument
342
343 codestr = '''def f():
344 """doc"""
diana543386b2017-10-03 10:46:56 -0600345 debug_enabled = False
346 if __debug__:
347 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000348 try:
349 assert False
350 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200351 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000352 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200353 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000354 '''
355 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200356 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
357 (0, True, 'doc', True, True),
358 (1, False, 'doc', False, False),
359 (2, False, None, False, False)]
360 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000361 # test both direct compilation and compilation via AST
362 codeobjs = []
363 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
364 tree = ast.parse(codestr)
365 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
366 for code in codeobjs:
367 ns = {}
368 exec(code, ns)
369 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200370 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000371
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700372 def test_compile_top_level_await(self):
373 """Test whether code some top level await can be compiled.
374
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400375 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
376 set, and make sure the generated code object has the CO_COROUTINE flag
377 set in order to execute it with `await eval(.....)` instead of exec,
378 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700379 """
380
381 # helper function just to check we can run top=level async-for
382 async def arange(n):
383 for i in range(n):
384 yield i
385
386 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400387 code_samples = [
388 '''a = await asyncio.sleep(0, result=1)''',
389 '''async for i in arange(1):
390 a = 1''',
391 '''async with asyncio.Lock() as l:
392 a = 1'''
393 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700394 policy = maybe_get_event_loop_policy()
395 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400396 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700397 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400398 with self.assertRaises(
399 SyntaxError, msg=f"source={source} mode={mode}"):
400 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700401
402 co = compile(source,
403 '?',
404 mode,
405 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
406
407 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400408 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700409
410 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400411 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700412 async_f = FunctionType(co, globals_)
413 asyncio.run(async_f())
414 self.assertEqual(globals_['a'], 1)
415
416 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400417 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700418 asyncio.run(eval(co, globals_))
419 self.assertEqual(globals_['a'], 1)
420 finally:
421 asyncio.set_event_loop_policy(policy)
422
423 def test_compile_async_generator(self):
424 """
425 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400426 make sure AsyncGenerators are still properly not marked with the
427 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700428 """
429 code = dedent("""async def ticker():
430 for i in range(10):
431 yield i
432 await asyncio.sleep(0)""")
433
434 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
435 glob = {}
436 exec(co, glob)
437 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
438
Walter Dörwald919497e2003-01-19 16:23:59 +0000439 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000440 sys.spam = 1
441 delattr(sys, 'spam')
442 self.assertRaises(TypeError, delattr)
443
444 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000445 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000446 self.assertRaises(TypeError, dir, 42, 42)
447
Georg Brandle32b4222007-03-10 22:13:27 +0000448 # dir() - local scope
449 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000450 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000451
452 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000453 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000454
455 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000456 class Foo(types.ModuleType):
457 __dict__ = 8
458 f = Foo("foo")
459 self.assertRaises(TypeError, dir, f)
460
461 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000462 self.assertIn("strip", dir(str))
463 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000464
465 # dir(obj)
466 class Foo(object):
467 def __init__(self):
468 self.x = 7
469 self.y = 8
470 self.z = 9
471 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000472 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000473
474 # dir(obj_no__dict__)
475 class Foo(object):
476 __slots__ = []
477 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000478 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000479
480 # dir(obj_no__class__with__dict__)
481 # (an ugly trick to cause getattr(f, "__class__") to fail)
482 class Foo(object):
483 __slots__ = ["__class__", "__dict__"]
484 def __init__(self):
485 self.bar = "wow"
486 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000487 self.assertNotIn("__repr__", dir(f))
488 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000489
490 # dir(obj_using __dir__)
491 class Foo(object):
492 def __dir__(self):
493 return ["kan", "ga", "roo"]
494 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000495 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000496
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500497 # dir(obj__dir__tuple)
498 class Foo(object):
499 def __dir__(self):
500 return ("b", "c", "a")
501 res = dir(Foo())
502 self.assertIsInstance(res, list)
503 self.assertTrue(res == ["a", "b", "c"])
504
505 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000506 class Foo(object):
507 def __dir__(self):
508 return 7
509 f = Foo()
510 self.assertRaises(TypeError, dir, f)
511
Collin Winter3eed7652007-08-14 17:53:54 +0000512 # dir(traceback)
513 try:
514 raise IndexError
515 except:
516 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
517
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500518 # test that object has a __dir__()
519 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000520
Walter Dörwald919497e2003-01-19 16:23:59 +0000521 def test_divmod(self):
522 self.assertEqual(divmod(12, 7), (1, 5))
523 self.assertEqual(divmod(-12, 7), (-2, 2))
524 self.assertEqual(divmod(12, -7), (-2, -2))
525 self.assertEqual(divmod(-12, -7), (1, -5))
526
Mark Dickinson5c2db372009-12-05 20:28:34 +0000527 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000528
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000529 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
530 (-3.25, 1.0, (-4.0, 0.75)),
531 (3.25, -1.0, (-4.0, -0.75)),
532 (-3.25, -1.0, (3.0, -0.25))]:
533 result = divmod(num, denom)
534 self.assertAlmostEqual(result[0], exp_result[0])
535 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000536
537 self.assertRaises(TypeError, divmod)
538
539 def test_eval(self):
540 self.assertEqual(eval('1+1'), 2)
541 self.assertEqual(eval(' 1+1\n'), 2)
542 globals = {'a': 1, 'b': 2}
543 locals = {'b': 200, 'c': 300}
544 self.assertEqual(eval('a', globals) , 1)
545 self.assertEqual(eval('a', globals, locals), 1)
546 self.assertEqual(eval('b', globals, locals), 200)
547 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000548 globals = {'a': 1, 'b': 2}
549 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000550 bom = b'\xef\xbb\xbf'
551 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000552 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000553 self.assertRaises(TypeError, eval)
554 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000555 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000556
Benjamin Peterson92722792012-12-15 12:51:05 -0500557 class X:
558 def __getitem__(self, key):
559 raise ValueError
560 self.assertRaises(ValueError, eval, "foo", {}, X())
561
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000562 def test_general_eval(self):
563 # Tests that general mappings can be used for the locals argument
564
565 class M:
566 "Test mapping interface versus possible calls from eval()."
567 def __getitem__(self, key):
568 if key == 'a':
569 return 12
570 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000571 def keys(self):
572 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000573
574 m = M()
575 g = globals()
576 self.assertEqual(eval('a', g, m), 12)
577 self.assertRaises(NameError, eval, 'b', g, m)
578 self.assertEqual(eval('dir()', g, m), list('xyz'))
579 self.assertEqual(eval('globals()', g, m), g)
580 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000581 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000582 class A:
583 "Non-mapping"
584 pass
585 m = A()
586 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000587
588 # Verify that dict subclasses work as well
589 class D(dict):
590 def __getitem__(self, key):
591 if key == 'a':
592 return 12
593 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000594 def keys(self):
595 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000596
597 d = D()
598 self.assertEqual(eval('a', g, d), 12)
599 self.assertRaises(NameError, eval, 'b', g, d)
600 self.assertEqual(eval('dir()', g, d), list('xyz'))
601 self.assertEqual(eval('globals()', g, d), g)
602 self.assertEqual(eval('locals()', g, d), d)
603
604 # Verify locals stores (used by list comps)
605 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000606 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000607
608 class SpreadSheet:
609 "Sample application showing nested, calculated lookups."
610 _cells = {}
611 def __setitem__(self, key, formula):
612 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000613 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000614 return eval(self._cells[key], globals(), self)
615
616 ss = SpreadSheet()
617 ss['a1'] = '5'
618 ss['a2'] = 'a1*6'
619 ss['a3'] = 'a2*7'
620 self.assertEqual(ss['a3'], 210)
621
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000622 # Verify that dir() catches a non-list returned by eval
623 # SF bug #1004669
624 class C:
625 def __getitem__(self, item):
626 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000627 def keys(self):
628 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000629 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
630
Georg Brandl7cae87c2006-09-06 06:51:57 +0000631 def test_exec(self):
632 g = {}
633 exec('z = 1', g)
634 if '__builtins__' in g:
635 del g['__builtins__']
636 self.assertEqual(g, {'z': 1})
637
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000638 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000639 if '__builtins__' in g:
640 del g['__builtins__']
641 self.assertEqual(g, {'z': 2})
642 g = {}
643 l = {}
644
Brett Cannon77628992010-03-20 20:59:33 +0000645 with check_warnings():
646 warnings.filterwarnings("ignore", "global statement",
647 module="<string>")
648 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000649 if '__builtins__' in g:
650 del g['__builtins__']
651 if '__builtins__' in l:
652 del l['__builtins__']
653 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
654
Victor Stinnerb0b22422012-04-19 00:57:45 +0200655 def test_exec_globals(self):
656 code = compile("print('Hello World!')", "", "exec")
657 # no builtin function
658 self.assertRaisesRegex(NameError, "name 'print' is not defined",
659 exec, code, {'__builtins__': {}})
660 # __builtins__ must be a mapping type
661 self.assertRaises(TypeError,
662 exec, code, {'__builtins__': 123})
663
664 # no __build_class__ function
665 code = compile("class A: pass", "", "exec")
666 self.assertRaisesRegex(NameError, "__build_class__ not found",
667 exec, code, {'__builtins__': {}})
668
669 class frozendict_error(Exception):
670 pass
671
672 class frozendict(dict):
673 def __setitem__(self, key, value):
674 raise frozendict_error("frozendict is readonly")
675
676 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400677 if isinstance(__builtins__, types.ModuleType):
678 frozen_builtins = frozendict(__builtins__.__dict__)
679 else:
680 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200681 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
682 self.assertRaises(frozendict_error,
683 exec, code, {'__builtins__': frozen_builtins})
684
685 # read-only globals
686 namespace = frozendict({})
687 code = compile("x=1", "test", "exec")
688 self.assertRaises(frozendict_error,
689 exec, code, namespace)
690
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000691 def test_exec_redirected(self):
692 savestdout = sys.stdout
693 sys.stdout = None # Whatever that cannot flush()
694 try:
695 # Used to raise SystemError('error return without exception set')
696 exec('a')
697 except NameError:
698 pass
699 finally:
700 sys.stdout = savestdout
701
Walter Dörwald919497e2003-01-19 16:23:59 +0000702 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000703 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
704 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
705 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
706 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
707 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000708 def identity(item):
709 return 1
710 filter(identity, Squares(5))
711 self.assertRaises(TypeError, filter)
712 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000713 def __getitem__(self, index):
714 if index<4:
715 return 42
716 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000717 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000718 def badfunc():
719 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000720 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000721
Walter Dörwaldbf517072003-01-27 15:57:14 +0000722 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000723 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
724 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
725 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000726
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000727 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200728 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
729 f1 = filter(filter_char, "abcdeabcde")
730 f2 = filter(filter_char, "abcdeabcde")
731 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000732
Walter Dörwald919497e2003-01-19 16:23:59 +0000733 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000734 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000735 self.assertRaises(TypeError, getattr, sys, 1)
736 self.assertRaises(TypeError, getattr, sys, 1, "foo")
737 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000738 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000739 # unicode surrogates are not encodable to the default encoding (utf8)
740 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000741
742 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000743 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000744 self.assertRaises(TypeError, hasattr, sys, 1)
745 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000746 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000747
Benjamin Peterson17689992010-08-24 03:26:23 +0000748 # Check that hasattr propagates all exceptions outside of
749 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000750 class A:
751 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000752 raise SystemExit
753 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000754 class B:
755 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000756 raise ValueError
757 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000758
Walter Dörwald919497e2003-01-19 16:23:59 +0000759 def test_hash(self):
760 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000761 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000762 self.assertEqual(hash(1), hash(1.0))
763 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000764 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000765 hash((0,1,2,3))
766 def f(): pass
767 self.assertRaises(TypeError, hash, [])
768 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000769 # Bug 1536021: Allow hash to return long objects
770 class X:
771 def __hash__(self):
772 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000773 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000774 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000775 def __hash__(self):
776 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000777 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000778
779 def test_hex(self):
780 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000781 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 self.assertRaises(TypeError, hex, {})
783
784 def test_id(self):
785 id(None)
786 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000787 id(1.0)
788 id('spam')
789 id((0,1,2,3))
790 id([0,1,2,3])
791 id({'spam': 1, 'eggs': 2, 'ham': 3})
792
Guido van Rossuma88a0332007-02-26 16:59:55 +0000793 # Test input() later, alphabetized as if it were raw_input
794
Walter Dörwald919497e2003-01-19 16:23:59 +0000795 def test_iter(self):
796 self.assertRaises(TypeError, iter)
797 self.assertRaises(TypeError, iter, 42, 42)
798 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 for l in lists:
800 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000801 self.assertEqual(next(i), '1')
802 self.assertEqual(next(i), '2')
803 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000804
805 def test_isinstance(self):
806 class C:
807 pass
808 class D(C):
809 pass
810 class E:
811 pass
812 c = C()
813 d = D()
814 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000815 self.assertTrue(isinstance(c, C))
816 self.assertTrue(isinstance(d, C))
817 self.assertTrue(not isinstance(e, C))
818 self.assertTrue(not isinstance(c, D))
819 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000820 self.assertRaises(TypeError, isinstance, E, 'foo')
821 self.assertRaises(TypeError, isinstance)
822
823 def test_issubclass(self):
824 class C:
825 pass
826 class D(C):
827 pass
828 class E:
829 pass
830 c = C()
831 d = D()
832 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000833 self.assertTrue(issubclass(D, C))
834 self.assertTrue(issubclass(C, C))
835 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000836 self.assertRaises(TypeError, issubclass, 'foo', E)
837 self.assertRaises(TypeError, issubclass, E, 'foo')
838 self.assertRaises(TypeError, issubclass)
839
840 def test_len(self):
841 self.assertEqual(len('123'), 3)
842 self.assertEqual(len(()), 0)
843 self.assertEqual(len((1, 2, 3, 4)), 4)
844 self.assertEqual(len([1, 2, 3, 4]), 4)
845 self.assertEqual(len({}), 0)
846 self.assertEqual(len({'a':1, 'b': 2}), 2)
847 class BadSeq:
848 def __len__(self):
849 raise ValueError
850 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000851 class InvalidLen:
852 def __len__(self):
853 return None
854 self.assertRaises(TypeError, len, InvalidLen())
855 class FloatLen:
856 def __len__(self):
857 return 4.5
858 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300859 class NegativeLen:
860 def __len__(self):
861 return -10
862 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000863 class HugeLen:
864 def __len__(self):
865 return sys.maxsize + 1
866 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300867 class HugeNegativeLen:
868 def __len__(self):
869 return -sys.maxsize-10
870 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000871 class NoLenMethod(object): pass
872 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
Walter Dörwald919497e2003-01-19 16:23:59 +0000874 def test_map(self):
875 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000876 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000877 [1, 4, 9]
878 )
879 try:
880 from math import sqrt
881 except ImportError:
882 def sqrt(x):
883 return pow(x, 0.5)
884 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000885 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000886 [[4.0, 2.0], [9.0, 3.0]]
887 )
888 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000889 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000890 [10, 4, 6]
891 )
892
893 def plus(*v):
894 accu = 0
895 for i in v: accu = accu + i
896 return accu
897 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000898 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000899 [1, 3, 7]
900 )
901 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000902 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000903 [1+4, 3+9, 7+2]
904 )
905 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000906 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000907 [1+4+1, 3+9+1, 7+2+0]
908 )
909 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000910 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000911 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
912 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000913 def Max(a, b):
914 if a is None:
915 return b
916 if b is None:
917 return a
918 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000919 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000920 list(map(Max, Squares(3), Squares(2))),
921 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 )
923 self.assertRaises(TypeError, map)
924 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000925 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000926 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000927 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000928 yield None
929 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000930 def badfunc(x):
931 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000932 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000933
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000934 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200935 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
936 m1 = map(map_char, "Is this the real life?")
937 m2 = map(map_char, "Is this the real life?")
938 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000939
Walter Dörwald919497e2003-01-19 16:23:59 +0000940 def test_max(self):
941 self.assertEqual(max('123123'), '3')
942 self.assertEqual(max(1, 2, 3), 3)
943 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
944 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
945
Guido van Rossume2a383d2007-01-15 16:59:06 +0000946 self.assertEqual(max(1, 2, 3.0), 3.0)
947 self.assertEqual(max(1, 2.0, 3), 3)
948 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000949
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700950 self.assertRaises(TypeError, max)
951 self.assertRaises(TypeError, max, 42)
952 self.assertRaises(ValueError, max, ())
953 class BadSeq:
954 def __getitem__(self, index):
955 raise ValueError
956 self.assertRaises(ValueError, max, BadSeq())
957
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000958 for stmt in (
959 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700960 "max(default=None)",
961 "max(1, 2, default=None)", # require container for default
962 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000963 "max(1, key=int)", # single arg not iterable
964 "max(1, 2, keystone=int)", # wrong keyword
965 "max(1, 2, key=int, abc=int)", # two many keywords
966 "max(1, 2, key=1)", # keyfunc is not callable
967 ):
Tim Peters7f061872004-12-07 21:17:46 +0000968 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000969 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000970 except TypeError:
971 pass
972 else:
973 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000974
975 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
976 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
977 self.assertEqual(max(1, 2, key=neg), 1) # two elems
978
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700979 self.assertEqual(max((), default=None), None) # zero elem iterable
980 self.assertEqual(max((1,), default=None), 1) # one elem iterable
981 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
982
983 self.assertEqual(max((), default=1, key=neg), 1)
984 self.assertEqual(max((1, 2), default=3, key=neg), 1)
985
Alexander Marshalove22072f2018-07-24 10:58:21 +0700986 self.assertEqual(max((1, 2), key=None), 2)
987
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000988 data = [random.randrange(200) for i in range(100)]
989 keys = dict((elem, random.randrange(50)) for elem in data)
990 f = keys.__getitem__
991 self.assertEqual(max(data, key=f),
992 sorted(reversed(data), key=f)[-1])
993
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 def test_min(self):
995 self.assertEqual(min('123123'), '1')
996 self.assertEqual(min(1, 2, 3), 1)
997 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
998 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
999
Guido van Rossume2a383d2007-01-15 16:59:06 +00001000 self.assertEqual(min(1, 2, 3.0), 1)
1001 self.assertEqual(min(1, 2.0, 3), 1)
1002 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001003
1004 self.assertRaises(TypeError, min)
1005 self.assertRaises(TypeError, min, 42)
1006 self.assertRaises(ValueError, min, ())
1007 class BadSeq:
1008 def __getitem__(self, index):
1009 raise ValueError
1010 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001011
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001012 for stmt in (
1013 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001014 "min(default=None)",
1015 "min(1, 2, default=None)", # require container for default
1016 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001017 "min(1, key=int)", # single arg not iterable
1018 "min(1, 2, keystone=int)", # wrong keyword
1019 "min(1, 2, key=int, abc=int)", # two many keywords
1020 "min(1, 2, key=1)", # keyfunc is not callable
1021 ):
Tim Peters7f061872004-12-07 21:17:46 +00001022 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001023 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001024 except TypeError:
1025 pass
1026 else:
1027 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001028
1029 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1030 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1031 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1032
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001033 self.assertEqual(min((), default=None), None) # zero elem iterable
1034 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1035 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1036
1037 self.assertEqual(min((), default=1, key=neg), 1)
1038 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1039
Alexander Marshalove22072f2018-07-24 10:58:21 +07001040 self.assertEqual(min((1, 2), key=None), 1)
1041
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001042 data = [random.randrange(200) for i in range(100)]
1043 keys = dict((elem, random.randrange(50)) for elem in data)
1044 f = keys.__getitem__
1045 self.assertEqual(min(data, key=f),
1046 sorted(data, key=f)[0])
1047
Georg Brandla18af4e2007-04-21 15:47:16 +00001048 def test_next(self):
1049 it = iter(range(2))
1050 self.assertEqual(next(it), 0)
1051 self.assertEqual(next(it), 1)
1052 self.assertRaises(StopIteration, next, it)
1053 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001054 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001055
1056 class Iter(object):
1057 def __iter__(self):
1058 return self
1059 def __next__(self):
1060 raise StopIteration
1061
1062 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001063 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001064 self.assertRaises(StopIteration, next, it)
1065
1066 def gen():
1067 yield 1
1068 return
1069
1070 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001071 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001072 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001073 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001074
Walter Dörwald919497e2003-01-19 16:23:59 +00001075 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001076 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001077 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001078 self.assertRaises(TypeError, oct, ())
1079
1080 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001081 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001082 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001083 self.addCleanup(unlink, TESTFN)
1084 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001085 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001086 fp.write('The quick brown fox jumps over the lazy dog')
1087 fp.write('.\n')
1088 fp.write('Dear John\n')
1089 fp.write('XXX'*100)
1090 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001091
1092 def test_open(self):
1093 self.write_testfile()
1094 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001095 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001096 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001097 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1098 self.assertEqual(fp.readline(4), 'Dear')
1099 self.assertEqual(fp.readline(100), ' John\n')
1100 self.assertEqual(fp.read(300), 'XXX'*100)
1101 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001102
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001103 # embedded null bytes and characters
1104 self.assertRaises(ValueError, open, 'a\x00b')
1105 self.assertRaises(ValueError, open, b'a\x00b')
1106
Victor Stinner91106cd2017-12-13 12:29:09 +01001107 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001108 def test_open_default_encoding(self):
1109 old_environ = dict(os.environ)
1110 try:
1111 # try to get a user preferred encoding different than the current
1112 # locale encoding to check that open() uses the current locale
1113 # encoding and not the user preferred encoding
1114 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1115 if key in os.environ:
1116 del os.environ[key]
1117
1118 self.write_testfile()
1119 current_locale_encoding = locale.getpreferredencoding(False)
1120 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001121 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001122 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001123 finally:
1124 os.environ.clear()
1125 os.environ.update(old_environ)
1126
Victor Stinnerdaf45552013-08-28 00:53:59 +02001127 def test_open_non_inheritable(self):
1128 fileobj = open(__file__)
1129 with fileobj:
1130 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1131
Walter Dörwald919497e2003-01-19 16:23:59 +00001132 def test_ord(self):
1133 self.assertEqual(ord(' '), 32)
1134 self.assertEqual(ord('A'), 65)
1135 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001136 self.assertEqual(ord('\x80'), 128)
1137 self.assertEqual(ord('\xff'), 255)
1138
1139 self.assertEqual(ord(b' '), 32)
1140 self.assertEqual(ord(b'A'), 65)
1141 self.assertEqual(ord(b'a'), 97)
1142 self.assertEqual(ord(b'\x80'), 128)
1143 self.assertEqual(ord(b'\xff'), 255)
1144
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001145 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001146 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001147
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001148 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1149 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1150 self.assertEqual(ord("\U00010000"), 0x00010000)
1151 self.assertEqual(ord("\U00010001"), 0x00010001)
1152 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1153 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1154 self.assertEqual(ord("\U00100000"), 0x00100000)
1155 self.assertEqual(ord("\U00100001"), 0x00100001)
1156 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1157 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1158
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 def test_pow(self):
1160 self.assertEqual(pow(0,0), 1)
1161 self.assertEqual(pow(0,1), 0)
1162 self.assertEqual(pow(1,0), 1)
1163 self.assertEqual(pow(1,1), 1)
1164
1165 self.assertEqual(pow(2,0), 1)
1166 self.assertEqual(pow(2,10), 1024)
1167 self.assertEqual(pow(2,20), 1024*1024)
1168 self.assertEqual(pow(2,30), 1024*1024*1024)
1169
1170 self.assertEqual(pow(-2,0), 1)
1171 self.assertEqual(pow(-2,1), -2)
1172 self.assertEqual(pow(-2,2), 4)
1173 self.assertEqual(pow(-2,3), -8)
1174
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 self.assertAlmostEqual(pow(0.,0), 1.)
1176 self.assertAlmostEqual(pow(0.,1), 0.)
1177 self.assertAlmostEqual(pow(1.,0), 1.)
1178 self.assertAlmostEqual(pow(1.,1), 1.)
1179
1180 self.assertAlmostEqual(pow(2.,0), 1.)
1181 self.assertAlmostEqual(pow(2.,10), 1024.)
1182 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1183 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1184
1185 self.assertAlmostEqual(pow(-2.,0), 1.)
1186 self.assertAlmostEqual(pow(-2.,1), -2.)
1187 self.assertAlmostEqual(pow(-2.,2), 4.)
1188 self.assertAlmostEqual(pow(-2.,3), -8.)
1189
Mark Dickinson5c2db372009-12-05 20:28:34 +00001190 for x in 2, 2.0:
1191 for y in 10, 10.0:
1192 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001193 if isinstance(x, float) or \
1194 isinstance(y, float) or \
1195 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001196 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001197 else:
1198 self.assertAlmostEqual(pow(x, y, z), 24.0)
1199
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001200 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1201 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1202
Mark Dickinsonc5299672019-06-02 10:24:06 +01001203 # See test_pow for additional tests for three-argument pow.
1204 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001205 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001206
1207 self.assertRaises(TypeError, pow)
1208
Guido van Rossuma88a0332007-02-26 16:59:55 +00001209 def test_input(self):
1210 self.write_testfile()
1211 fp = open(TESTFN, 'r')
1212 savestdin = sys.stdin
1213 savestdout = sys.stdout # Eats the echo
1214 try:
1215 sys.stdin = fp
1216 sys.stdout = BitBucket()
1217 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001218 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1219 self.assertEqual(input('testing\n'), 'Dear John')
1220
1221 # SF 1535165: don't segfault on closed stdin
1222 # sys.stdout must be a regular file for triggering
1223 sys.stdout = savestdout
1224 sys.stdin.close()
1225 self.assertRaises(ValueError, input)
1226
1227 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001228 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001229 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001230 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001231 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001232 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001233 self.assertRaises(EOFError, input)
1234
1235 del sys.stdout
1236 self.assertRaises(RuntimeError, input, 'prompt')
1237 del sys.stdin
1238 self.assertRaises(RuntimeError, input, 'prompt')
1239 finally:
1240 sys.stdin = savestdin
1241 sys.stdout = savestdout
1242 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001243
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001244 # test_int(): see test_int.py for tests of built-in function int().
1245
Walter Dörwald919497e2003-01-19 16:23:59 +00001246 def test_repr(self):
1247 self.assertEqual(repr(''), '\'\'')
1248 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001249 self.assertEqual(repr(()), '()')
1250 self.assertEqual(repr([]), '[]')
1251 self.assertEqual(repr({}), '{}')
1252 a = []
1253 a.append(a)
1254 self.assertEqual(repr(a), '[[...]]')
1255 a = {}
1256 a[0] = a
1257 self.assertEqual(repr(a), '{0: {...}}')
1258
1259 def test_round(self):
1260 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001261 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 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(-1.0), -1.0)
1268 self.assertEqual(round(-10.0), -10.0)
1269 self.assertEqual(round(-1000000000.0), -1000000000.0)
1270 self.assertEqual(round(-1e20), -1e20)
1271
1272 self.assertEqual(round(0.1), 0.0)
1273 self.assertEqual(round(1.1), 1.0)
1274 self.assertEqual(round(10.1), 10.0)
1275 self.assertEqual(round(1000000000.1), 1000000000.0)
1276
1277 self.assertEqual(round(-1.1), -1.0)
1278 self.assertEqual(round(-10.1), -10.0)
1279 self.assertEqual(round(-1000000000.1), -1000000000.0)
1280
1281 self.assertEqual(round(0.9), 1.0)
1282 self.assertEqual(round(9.9), 10.0)
1283 self.assertEqual(round(999999999.9), 1000000000.0)
1284
1285 self.assertEqual(round(-0.9), -1.0)
1286 self.assertEqual(round(-9.9), -10.0)
1287 self.assertEqual(round(-999999999.9), -1000000000.0)
1288
1289 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001290 self.assertEqual(type(round(-8.0, -1)), float)
1291
1292 self.assertEqual(type(round(-8.0, 0)), float)
1293 self.assertEqual(type(round(-8.0, 1)), float)
1294
1295 # Check even / odd rounding behaviour
1296 self.assertEqual(round(5.5), 6)
1297 self.assertEqual(round(6.5), 6)
1298 self.assertEqual(round(-5.5), -6)
1299 self.assertEqual(round(-6.5), -6)
1300
1301 # Check behavior on ints
1302 self.assertEqual(round(0), 0)
1303 self.assertEqual(round(8), 8)
1304 self.assertEqual(round(-8), -8)
1305 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001306 self.assertEqual(type(round(-8, -1)), int)
1307 self.assertEqual(type(round(-8, 0)), int)
1308 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001309
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310 # test new kwargs
1311 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1312
Walter Dörwald919497e2003-01-19 16:23:59 +00001313 self.assertRaises(TypeError, round)
1314
Alex Martelliae211f92007-08-22 23:21:33 +00001315 # test generic rounding delegation for reals
1316 class TestRound:
1317 def __round__(self):
1318 return 23
1319
1320 class TestNoRound:
1321 pass
1322
1323 self.assertEqual(round(TestRound()), 23)
1324
1325 self.assertRaises(TypeError, round, 1, 2, 3)
1326 self.assertRaises(TypeError, round, TestNoRound())
1327
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001328 t = TestNoRound()
1329 t.__round__ = lambda *args: args
1330 self.assertRaises(TypeError, round, t)
1331 self.assertRaises(TypeError, round, t, 0)
1332
Mark Dickinsonad731b92009-11-09 17:12:30 +00001333 # Some versions of glibc for alpha have a bug that affects
1334 # float -> integer rounding (floor, ceil, rint, round) for
1335 # values in the range [2**52, 2**53). See:
1336 #
1337 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1338 #
1339 # We skip this test on Linux/alpha if it would fail.
1340 linux_alpha = (platform.system().startswith('Linux') and
1341 platform.machine().startswith('alpha'))
1342 system_round_bug = round(5e15+1) != 5e15+1
1343 @unittest.skipIf(linux_alpha and system_round_bug,
1344 "test will fail; failure is probably due to a "
1345 "buggy system round function")
1346 def test_round_large(self):
1347 # Issue #1869: integral floats should remain unchanged
1348 self.assertEqual(round(5e15-1), 5e15-1)
1349 self.assertEqual(round(5e15), 5e15)
1350 self.assertEqual(round(5e15+1), 5e15+1)
1351 self.assertEqual(round(5e15+2), 5e15+2)
1352 self.assertEqual(round(5e15+3), 5e15+3)
1353
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001354 def test_bug_27936(self):
1355 # Verify that ndigits=None means the same as passing in no argument
1356 for x in [1234,
1357 1234.56,
1358 decimal.Decimal('1234.56'),
1359 fractions.Fraction(123456, 100)]:
1360 self.assertEqual(round(x, None), round(x))
1361 self.assertEqual(type(round(x, None)), type(round(x)))
1362
Walter Dörwald919497e2003-01-19 16:23:59 +00001363 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001364 setattr(sys, 'spam', 1)
1365 self.assertEqual(sys.spam, 1)
1366 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1367 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001368
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001369 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001370
Alex Martellia70b1912003-04-22 08:12:33 +00001371 def test_sum(self):
1372 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001373 self.assertEqual(sum(list(range(2,8))), 27)
1374 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001375 self.assertEqual(sum(Squares(10)), 285)
1376 self.assertEqual(sum(iter(Squares(10))), 285)
1377 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1378
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001379 self.assertEqual(sum(range(10), 1000), 1045)
1380 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001381 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1382 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1383
1384 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1385 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1386 2**31+2)
1387 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1388 2**63+2)
1389 self.assertIs(sum([], False), False)
1390
1391 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1392 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1393 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1394 self.assertEqual(sum([0.5, 1]), 1.5)
1395 self.assertEqual(sum([1, 0.5]), 1.5)
1396 self.assertEqual(repr(sum([-0.0])), '0.0')
1397 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1398 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001399
Alex Martellia70b1912003-04-22 08:12:33 +00001400 self.assertRaises(TypeError, sum)
1401 self.assertRaises(TypeError, sum, 42)
1402 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1403 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001404 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1405 values = [bytearray(b'a'), bytearray(b'b')]
1406 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001407 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1408 self.assertRaises(TypeError, sum, [{2:3}])
1409 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001410 self.assertRaises(TypeError, sum, [], '')
1411 self.assertRaises(TypeError, sum, [], b'')
1412 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001413
1414 class BadSeq:
1415 def __getitem__(self, index):
1416 raise ValueError
1417 self.assertRaises(ValueError, sum, BadSeq())
1418
Mark Dickinson3a22b472009-10-17 21:48:16 +00001419 empty = []
1420 sum(([x] for x in range(10)), empty)
1421 self.assertEqual(empty, [])
1422
Walter Dörwald919497e2003-01-19 16:23:59 +00001423 def test_type(self):
1424 self.assertEqual(type(''), type('123'))
1425 self.assertNotEqual(type(''), type(()))
1426
Guido van Rossumfee7b932005-01-16 00:21:28 +00001427 # We don't want self in vars(), so these are static methods
1428
1429 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001430 def get_vars_f0():
1431 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001432
Guido van Rossumfee7b932005-01-16 00:21:28 +00001433 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001434 def get_vars_f2():
1435 BuiltinTest.get_vars_f0()
1436 a = 1
1437 b = 2
1438 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001439
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001440 class C_get_vars(object):
1441 def getDict(self):
1442 return {'a':2}
1443 __dict__ = property(fget=getDict)
1444
Walter Dörwald919497e2003-01-19 16:23:59 +00001445 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001446 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001447 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001448 self.assertEqual(self.get_vars_f0(), {})
1449 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1450 self.assertRaises(TypeError, vars, 42, 42)
1451 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001452 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001453
1454 def test_zip(self):
1455 a = (1, 2, 3)
1456 b = (4, 5, 6)
1457 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001458 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001459 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001460 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001461 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001462 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001463 class I:
1464 def __getitem__(self, i):
1465 if i < 0 or i > 2: raise IndexError
1466 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001467 self.assertEqual(list(zip(a, I())), t)
1468 self.assertEqual(list(zip()), [])
1469 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001470 self.assertRaises(TypeError, zip, None)
1471 class G:
1472 pass
1473 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001474 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001475
1476 # Make sure zip doesn't try to allocate a billion elements for the
1477 # result list when one of its arguments doesn't say how long it is.
1478 # A MemoryError is the most likely failure mode.
1479 class SequenceWithoutALength:
1480 def __getitem__(self, i):
1481 if i == 5:
1482 raise IndexError
1483 else:
1484 return i
1485 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001486 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001487 list(enumerate(range(5)))
1488 )
1489
1490 class BadSeq:
1491 def __getitem__(self, i):
1492 if i == 5:
1493 raise ValueError
1494 else:
1495 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001496 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001497
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001498 def test_zip_pickle(self):
1499 a = (1, 2, 3)
1500 b = (4, 5, 6)
1501 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001502 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1503 z1 = zip(a, b)
1504 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001505
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001506 def test_zip_bad_iterable(self):
1507 exception = TypeError()
1508
1509 class BadIterable:
1510 def __iter__(self):
1511 raise exception
1512
1513 with self.assertRaises(TypeError) as cm:
1514 zip(BadIterable())
1515
1516 self.assertIs(cm.exception, exception)
1517
Eric Smithe4d63172010-09-13 20:48:43 +00001518 def test_format(self):
1519 # Test the basic machinery of the format() builtin. Don't test
1520 # the specifics of the various formatters
1521 self.assertEqual(format(3, ''), '3')
1522
1523 # Returns some classes to use for various tests. There's
1524 # an old-style version, and a new-style version
1525 def classes_new():
1526 class A(object):
1527 def __init__(self, x):
1528 self.x = x
1529 def __format__(self, format_spec):
1530 return str(self.x) + format_spec
1531 class DerivedFromA(A):
1532 pass
1533
1534 class Simple(object): pass
1535 class DerivedFromSimple(Simple):
1536 def __init__(self, x):
1537 self.x = x
1538 def __format__(self, format_spec):
1539 return str(self.x) + format_spec
1540 class DerivedFromSimple2(DerivedFromSimple): pass
1541 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1542
1543 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1544 self.assertEqual(format(A(3), 'spec'), '3spec')
1545 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1546 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1547 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1548 '10abcdef')
1549
1550 class_test(*classes_new())
1551
1552 def empty_format_spec(value):
1553 # test that:
1554 # format(x, '') == str(x)
1555 # format(x) == str(x)
1556 self.assertEqual(format(value, ""), str(value))
1557 self.assertEqual(format(value), str(value))
1558
1559 # for builtin types, format(x, "") == str(x)
1560 empty_format_spec(17**13)
1561 empty_format_spec(1.0)
1562 empty_format_spec(3.1415e104)
1563 empty_format_spec(-3.1415e104)
1564 empty_format_spec(3.1415e-104)
1565 empty_format_spec(-3.1415e-104)
1566 empty_format_spec(object)
1567 empty_format_spec(None)
1568
1569 # TypeError because self.__format__ returns the wrong type
1570 class BadFormatResult:
1571 def __format__(self, format_spec):
1572 return 1.0
1573 self.assertRaises(TypeError, format, BadFormatResult(), "")
1574
1575 # TypeError because format_spec is not unicode or str
1576 self.assertRaises(TypeError, format, object(), 4)
1577 self.assertRaises(TypeError, format, object(), object())
1578
1579 # tests for object.__format__ really belong elsewhere, but
1580 # there's no good place to put them
1581 x = object().__format__('')
1582 self.assertTrue(x.startswith('<object object at'))
1583
1584 # first argument to object.__format__ must be string
1585 self.assertRaises(TypeError, object().__format__, 3)
1586 self.assertRaises(TypeError, object().__format__, object())
1587 self.assertRaises(TypeError, object().__format__, None)
1588
1589 # --------------------------------------------------------------------
1590 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001591 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001592 class A:
1593 def __format__(self, fmt_str):
1594 return format('', fmt_str)
1595
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001596 self.assertEqual(format(A()), '')
1597 self.assertEqual(format(A(), ''), '')
1598 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001599
1600 class B:
1601 pass
1602
1603 class C(object):
1604 pass
1605
1606 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001607 obj = cls()
1608 self.assertEqual(format(obj), str(obj))
1609 self.assertEqual(format(obj, ''), str(obj))
1610 with self.assertRaisesRegex(TypeError,
1611 r'\b%s\b' % re.escape(cls.__name__)):
1612 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001613 # --------------------------------------------------------------------
1614
1615 # make sure we can take a subclass of str as a format spec
1616 class DerivedFromStr(str): pass
1617 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1618
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001619 def test_bin(self):
1620 self.assertEqual(bin(0), '0b0')
1621 self.assertEqual(bin(1), '0b1')
1622 self.assertEqual(bin(-1), '-0b1')
1623 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1624 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1625 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1626 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1627
Georg Brandl953152f2009-07-22 12:03:59 +00001628 def test_bytearray_translate(self):
1629 x = bytearray(b"abc")
1630 self.assertRaises(ValueError, x.translate, b"1", 1)
1631 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1632
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001633 def test_bytearray_extend_error(self):
1634 array = bytearray()
1635 bad_iter = map(int, "X")
1636 self.assertRaises(ValueError, array.extend, bad_iter)
1637
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001638 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001639 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001640 tp = type(const)
1641 self.assertIs(tp(), const)
1642 self.assertRaises(TypeError, tp, 1, 2)
1643 self.assertRaises(TypeError, tp, a=1, b=2)
1644
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001645
1646class TestBreakpoint(unittest.TestCase):
1647 def setUp(self):
1648 # These tests require a clean slate environment. For example, if the
1649 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1650 # will mess up these tests. Similarly for sys.breakpointhook.
1651 # Cleaning the slate here means you can't use breakpoint() to debug
1652 # these tests, but I think that's okay. Just use pdb.set_trace() if
1653 # you must.
1654 self.resources = ExitStack()
1655 self.addCleanup(self.resources.close)
1656 self.env = self.resources.enter_context(EnvironmentVarGuard())
1657 del self.env['PYTHONBREAKPOINT']
1658 self.resources.enter_context(
1659 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1660
1661 def test_breakpoint(self):
1662 with patch('pdb.set_trace') as mock:
1663 breakpoint()
1664 mock.assert_called_once()
1665
1666 def test_breakpoint_with_breakpointhook_set(self):
1667 my_breakpointhook = MagicMock()
1668 sys.breakpointhook = my_breakpointhook
1669 breakpoint()
1670 my_breakpointhook.assert_called_once_with()
1671
1672 def test_breakpoint_with_breakpointhook_reset(self):
1673 my_breakpointhook = MagicMock()
1674 sys.breakpointhook = my_breakpointhook
1675 breakpoint()
1676 my_breakpointhook.assert_called_once_with()
1677 # Reset the hook and it will not be called again.
1678 sys.breakpointhook = sys.__breakpointhook__
1679 with patch('pdb.set_trace') as mock:
1680 breakpoint()
1681 mock.assert_called_once_with()
1682 my_breakpointhook.assert_called_once_with()
1683
1684 def test_breakpoint_with_args_and_keywords(self):
1685 my_breakpointhook = MagicMock()
1686 sys.breakpointhook = my_breakpointhook
1687 breakpoint(1, 2, 3, four=4, five=5)
1688 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1689
1690 def test_breakpoint_with_passthru_error(self):
1691 def my_breakpointhook():
1692 pass
1693 sys.breakpointhook = my_breakpointhook
1694 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1695
1696 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1697 def test_envar_good_path_builtin(self):
1698 self.env['PYTHONBREAKPOINT'] = 'int'
1699 with patch('builtins.int') as mock:
1700 breakpoint('7')
1701 mock.assert_called_once_with('7')
1702
1703 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1704 def test_envar_good_path_other(self):
1705 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1706 with patch('sys.exit') as mock:
1707 breakpoint()
1708 mock.assert_called_once_with()
1709
1710 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1711 def test_envar_good_path_noop_0(self):
1712 self.env['PYTHONBREAKPOINT'] = '0'
1713 with patch('pdb.set_trace') as mock:
1714 breakpoint()
1715 mock.assert_not_called()
1716
1717 def test_envar_good_path_empty_string(self):
1718 # PYTHONBREAKPOINT='' is the same as it not being set.
1719 self.env['PYTHONBREAKPOINT'] = ''
1720 with patch('pdb.set_trace') as mock:
1721 breakpoint()
1722 mock.assert_called_once_with()
1723
1724 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1725 def test_envar_unimportable(self):
1726 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001727 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001728 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001729 'nosuchbuiltin',
1730 'nosuchmodule.nosuchcallable',
1731 ):
1732 with self.subTest(envar=envar):
1733 self.env['PYTHONBREAKPOINT'] = envar
1734 mock = self.resources.enter_context(patch('pdb.set_trace'))
1735 w = self.resources.enter_context(check_warnings(quiet=True))
1736 breakpoint()
1737 self.assertEqual(
1738 str(w.message),
1739 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1740 self.assertEqual(w.category, RuntimeWarning)
1741 mock.assert_not_called()
1742
1743 def test_envar_ignored_when_hook_is_set(self):
1744 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1745 with patch('sys.exit') as mock:
1746 sys.breakpointhook = int
1747 breakpoint()
1748 mock.assert_not_called()
1749
1750
Martin Panterc9a6ab52015-10-10 01:25:38 +00001751@unittest.skipUnless(pty, "the pty and signal modules must be available")
1752class PtyTests(unittest.TestCase):
1753 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1754 terminals in the test environment"""
1755
Martin Pantere44dba32015-10-10 05:27:15 +00001756 def run_child(self, child, terminal_input):
1757 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001758 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001759 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001760 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001761 os.close(r)
1762 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001763 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001764 raise
1765 if pid == 0:
1766 # Child
1767 try:
1768 # Make sure we don't get stuck if there's a problem
1769 signal.alarm(2)
1770 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001771 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001772 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001773 except:
1774 traceback.print_exc()
1775 finally:
1776 # We don't want to return to unittest...
1777 os._exit(0)
1778 # Parent
1779 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001780 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001781 # Get results from the pipe
1782 with open(r, "r") as rpipe:
1783 lines = []
1784 while True:
1785 line = rpipe.readline().strip()
1786 if line == "":
1787 # The other end was closed => the child exited
1788 break
1789 lines.append(line)
1790 # Check the result was got and corresponds to the user's terminal input
1791 if len(lines) != 2:
1792 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001793 # Beware of Linux raising EIO when the slave is closed
1794 child_output = bytearray()
1795 while True:
1796 try:
1797 chunk = os.read(fd, 3000)
1798 except OSError: # Assume EIO
1799 break
1800 if not chunk:
1801 break
1802 child_output.extend(chunk)
1803 os.close(fd)
1804 child_output = child_output.decode("ascii", "ignore")
1805 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1806 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001807 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001808
Victor Stinner3ca9f502017-08-09 23:08:22 +02001809 # Wait until the child process completes
1810 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001811
Martin Pantere44dba32015-10-10 05:27:15 +00001812 return lines
1813
1814 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1815 if not sys.stdin.isatty() or not sys.stdout.isatty():
1816 self.skipTest("stdin and stdout must be ttys")
1817 def child(wpipe):
1818 # Check the error handlers are accounted for
1819 if stdio_encoding:
1820 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1821 encoding=stdio_encoding,
1822 errors='surrogateescape')
1823 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1824 encoding=stdio_encoding,
1825 errors='replace')
1826 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1827 print(ascii(input(prompt)), file=wpipe)
1828 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001829 # Check we did exercise the GNU readline path
1830 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1831 if lines[0] != 'tty = True':
1832 self.skipTest("standard IO in should have been a tty")
1833 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1834 if stdio_encoding:
1835 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1836 else:
1837 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1838 self.assertEqual(input_result, expected)
1839
1840 def test_input_tty(self):
1841 # Test input() functionality when wired to a tty (the code path
1842 # is different and invokes GNU readline if available).
1843 self.check_input_tty("prompt", b"quux")
1844
1845 def test_input_tty_non_ascii(self):
1846 # Check stdin/stdout encoding is used when invoking GNU readline
1847 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1848
1849 def test_input_tty_non_ascii_unicode_errors(self):
1850 # Check stdin/stdout error handler is used when invoking GNU readline
1851 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1852
1853 def test_input_no_stdout_fileno(self):
1854 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1855 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001856 def child(wpipe):
1857 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1858 sys.stdout = io.StringIO() # Does not support fileno()
1859 input("prompt")
1860 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1861 lines = self.run_child(child, b"quux\r")
1862 expected = (
1863 "stdin.isatty(): True",
1864 "captured: 'prompt'",
1865 )
1866 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001867
Raymond Hettinger64958a12003-12-17 20:43:33 +00001868class TestSorted(unittest.TestCase):
1869
1870 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001871 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001872 copy = data[:]
1873 random.shuffle(copy)
1874 self.assertEqual(data, sorted(copy))
1875 self.assertNotEqual(data, copy)
1876
1877 data.reverse()
1878 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001879 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1880 self.assertNotEqual(data, copy)
1881 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001882 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001883 self.assertNotEqual(data, copy)
1884
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001885 def test_bad_arguments(self):
1886 # Issue #29327: The first argument is positional-only.
1887 sorted([])
1888 with self.assertRaises(TypeError):
1889 sorted(iterable=[])
1890 # Other arguments are keyword-only
1891 sorted([], key=None)
1892 with self.assertRaises(TypeError):
1893 sorted([], None)
1894
Raymond Hettinger64958a12003-12-17 20:43:33 +00001895 def test_inputtypes(self):
1896 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001897 types = [list, tuple, str]
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
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001901 s = ''.join(set(s)) # unique letters only
1902 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001903 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001904 self.assertEqual(sorted(s), sorted(T(s)))
1905
1906 def test_baddecorator(self):
1907 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1908 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1909
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001910
1911class ShutdownTest(unittest.TestCase):
1912
1913 def test_cleanup(self):
1914 # Issue #19255: builtins are still available at shutdown
1915 code = """if 1:
1916 import builtins
1917 import sys
1918
1919 class C:
1920 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001921 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001922 # Check that builtins still exist
1923 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001924 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001925
1926 c = C()
1927 # Make this module survive until builtins and sys are cleaned
1928 builtins.here = sys.modules[__name__]
1929 sys.here = sys.modules[__name__]
1930 # Create a reference loop so that this module needs to go
1931 # through a GC phase.
1932 here = sys.modules[__name__]
1933 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001934 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1935 # otherwise the codec may be unloaded before C.__del__() is called, and
1936 # so print("before") fails because the codec cannot be used to encode
1937 # "before" to sys.stdout.encoding. For example, on Windows,
1938 # sys.stdout.encoding is the OEM code page and these code pages are
1939 # implemented in Python
1940 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001941 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001942 self.assertEqual(["before", "after"], out.decode().splitlines())
1943
1944
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001945class TestType(unittest.TestCase):
1946 def test_new_type(self):
1947 A = type('A', (), {})
1948 self.assertEqual(A.__name__, 'A')
1949 self.assertEqual(A.__qualname__, 'A')
1950 self.assertEqual(A.__module__, __name__)
1951 self.assertEqual(A.__bases__, (object,))
1952 self.assertIs(A.__base__, object)
1953 x = A()
1954 self.assertIs(type(x), A)
1955 self.assertIs(x.__class__, A)
1956
1957 class B:
1958 def ham(self):
1959 return 'ham%d' % self
1960 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1961 self.assertEqual(C.__name__, 'C')
1962 self.assertEqual(C.__qualname__, 'C')
1963 self.assertEqual(C.__module__, __name__)
1964 self.assertEqual(C.__bases__, (B, int))
1965 self.assertIs(C.__base__, int)
1966 self.assertIn('spam', C.__dict__)
1967 self.assertNotIn('ham', C.__dict__)
1968 x = C(42)
1969 self.assertEqual(x, 42)
1970 self.assertIs(type(x), C)
1971 self.assertIs(x.__class__, C)
1972 self.assertEqual(x.ham(), 'ham42')
1973 self.assertEqual(x.spam(), 'spam42')
1974 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1975
Nick Coghland78448e2016-07-30 16:26:03 +10001976 def test_type_nokwargs(self):
1977 with self.assertRaises(TypeError):
1978 type('a', (), {}, x=5)
1979 with self.assertRaises(TypeError):
1980 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001981
1982 def test_type_name(self):
1983 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1984 with self.subTest(name=name):
1985 A = type(name, (), {})
1986 self.assertEqual(A.__name__, name)
1987 self.assertEqual(A.__qualname__, name)
1988 self.assertEqual(A.__module__, __name__)
1989 with self.assertRaises(ValueError):
1990 type('A\x00B', (), {})
1991 with self.assertRaises(ValueError):
1992 type('A\udcdcB', (), {})
1993 with self.assertRaises(TypeError):
1994 type(b'A', (), {})
1995
1996 C = type('C', (), {})
1997 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1998 with self.subTest(name=name):
1999 C.__name__ = name
2000 self.assertEqual(C.__name__, name)
2001 self.assertEqual(C.__qualname__, 'C')
2002 self.assertEqual(C.__module__, __name__)
2003
2004 A = type('C', (), {})
2005 with self.assertRaises(ValueError):
2006 A.__name__ = 'A\x00B'
2007 self.assertEqual(A.__name__, 'C')
2008 with self.assertRaises(ValueError):
2009 A.__name__ = 'A\udcdcB'
2010 self.assertEqual(A.__name__, 'C')
2011 with self.assertRaises(TypeError):
2012 A.__name__ = b'A'
2013 self.assertEqual(A.__name__, 'C')
2014
2015 def test_type_qualname(self):
2016 A = type('A', (), {'__qualname__': 'B.C'})
2017 self.assertEqual(A.__name__, 'A')
2018 self.assertEqual(A.__qualname__, 'B.C')
2019 self.assertEqual(A.__module__, __name__)
2020 with self.assertRaises(TypeError):
2021 type('A', (), {'__qualname__': b'B'})
2022 self.assertEqual(A.__qualname__, 'B.C')
2023
2024 A.__qualname__ = 'D.E'
2025 self.assertEqual(A.__name__, 'A')
2026 self.assertEqual(A.__qualname__, 'D.E')
2027 with self.assertRaises(TypeError):
2028 A.__qualname__ = b'B'
2029 self.assertEqual(A.__qualname__, 'D.E')
2030
2031 def test_type_doc(self):
2032 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2033 A = type('A', (), {'__doc__': doc})
2034 self.assertEqual(A.__doc__, doc)
2035 with self.assertRaises(UnicodeEncodeError):
2036 type('A', (), {'__doc__': 'x\udcdcy'})
2037
2038 A = type('A', (), {})
2039 self.assertEqual(A.__doc__, None)
2040 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2041 A.__doc__ = doc
2042 self.assertEqual(A.__doc__, doc)
2043
2044 def test_bad_args(self):
2045 with self.assertRaises(TypeError):
2046 type()
2047 with self.assertRaises(TypeError):
2048 type('A', ())
2049 with self.assertRaises(TypeError):
2050 type('A', (), {}, ())
2051 with self.assertRaises(TypeError):
2052 type('A', (), dict={})
2053 with self.assertRaises(TypeError):
2054 type('A', [], {})
2055 with self.assertRaises(TypeError):
2056 type('A', (), types.MappingProxyType({}))
2057 with self.assertRaises(TypeError):
2058 type('A', (None,), {})
2059 with self.assertRaises(TypeError):
2060 type('A', (bool,), {})
2061 with self.assertRaises(TypeError):
2062 type('A', (int, str), {})
2063
2064 def test_bad_slots(self):
2065 with self.assertRaises(TypeError):
2066 type('A', (), {'__slots__': b'x'})
2067 with self.assertRaises(TypeError):
2068 type('A', (int,), {'__slots__': 'x'})
2069 with self.assertRaises(TypeError):
2070 type('A', (), {'__slots__': ''})
2071 with self.assertRaises(TypeError):
2072 type('A', (), {'__slots__': '42'})
2073 with self.assertRaises(TypeError):
2074 type('A', (), {'__slots__': 'x\x00y'})
2075 with self.assertRaises(ValueError):
2076 type('A', (), {'__slots__': 'x', 'x': 0})
2077 with self.assertRaises(TypeError):
2078 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2079 with self.assertRaises(TypeError):
2080 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2081
2082 class B:
2083 pass
2084 with self.assertRaises(TypeError):
2085 type('A', (B,), {'__slots__': '__dict__'})
2086 with self.assertRaises(TypeError):
2087 type('A', (B,), {'__slots__': '__weakref__'})
2088
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002089 def test_namespace_order(self):
2090 # bpo-34320: namespace should preserve order
2091 od = collections.OrderedDict([('a', 1), ('b', 2)])
2092 od.move_to_end('a')
2093 expected = list(od.items())
2094
2095 C = type('C', (), od)
2096 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2097
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002098
Zachary Warea4b7a752013-11-24 01:19:09 -06002099def load_tests(loader, tests, pattern):
2100 from doctest import DocTestSuite
2101 tests.addTest(DocTestSuite(builtins))
2102 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002103
2104if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002105 unittest.main()