blob: abccf32227444818dce4dedd19366127bfc49cb7 [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
Ammar Askar87d6cd32019-09-21 00:28:49 -040022from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070023from inspect import CO_COROUTINE
24from itertools import product
25from textwrap import dedent
26from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020027from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040028from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070029 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
30 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030031from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040032from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010033try:
Antoine Pitrou772add72011-11-06 02:37:42 +010034 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010035except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010036 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000037
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Walter Dörwald919497e2003-01-19 16:23:59 +000039class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000040
Walter Dörwald919497e2003-01-19 16:23:59 +000041 def __init__(self, max):
42 self.max = max
43 self.sofar = []
44
45 def __len__(self): return len(self.sofar)
46
47 def __getitem__(self, i):
48 if not 0 <= i < self.max: raise IndexError
49 n = len(self.sofar)
50 while n <= i:
51 self.sofar.append(n*n)
52 n += 1
53 return self.sofar[i]
54
55class StrSquares:
56
57 def __init__(self, max):
58 self.max = max
59 self.sofar = []
60
61 def __len__(self):
62 return len(self.sofar)
63
64 def __getitem__(self, i):
65 if not 0 <= i < self.max:
66 raise IndexError
67 n = len(self.sofar)
68 while n <= i:
69 self.sofar.append(str(n*n))
70 n += 1
71 return self.sofar[i]
72
73class BitBucket:
74 def write(self, line):
75 pass
76
Facundo Batista2336bdd2008-01-19 19:12:01 +000077test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000078 ('0', 0),
79 ('1', 1),
80 ('9', 9),
81 ('10', 10),
82 ('99', 99),
83 ('100', 100),
84 ('314', 314),
85 (' 314', 314),
86 ('314 ', 314),
87 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000088 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000089 (' 1x', ValueError),
90 (' 1 ', 1),
91 (' 1\02 ', ValueError),
92 ('', ValueError),
93 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000094 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040095 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000096 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000097]
98
Facundo Batista2336bdd2008-01-19 19:12:01 +000099test_conv_sign = [
100 ('0', 0),
101 ('1', 1),
102 ('9', 9),
103 ('10', 10),
104 ('99', 99),
105 ('100', 100),
106 ('314', 314),
107 (' 314', ValueError),
108 ('314 ', 314),
109 (' \t\t 314 \t\t ', ValueError),
110 (repr(sys.maxsize), sys.maxsize),
111 (' 1x', ValueError),
112 (' 1 ', ValueError),
113 (' 1\02 ', ValueError),
114 ('', ValueError),
115 (' ', ValueError),
116 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400117 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000118 (chr(0x200), ValueError),
119]
120
Raymond Hettinger96229b12005-03-11 06:49:40 +0000121class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000122 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123 raise RuntimeError
124
125class TestFailingIter:
126 def __iter__(self):
127 raise RuntimeError
128
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000129def filter_char(arg):
130 return ord(arg) > ord("d")
131
132def map_char(arg):
133 return chr(ord(arg)+1)
134
Walter Dörwald919497e2003-01-19 16:23:59 +0000135class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000136 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200137 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000138 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200139 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000140 it = pickle.loads(d)
141 self.assertEqual(type(itorg), type(it))
142 self.assertEqual(list(it), seq)
143
144 #test the iterator after dropping one from it
145 it = pickle.loads(d)
146 try:
147 next(it)
148 except StopIteration:
149 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200150 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000151 it = pickle.loads(d)
152 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000153
154 def test_import(self):
155 __import__('sys')
156 __import__('time')
157 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000158 __import__(name='sys')
159 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 self.assertRaises(ImportError, __import__, 'spamspam')
161 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000162 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000163 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000164 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100165 with self.assertWarns(ImportWarning):
166 self.assertRaises(ImportError, __import__, '',
167 {'__package__': None, '__spec__': None, '__name__': '__main__'},
168 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300169 # embedded null character
170 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000171
172 def test_abs(self):
173 # int
174 self.assertEqual(abs(0), 0)
175 self.assertEqual(abs(1234), 1234)
176 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000177 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000178 # float
179 self.assertEqual(abs(0.0), 0.0)
180 self.assertEqual(abs(3.14), 3.14)
181 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 # str
183 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000184 # bool
185 self.assertEqual(abs(True), 1)
186 self.assertEqual(abs(False), 0)
187 # other
188 self.assertRaises(TypeError, abs)
189 self.assertRaises(TypeError, abs, None)
190 class AbsClass(object):
191 def __abs__(self):
192 return -5
193 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000194
Raymond Hettinger96229b12005-03-11 06:49:40 +0000195 def test_all(self):
196 self.assertEqual(all([2, 4, 6]), True)
197 self.assertEqual(all([2, None, 6]), False)
198 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
199 self.assertRaises(RuntimeError, all, TestFailingIter())
200 self.assertRaises(TypeError, all, 10) # Non-iterable
201 self.assertRaises(TypeError, all) # No args
202 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
203 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200204 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000205 S = [50, 60]
206 self.assertEqual(all(x > 42 for x in S), True)
207 S = [50, 40, 60]
208 self.assertEqual(all(x > 42 for x in S), False)
209
210 def test_any(self):
211 self.assertEqual(any([None, None, None]), False)
212 self.assertEqual(any([None, 4, None]), True)
213 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500214 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000215 self.assertRaises(TypeError, any, 10) # Non-iterable
216 self.assertRaises(TypeError, any) # No args
217 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
218 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200219 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000220 S = [40, 60, 30]
221 self.assertEqual(any(x > 42 for x in S), True)
222 S = [10, 20, 30]
223 self.assertEqual(any(x > 42 for x in S), False)
224
Georg Brandl559e5d72008-06-11 18:37:52 +0000225 def test_ascii(self):
226 self.assertEqual(ascii(''), '\'\'')
227 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000228 self.assertEqual(ascii(()), '()')
229 self.assertEqual(ascii([]), '[]')
230 self.assertEqual(ascii({}), '{}')
231 a = []
232 a.append(a)
233 self.assertEqual(ascii(a), '[[...]]')
234 a = {}
235 a[0] = a
236 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000237 # Advanced checks for unicode strings
238 def _check_uni(s):
239 self.assertEqual(ascii(s), repr(s))
240 _check_uni("'")
241 _check_uni('"')
242 _check_uni('"\'')
243 _check_uni('\0')
244 _check_uni('\r\n\t .')
245 # Unprintable non-ASCII characters
246 _check_uni('\x85')
247 _check_uni('\u1fff')
248 _check_uni('\U00012fff')
249 # Lone surrogates
250 _check_uni('\ud800')
251 _check_uni('\udfff')
252 # Issue #9804: surrogates should be joined even for printable
253 # wide characters (UCS-2 builds).
254 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
255 # All together
256 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
257 self.assertEqual(ascii(s),
258 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000259
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000261 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000262 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000263 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000264
Walter Dörwald919497e2003-01-19 16:23:59 +0000265 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000266 self.assertTrue(callable(len))
267 self.assertFalse(callable("a"))
268 self.assertTrue(callable(callable))
269 self.assertTrue(callable(lambda x, y: x + y))
270 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000271 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000272 self.assertTrue(callable(f))
273
274 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000276 self.assertTrue(callable(C1))
277 c = C1()
278 self.assertTrue(callable(c.meth))
279 self.assertFalse(callable(c))
280
281 # __call__ is looked up on the class, not the instance
282 c.__call__ = None
283 self.assertFalse(callable(c))
284 c.__call__ = lambda self: 0
285 self.assertFalse(callable(c))
286 del c.__call__
287 self.assertFalse(callable(c))
288
289 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000290 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000291 c2 = C2()
292 self.assertTrue(callable(c2))
293 c2.__call__ = None
294 self.assertTrue(callable(c2))
295 class C3(C2): pass
296 c3 = C3()
297 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000298
299 def test_chr(self):
300 self.assertEqual(chr(32), ' ')
301 self.assertEqual(chr(65), 'A')
302 self.assertEqual(chr(97), 'a')
303 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000304 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000305 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300306 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000307 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000308 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
309 self.assertEqual(chr(0x00010000), "\U00010000")
310 self.assertEqual(chr(0x00010001), "\U00010001")
311 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
312 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
313 self.assertEqual(chr(0x00100000), "\U00100000")
314 self.assertEqual(chr(0x00100001), "\U00100001")
315 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
316 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
317 self.assertRaises(ValueError, chr, -1)
318 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000319 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000320
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000321 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000322 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000323
Walter Dörwald919497e2003-01-19 16:23:59 +0000324 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000325 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000326 bom = b'\xef\xbb\xbf'
327 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300329 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
330 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000331 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300335 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
337 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000338 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300339 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000340 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000341
Georg Brandl8334fd92010-12-04 10:26:46 +0000342 # test the optimize argument
343
344 codestr = '''def f():
345 """doc"""
diana543386b2017-10-03 10:46:56 -0600346 debug_enabled = False
347 if __debug__:
348 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000349 try:
350 assert False
351 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200352 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000353 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200354 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000355 '''
356 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200357 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
358 (0, True, 'doc', True, True),
359 (1, False, 'doc', False, False),
360 (2, False, None, False, False)]
361 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000362 # test both direct compilation and compilation via AST
363 codeobjs = []
364 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
365 tree = ast.parse(codestr)
366 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
367 for code in codeobjs:
368 ns = {}
369 exec(code, ns)
370 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200371 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000372
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700373 def test_compile_top_level_await(self):
374 """Test whether code some top level await can be compiled.
375
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400376 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
377 set, and make sure the generated code object has the CO_COROUTINE flag
378 set in order to execute it with `await eval(.....)` instead of exec,
379 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700380 """
381
382 # helper function just to check we can run top=level async-for
383 async def arange(n):
384 for i in range(n):
385 yield i
386
387 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400388 code_samples = [
389 '''a = await asyncio.sleep(0, result=1)''',
390 '''async for i in arange(1):
391 a = 1''',
392 '''async with asyncio.Lock() as l:
393 a = 1'''
394 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700395 policy = maybe_get_event_loop_policy()
396 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400397 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700398 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 with self.assertRaises(
400 SyntaxError, msg=f"source={source} mode={mode}"):
401 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402
403 co = compile(source,
404 '?',
405 mode,
406 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
407
408 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400409 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700410
411 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 async_f = FunctionType(co, globals_)
414 asyncio.run(async_f())
415 self.assertEqual(globals_['a'], 1)
416
417 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400418 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700419 asyncio.run(eval(co, globals_))
420 self.assertEqual(globals_['a'], 1)
421 finally:
422 asyncio.set_event_loop_policy(policy)
423
424 def test_compile_async_generator(self):
425 """
426 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400427 make sure AsyncGenerators are still properly not marked with the
428 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700429 """
430 code = dedent("""async def ticker():
431 for i in range(10):
432 yield i
433 await asyncio.sleep(0)""")
434
435 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
436 glob = {}
437 exec(co, glob)
438 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
439
Walter Dörwald919497e2003-01-19 16:23:59 +0000440 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000441 sys.spam = 1
442 delattr(sys, 'spam')
443 self.assertRaises(TypeError, delattr)
444
445 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000446 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000447 self.assertRaises(TypeError, dir, 42, 42)
448
Georg Brandle32b4222007-03-10 22:13:27 +0000449 # dir() - local scope
450 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000451 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000452
453 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000454 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000455
456 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000457 class Foo(types.ModuleType):
458 __dict__ = 8
459 f = Foo("foo")
460 self.assertRaises(TypeError, dir, f)
461
462 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000463 self.assertIn("strip", dir(str))
464 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000465
466 # dir(obj)
467 class Foo(object):
468 def __init__(self):
469 self.x = 7
470 self.y = 8
471 self.z = 9
472 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000473 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000474
475 # dir(obj_no__dict__)
476 class Foo(object):
477 __slots__ = []
478 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000479 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000480
481 # dir(obj_no__class__with__dict__)
482 # (an ugly trick to cause getattr(f, "__class__") to fail)
483 class Foo(object):
484 __slots__ = ["__class__", "__dict__"]
485 def __init__(self):
486 self.bar = "wow"
487 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000488 self.assertNotIn("__repr__", dir(f))
489 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000490
491 # dir(obj_using __dir__)
492 class Foo(object):
493 def __dir__(self):
494 return ["kan", "ga", "roo"]
495 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000496 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000497
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500498 # dir(obj__dir__tuple)
499 class Foo(object):
500 def __dir__(self):
501 return ("b", "c", "a")
502 res = dir(Foo())
503 self.assertIsInstance(res, list)
504 self.assertTrue(res == ["a", "b", "c"])
505
506 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000507 class Foo(object):
508 def __dir__(self):
509 return 7
510 f = Foo()
511 self.assertRaises(TypeError, dir, f)
512
Collin Winter3eed7652007-08-14 17:53:54 +0000513 # dir(traceback)
514 try:
515 raise IndexError
516 except:
517 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
518
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500519 # test that object has a __dir__()
520 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000521
Walter Dörwald919497e2003-01-19 16:23:59 +0000522 def test_divmod(self):
523 self.assertEqual(divmod(12, 7), (1, 5))
524 self.assertEqual(divmod(-12, 7), (-2, 2))
525 self.assertEqual(divmod(12, -7), (-2, -2))
526 self.assertEqual(divmod(-12, -7), (1, -5))
527
Mark Dickinson5c2db372009-12-05 20:28:34 +0000528 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000529
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000530 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
531 (-3.25, 1.0, (-4.0, 0.75)),
532 (3.25, -1.0, (-4.0, -0.75)),
533 (-3.25, -1.0, (3.0, -0.25))]:
534 result = divmod(num, denom)
535 self.assertAlmostEqual(result[0], exp_result[0])
536 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000537
538 self.assertRaises(TypeError, divmod)
539
540 def test_eval(self):
541 self.assertEqual(eval('1+1'), 2)
542 self.assertEqual(eval(' 1+1\n'), 2)
543 globals = {'a': 1, 'b': 2}
544 locals = {'b': 200, 'c': 300}
545 self.assertEqual(eval('a', globals) , 1)
546 self.assertEqual(eval('a', globals, locals), 1)
547 self.assertEqual(eval('b', globals, locals), 200)
548 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000549 globals = {'a': 1, 'b': 2}
550 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000551 bom = b'\xef\xbb\xbf'
552 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000553 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000554 self.assertRaises(TypeError, eval)
555 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000556 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000557
Benjamin Peterson92722792012-12-15 12:51:05 -0500558 class X:
559 def __getitem__(self, key):
560 raise ValueError
561 self.assertRaises(ValueError, eval, "foo", {}, X())
562
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000563 def test_general_eval(self):
564 # Tests that general mappings can be used for the locals argument
565
566 class M:
567 "Test mapping interface versus possible calls from eval()."
568 def __getitem__(self, key):
569 if key == 'a':
570 return 12
571 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000572 def keys(self):
573 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000574
575 m = M()
576 g = globals()
577 self.assertEqual(eval('a', g, m), 12)
578 self.assertRaises(NameError, eval, 'b', g, m)
579 self.assertEqual(eval('dir()', g, m), list('xyz'))
580 self.assertEqual(eval('globals()', g, m), g)
581 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000582 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000583 class A:
584 "Non-mapping"
585 pass
586 m = A()
587 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000588
589 # Verify that dict subclasses work as well
590 class D(dict):
591 def __getitem__(self, key):
592 if key == 'a':
593 return 12
594 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000595 def keys(self):
596 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000597
598 d = D()
599 self.assertEqual(eval('a', g, d), 12)
600 self.assertRaises(NameError, eval, 'b', g, d)
601 self.assertEqual(eval('dir()', g, d), list('xyz'))
602 self.assertEqual(eval('globals()', g, d), g)
603 self.assertEqual(eval('locals()', g, d), d)
604
605 # Verify locals stores (used by list comps)
606 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000607 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000608
609 class SpreadSheet:
610 "Sample application showing nested, calculated lookups."
611 _cells = {}
612 def __setitem__(self, key, formula):
613 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000614 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000615 return eval(self._cells[key], globals(), self)
616
617 ss = SpreadSheet()
618 ss['a1'] = '5'
619 ss['a2'] = 'a1*6'
620 ss['a3'] = 'a2*7'
621 self.assertEqual(ss['a3'], 210)
622
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000623 # Verify that dir() catches a non-list returned by eval
624 # SF bug #1004669
625 class C:
626 def __getitem__(self, item):
627 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000628 def keys(self):
629 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000630 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
631
Georg Brandl7cae87c2006-09-06 06:51:57 +0000632 def test_exec(self):
633 g = {}
634 exec('z = 1', g)
635 if '__builtins__' in g:
636 del g['__builtins__']
637 self.assertEqual(g, {'z': 1})
638
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000639 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000640 if '__builtins__' in g:
641 del g['__builtins__']
642 self.assertEqual(g, {'z': 2})
643 g = {}
644 l = {}
645
Brett Cannon77628992010-03-20 20:59:33 +0000646 with check_warnings():
647 warnings.filterwarnings("ignore", "global statement",
648 module="<string>")
649 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000650 if '__builtins__' in g:
651 del g['__builtins__']
652 if '__builtins__' in l:
653 del l['__builtins__']
654 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
655
Victor Stinnerb0b22422012-04-19 00:57:45 +0200656 def test_exec_globals(self):
657 code = compile("print('Hello World!')", "", "exec")
658 # no builtin function
659 self.assertRaisesRegex(NameError, "name 'print' is not defined",
660 exec, code, {'__builtins__': {}})
661 # __builtins__ must be a mapping type
662 self.assertRaises(TypeError,
663 exec, code, {'__builtins__': 123})
664
665 # no __build_class__ function
666 code = compile("class A: pass", "", "exec")
667 self.assertRaisesRegex(NameError, "__build_class__ not found",
668 exec, code, {'__builtins__': {}})
669
670 class frozendict_error(Exception):
671 pass
672
673 class frozendict(dict):
674 def __setitem__(self, key, value):
675 raise frozendict_error("frozendict is readonly")
676
677 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400678 if isinstance(__builtins__, types.ModuleType):
679 frozen_builtins = frozendict(__builtins__.__dict__)
680 else:
681 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200682 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
683 self.assertRaises(frozendict_error,
684 exec, code, {'__builtins__': frozen_builtins})
685
686 # read-only globals
687 namespace = frozendict({})
688 code = compile("x=1", "test", "exec")
689 self.assertRaises(frozendict_error,
690 exec, code, namespace)
691
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000692 def test_exec_redirected(self):
693 savestdout = sys.stdout
694 sys.stdout = None # Whatever that cannot flush()
695 try:
696 # Used to raise SystemError('error return without exception set')
697 exec('a')
698 except NameError:
699 pass
700 finally:
701 sys.stdout = savestdout
702
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000704 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
705 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
706 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
707 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
708 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000709 def identity(item):
710 return 1
711 filter(identity, Squares(5))
712 self.assertRaises(TypeError, filter)
713 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000714 def __getitem__(self, index):
715 if index<4:
716 return 42
717 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000718 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000719 def badfunc():
720 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000721 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000722
Walter Dörwaldbf517072003-01-27 15:57:14 +0000723 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000724 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
725 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
726 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000727
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000728 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200729 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
730 f1 = filter(filter_char, "abcdeabcde")
731 f2 = filter(filter_char, "abcdeabcde")
732 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000733
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000735 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000736 self.assertRaises(TypeError, getattr, sys, 1)
737 self.assertRaises(TypeError, getattr, sys, 1, "foo")
738 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000739 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000740 # unicode surrogates are not encodable to the default encoding (utf8)
741 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000742
743 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000744 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000745 self.assertRaises(TypeError, hasattr, sys, 1)
746 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000747 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000748
Benjamin Peterson17689992010-08-24 03:26:23 +0000749 # Check that hasattr propagates all exceptions outside of
750 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000751 class A:
752 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000753 raise SystemExit
754 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000755 class B:
756 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000757 raise ValueError
758 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000759
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 def test_hash(self):
761 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000762 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000763 self.assertEqual(hash(1), hash(1.0))
764 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000765 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000766 hash((0,1,2,3))
767 def f(): pass
768 self.assertRaises(TypeError, hash, [])
769 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000770 # Bug 1536021: Allow hash to return long objects
771 class X:
772 def __hash__(self):
773 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000774 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000775 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000776 def __hash__(self):
777 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000778 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000779
780 def test_hex(self):
781 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000782 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000783 self.assertRaises(TypeError, hex, {})
784
785 def test_id(self):
786 id(None)
787 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000788 id(1.0)
789 id('spam')
790 id((0,1,2,3))
791 id([0,1,2,3])
792 id({'spam': 1, 'eggs': 2, 'ham': 3})
793
Guido van Rossuma88a0332007-02-26 16:59:55 +0000794 # Test input() later, alphabetized as if it were raw_input
795
Walter Dörwald919497e2003-01-19 16:23:59 +0000796 def test_iter(self):
797 self.assertRaises(TypeError, iter)
798 self.assertRaises(TypeError, iter, 42, 42)
799 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000800 for l in lists:
801 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000802 self.assertEqual(next(i), '1')
803 self.assertEqual(next(i), '2')
804 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000805
806 def test_isinstance(self):
807 class C:
808 pass
809 class D(C):
810 pass
811 class E:
812 pass
813 c = C()
814 d = D()
815 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000816 self.assertTrue(isinstance(c, C))
817 self.assertTrue(isinstance(d, C))
818 self.assertTrue(not isinstance(e, C))
819 self.assertTrue(not isinstance(c, D))
820 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 self.assertRaises(TypeError, isinstance, E, 'foo')
822 self.assertRaises(TypeError, isinstance)
823
824 def test_issubclass(self):
825 class C:
826 pass
827 class D(C):
828 pass
829 class E:
830 pass
831 c = C()
832 d = D()
833 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000834 self.assertTrue(issubclass(D, C))
835 self.assertTrue(issubclass(C, C))
836 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000837 self.assertRaises(TypeError, issubclass, 'foo', E)
838 self.assertRaises(TypeError, issubclass, E, 'foo')
839 self.assertRaises(TypeError, issubclass)
840
841 def test_len(self):
842 self.assertEqual(len('123'), 3)
843 self.assertEqual(len(()), 0)
844 self.assertEqual(len((1, 2, 3, 4)), 4)
845 self.assertEqual(len([1, 2, 3, 4]), 4)
846 self.assertEqual(len({}), 0)
847 self.assertEqual(len({'a':1, 'b': 2}), 2)
848 class BadSeq:
849 def __len__(self):
850 raise ValueError
851 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000852 class InvalidLen:
853 def __len__(self):
854 return None
855 self.assertRaises(TypeError, len, InvalidLen())
856 class FloatLen:
857 def __len__(self):
858 return 4.5
859 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300860 class NegativeLen:
861 def __len__(self):
862 return -10
863 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000864 class HugeLen:
865 def __len__(self):
866 return sys.maxsize + 1
867 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300868 class HugeNegativeLen:
869 def __len__(self):
870 return -sys.maxsize-10
871 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000872 class NoLenMethod(object): pass
873 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000874
Walter Dörwald919497e2003-01-19 16:23:59 +0000875 def test_map(self):
876 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000877 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000878 [1, 4, 9]
879 )
880 try:
881 from math import sqrt
882 except ImportError:
883 def sqrt(x):
884 return pow(x, 0.5)
885 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000886 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000887 [[4.0, 2.0], [9.0, 3.0]]
888 )
889 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000890 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000891 [10, 4, 6]
892 )
893
894 def plus(*v):
895 accu = 0
896 for i in v: accu = accu + i
897 return accu
898 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000899 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000900 [1, 3, 7]
901 )
902 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000903 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000904 [1+4, 3+9, 7+2]
905 )
906 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000907 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000908 [1+4+1, 3+9+1, 7+2+0]
909 )
910 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000911 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000912 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
913 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000914 def Max(a, b):
915 if a is None:
916 return b
917 if b is None:
918 return a
919 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000920 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000921 list(map(Max, Squares(3), Squares(2))),
922 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000923 )
924 self.assertRaises(TypeError, map)
925 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000926 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000927 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000928 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000929 yield None
930 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000931 def badfunc(x):
932 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000933 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000934
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000935 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200936 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
937 m1 = map(map_char, "Is this the real life?")
938 m2 = map(map_char, "Is this the real life?")
939 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000940
Walter Dörwald919497e2003-01-19 16:23:59 +0000941 def test_max(self):
942 self.assertEqual(max('123123'), '3')
943 self.assertEqual(max(1, 2, 3), 3)
944 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
945 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
946
Guido van Rossume2a383d2007-01-15 16:59:06 +0000947 self.assertEqual(max(1, 2, 3.0), 3.0)
948 self.assertEqual(max(1, 2.0, 3), 3)
949 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000950
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700951 self.assertRaises(TypeError, max)
952 self.assertRaises(TypeError, max, 42)
953 self.assertRaises(ValueError, max, ())
954 class BadSeq:
955 def __getitem__(self, index):
956 raise ValueError
957 self.assertRaises(ValueError, max, BadSeq())
958
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000959 for stmt in (
960 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700961 "max(default=None)",
962 "max(1, 2, default=None)", # require container for default
963 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000964 "max(1, key=int)", # single arg not iterable
965 "max(1, 2, keystone=int)", # wrong keyword
966 "max(1, 2, key=int, abc=int)", # two many keywords
967 "max(1, 2, key=1)", # keyfunc is not callable
968 ):
Tim Peters7f061872004-12-07 21:17:46 +0000969 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000970 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000971 except TypeError:
972 pass
973 else:
974 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000975
976 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
977 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
978 self.assertEqual(max(1, 2, key=neg), 1) # two elems
979
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700980 self.assertEqual(max((), default=None), None) # zero elem iterable
981 self.assertEqual(max((1,), default=None), 1) # one elem iterable
982 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
983
984 self.assertEqual(max((), default=1, key=neg), 1)
985 self.assertEqual(max((1, 2), default=3, key=neg), 1)
986
Alexander Marshalove22072f2018-07-24 10:58:21 +0700987 self.assertEqual(max((1, 2), key=None), 2)
988
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000989 data = [random.randrange(200) for i in range(100)]
990 keys = dict((elem, random.randrange(50)) for elem in data)
991 f = keys.__getitem__
992 self.assertEqual(max(data, key=f),
993 sorted(reversed(data), key=f)[-1])
994
Walter Dörwald919497e2003-01-19 16:23:59 +0000995 def test_min(self):
996 self.assertEqual(min('123123'), '1')
997 self.assertEqual(min(1, 2, 3), 1)
998 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
999 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1000
Guido van Rossume2a383d2007-01-15 16:59:06 +00001001 self.assertEqual(min(1, 2, 3.0), 1)
1002 self.assertEqual(min(1, 2.0, 3), 1)
1003 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001004
1005 self.assertRaises(TypeError, min)
1006 self.assertRaises(TypeError, min, 42)
1007 self.assertRaises(ValueError, min, ())
1008 class BadSeq:
1009 def __getitem__(self, index):
1010 raise ValueError
1011 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001012
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001013 for stmt in (
1014 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001015 "min(default=None)",
1016 "min(1, 2, default=None)", # require container for default
1017 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001018 "min(1, key=int)", # single arg not iterable
1019 "min(1, 2, keystone=int)", # wrong keyword
1020 "min(1, 2, key=int, abc=int)", # two many keywords
1021 "min(1, 2, key=1)", # keyfunc is not callable
1022 ):
Tim Peters7f061872004-12-07 21:17:46 +00001023 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001024 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001025 except TypeError:
1026 pass
1027 else:
1028 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001029
1030 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1031 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1032 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1033
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001034 self.assertEqual(min((), default=None), None) # zero elem iterable
1035 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1036 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1037
1038 self.assertEqual(min((), default=1, key=neg), 1)
1039 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1040
Alexander Marshalove22072f2018-07-24 10:58:21 +07001041 self.assertEqual(min((1, 2), key=None), 1)
1042
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001043 data = [random.randrange(200) for i in range(100)]
1044 keys = dict((elem, random.randrange(50)) for elem in data)
1045 f = keys.__getitem__
1046 self.assertEqual(min(data, key=f),
1047 sorted(data, key=f)[0])
1048
Georg Brandla18af4e2007-04-21 15:47:16 +00001049 def test_next(self):
1050 it = iter(range(2))
1051 self.assertEqual(next(it), 0)
1052 self.assertEqual(next(it), 1)
1053 self.assertRaises(StopIteration, next, it)
1054 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001055 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001056
1057 class Iter(object):
1058 def __iter__(self):
1059 return self
1060 def __next__(self):
1061 raise StopIteration
1062
1063 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001064 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001065 self.assertRaises(StopIteration, next, it)
1066
1067 def gen():
1068 yield 1
1069 return
1070
1071 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001072 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001073 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001074 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001077 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001078 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 self.assertRaises(TypeError, oct, ())
1080
1081 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001082 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001083 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001084 self.addCleanup(unlink, TESTFN)
1085 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001086 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001087 fp.write('The quick brown fox jumps over the lazy dog')
1088 fp.write('.\n')
1089 fp.write('Dear John\n')
1090 fp.write('XXX'*100)
1091 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001092
1093 def test_open(self):
1094 self.write_testfile()
1095 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001096 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001097 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001098 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1099 self.assertEqual(fp.readline(4), 'Dear')
1100 self.assertEqual(fp.readline(100), ' John\n')
1101 self.assertEqual(fp.read(300), 'XXX'*100)
1102 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001103
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001104 # embedded null bytes and characters
1105 self.assertRaises(ValueError, open, 'a\x00b')
1106 self.assertRaises(ValueError, open, b'a\x00b')
1107
Victor Stinner91106cd2017-12-13 12:29:09 +01001108 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001109 def test_open_default_encoding(self):
1110 old_environ = dict(os.environ)
1111 try:
1112 # try to get a user preferred encoding different than the current
1113 # locale encoding to check that open() uses the current locale
1114 # encoding and not the user preferred encoding
1115 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1116 if key in os.environ:
1117 del os.environ[key]
1118
1119 self.write_testfile()
1120 current_locale_encoding = locale.getpreferredencoding(False)
1121 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001122 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001123 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001124 finally:
1125 os.environ.clear()
1126 os.environ.update(old_environ)
1127
Victor Stinnerdaf45552013-08-28 00:53:59 +02001128 def test_open_non_inheritable(self):
1129 fileobj = open(__file__)
1130 with fileobj:
1131 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1132
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def test_ord(self):
1134 self.assertEqual(ord(' '), 32)
1135 self.assertEqual(ord('A'), 65)
1136 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001137 self.assertEqual(ord('\x80'), 128)
1138 self.assertEqual(ord('\xff'), 255)
1139
1140 self.assertEqual(ord(b' '), 32)
1141 self.assertEqual(ord(b'A'), 65)
1142 self.assertEqual(ord(b'a'), 97)
1143 self.assertEqual(ord(b'\x80'), 128)
1144 self.assertEqual(ord(b'\xff'), 255)
1145
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001146 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001147 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001148
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001149 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1150 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1151 self.assertEqual(ord("\U00010000"), 0x00010000)
1152 self.assertEqual(ord("\U00010001"), 0x00010001)
1153 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1154 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1155 self.assertEqual(ord("\U00100000"), 0x00100000)
1156 self.assertEqual(ord("\U00100001"), 0x00100001)
1157 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1158 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1159
Walter Dörwald919497e2003-01-19 16:23:59 +00001160 def test_pow(self):
1161 self.assertEqual(pow(0,0), 1)
1162 self.assertEqual(pow(0,1), 0)
1163 self.assertEqual(pow(1,0), 1)
1164 self.assertEqual(pow(1,1), 1)
1165
1166 self.assertEqual(pow(2,0), 1)
1167 self.assertEqual(pow(2,10), 1024)
1168 self.assertEqual(pow(2,20), 1024*1024)
1169 self.assertEqual(pow(2,30), 1024*1024*1024)
1170
1171 self.assertEqual(pow(-2,0), 1)
1172 self.assertEqual(pow(-2,1), -2)
1173 self.assertEqual(pow(-2,2), 4)
1174 self.assertEqual(pow(-2,3), -8)
1175
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 self.assertAlmostEqual(pow(0.,0), 1.)
1177 self.assertAlmostEqual(pow(0.,1), 0.)
1178 self.assertAlmostEqual(pow(1.,0), 1.)
1179 self.assertAlmostEqual(pow(1.,1), 1.)
1180
1181 self.assertAlmostEqual(pow(2.,0), 1.)
1182 self.assertAlmostEqual(pow(2.,10), 1024.)
1183 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1184 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1185
1186 self.assertAlmostEqual(pow(-2.,0), 1.)
1187 self.assertAlmostEqual(pow(-2.,1), -2.)
1188 self.assertAlmostEqual(pow(-2.,2), 4.)
1189 self.assertAlmostEqual(pow(-2.,3), -8.)
1190
Mark Dickinson5c2db372009-12-05 20:28:34 +00001191 for x in 2, 2.0:
1192 for y in 10, 10.0:
1193 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001194 if isinstance(x, float) or \
1195 isinstance(y, float) or \
1196 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001197 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001198 else:
1199 self.assertAlmostEqual(pow(x, y, z), 24.0)
1200
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001201 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1202 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1203
Mark Dickinsonc5299672019-06-02 10:24:06 +01001204 # See test_pow for additional tests for three-argument pow.
1205 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001206 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001207
1208 self.assertRaises(TypeError, pow)
1209
Ammar Askar87d6cd32019-09-21 00:28:49 -04001210 # Test passing in arguments as keywords.
1211 self.assertEqual(pow(0, exp=0), 1)
1212 self.assertEqual(pow(base=2, exp=4), 16)
1213 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1214 twopow = partial(pow, base=2)
1215 self.assertEqual(twopow(exp=5), 32)
1216 fifth_power = partial(pow, exp=5)
1217 self.assertEqual(fifth_power(2), 32)
1218 mod10 = partial(pow, mod=10)
1219 self.assertEqual(mod10(2, 6), 4)
1220 self.assertEqual(mod10(exp=6, base=2), 4)
1221
Guido van Rossuma88a0332007-02-26 16:59:55 +00001222 def test_input(self):
1223 self.write_testfile()
1224 fp = open(TESTFN, 'r')
1225 savestdin = sys.stdin
1226 savestdout = sys.stdout # Eats the echo
1227 try:
1228 sys.stdin = fp
1229 sys.stdout = BitBucket()
1230 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001231 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1232 self.assertEqual(input('testing\n'), 'Dear John')
1233
1234 # SF 1535165: don't segfault on closed stdin
1235 # sys.stdout must be a regular file for triggering
1236 sys.stdout = savestdout
1237 sys.stdin.close()
1238 self.assertRaises(ValueError, input)
1239
1240 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001241 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001242 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001243 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001244 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001245 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001246 self.assertRaises(EOFError, input)
1247
1248 del sys.stdout
1249 self.assertRaises(RuntimeError, input, 'prompt')
1250 del sys.stdin
1251 self.assertRaises(RuntimeError, input, 'prompt')
1252 finally:
1253 sys.stdin = savestdin
1254 sys.stdout = savestdout
1255 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001256
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001257 # test_int(): see test_int.py for tests of built-in function int().
1258
Walter Dörwald919497e2003-01-19 16:23:59 +00001259 def test_repr(self):
1260 self.assertEqual(repr(''), '\'\'')
1261 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 self.assertEqual(repr(()), '()')
1263 self.assertEqual(repr([]), '[]')
1264 self.assertEqual(repr({}), '{}')
1265 a = []
1266 a.append(a)
1267 self.assertEqual(repr(a), '[[...]]')
1268 a = {}
1269 a[0] = a
1270 self.assertEqual(repr(a), '{0: {...}}')
1271
1272 def test_round(self):
1273 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001274 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001275 self.assertEqual(round(1.0), 1.0)
1276 self.assertEqual(round(10.0), 10.0)
1277 self.assertEqual(round(1000000000.0), 1000000000.0)
1278 self.assertEqual(round(1e20), 1e20)
1279
1280 self.assertEqual(round(-1.0), -1.0)
1281 self.assertEqual(round(-10.0), -10.0)
1282 self.assertEqual(round(-1000000000.0), -1000000000.0)
1283 self.assertEqual(round(-1e20), -1e20)
1284
1285 self.assertEqual(round(0.1), 0.0)
1286 self.assertEqual(round(1.1), 1.0)
1287 self.assertEqual(round(10.1), 10.0)
1288 self.assertEqual(round(1000000000.1), 1000000000.0)
1289
1290 self.assertEqual(round(-1.1), -1.0)
1291 self.assertEqual(round(-10.1), -10.0)
1292 self.assertEqual(round(-1000000000.1), -1000000000.0)
1293
1294 self.assertEqual(round(0.9), 1.0)
1295 self.assertEqual(round(9.9), 10.0)
1296 self.assertEqual(round(999999999.9), 1000000000.0)
1297
1298 self.assertEqual(round(-0.9), -1.0)
1299 self.assertEqual(round(-9.9), -10.0)
1300 self.assertEqual(round(-999999999.9), -1000000000.0)
1301
1302 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001303 self.assertEqual(type(round(-8.0, -1)), float)
1304
1305 self.assertEqual(type(round(-8.0, 0)), float)
1306 self.assertEqual(type(round(-8.0, 1)), float)
1307
1308 # Check even / odd rounding behaviour
1309 self.assertEqual(round(5.5), 6)
1310 self.assertEqual(round(6.5), 6)
1311 self.assertEqual(round(-5.5), -6)
1312 self.assertEqual(round(-6.5), -6)
1313
1314 # Check behavior on ints
1315 self.assertEqual(round(0), 0)
1316 self.assertEqual(round(8), 8)
1317 self.assertEqual(round(-8), -8)
1318 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001319 self.assertEqual(type(round(-8, -1)), int)
1320 self.assertEqual(type(round(-8, 0)), int)
1321 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001322
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001323 # test new kwargs
1324 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1325
Walter Dörwald919497e2003-01-19 16:23:59 +00001326 self.assertRaises(TypeError, round)
1327
Alex Martelliae211f92007-08-22 23:21:33 +00001328 # test generic rounding delegation for reals
1329 class TestRound:
1330 def __round__(self):
1331 return 23
1332
1333 class TestNoRound:
1334 pass
1335
1336 self.assertEqual(round(TestRound()), 23)
1337
1338 self.assertRaises(TypeError, round, 1, 2, 3)
1339 self.assertRaises(TypeError, round, TestNoRound())
1340
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001341 t = TestNoRound()
1342 t.__round__ = lambda *args: args
1343 self.assertRaises(TypeError, round, t)
1344 self.assertRaises(TypeError, round, t, 0)
1345
Mark Dickinsonad731b92009-11-09 17:12:30 +00001346 # Some versions of glibc for alpha have a bug that affects
1347 # float -> integer rounding (floor, ceil, rint, round) for
1348 # values in the range [2**52, 2**53). See:
1349 #
1350 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1351 #
1352 # We skip this test on Linux/alpha if it would fail.
1353 linux_alpha = (platform.system().startswith('Linux') and
1354 platform.machine().startswith('alpha'))
1355 system_round_bug = round(5e15+1) != 5e15+1
1356 @unittest.skipIf(linux_alpha and system_round_bug,
1357 "test will fail; failure is probably due to a "
1358 "buggy system round function")
1359 def test_round_large(self):
1360 # Issue #1869: integral floats should remain unchanged
1361 self.assertEqual(round(5e15-1), 5e15-1)
1362 self.assertEqual(round(5e15), 5e15)
1363 self.assertEqual(round(5e15+1), 5e15+1)
1364 self.assertEqual(round(5e15+2), 5e15+2)
1365 self.assertEqual(round(5e15+3), 5e15+3)
1366
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001367 def test_bug_27936(self):
1368 # Verify that ndigits=None means the same as passing in no argument
1369 for x in [1234,
1370 1234.56,
1371 decimal.Decimal('1234.56'),
1372 fractions.Fraction(123456, 100)]:
1373 self.assertEqual(round(x, None), round(x))
1374 self.assertEqual(type(round(x, None)), type(round(x)))
1375
Walter Dörwald919497e2003-01-19 16:23:59 +00001376 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001377 setattr(sys, 'spam', 1)
1378 self.assertEqual(sys.spam, 1)
1379 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1380 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001381
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001382 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001383
Alex Martellia70b1912003-04-22 08:12:33 +00001384 def test_sum(self):
1385 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001386 self.assertEqual(sum(list(range(2,8))), 27)
1387 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001388 self.assertEqual(sum(Squares(10)), 285)
1389 self.assertEqual(sum(iter(Squares(10))), 285)
1390 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1391
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001392 self.assertEqual(sum(range(10), 1000), 1045)
1393 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001394 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1395 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1396
1397 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1398 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1399 2**31+2)
1400 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1401 2**63+2)
1402 self.assertIs(sum([], False), False)
1403
1404 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1405 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1406 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1407 self.assertEqual(sum([0.5, 1]), 1.5)
1408 self.assertEqual(sum([1, 0.5]), 1.5)
1409 self.assertEqual(repr(sum([-0.0])), '0.0')
1410 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1411 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001412
Alex Martellia70b1912003-04-22 08:12:33 +00001413 self.assertRaises(TypeError, sum)
1414 self.assertRaises(TypeError, sum, 42)
1415 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1416 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001417 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1418 values = [bytearray(b'a'), bytearray(b'b')]
1419 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001420 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1421 self.assertRaises(TypeError, sum, [{2:3}])
1422 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001423 self.assertRaises(TypeError, sum, [], '')
1424 self.assertRaises(TypeError, sum, [], b'')
1425 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001426
1427 class BadSeq:
1428 def __getitem__(self, index):
1429 raise ValueError
1430 self.assertRaises(ValueError, sum, BadSeq())
1431
Mark Dickinson3a22b472009-10-17 21:48:16 +00001432 empty = []
1433 sum(([x] for x in range(10)), empty)
1434 self.assertEqual(empty, [])
1435
Walter Dörwald919497e2003-01-19 16:23:59 +00001436 def test_type(self):
1437 self.assertEqual(type(''), type('123'))
1438 self.assertNotEqual(type(''), type(()))
1439
Guido van Rossumfee7b932005-01-16 00:21:28 +00001440 # We don't want self in vars(), so these are static methods
1441
1442 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001443 def get_vars_f0():
1444 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001445
Guido van Rossumfee7b932005-01-16 00:21:28 +00001446 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001447 def get_vars_f2():
1448 BuiltinTest.get_vars_f0()
1449 a = 1
1450 b = 2
1451 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001452
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001453 class C_get_vars(object):
1454 def getDict(self):
1455 return {'a':2}
1456 __dict__ = property(fget=getDict)
1457
Walter Dörwald919497e2003-01-19 16:23:59 +00001458 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001459 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001460 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001461 self.assertEqual(self.get_vars_f0(), {})
1462 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1463 self.assertRaises(TypeError, vars, 42, 42)
1464 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001465 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001466
1467 def test_zip(self):
1468 a = (1, 2, 3)
1469 b = (4, 5, 6)
1470 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001471 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001472 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001473 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001474 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001475 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001476 class I:
1477 def __getitem__(self, i):
1478 if i < 0 or i > 2: raise IndexError
1479 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001480 self.assertEqual(list(zip(a, I())), t)
1481 self.assertEqual(list(zip()), [])
1482 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001483 self.assertRaises(TypeError, zip, None)
1484 class G:
1485 pass
1486 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001487 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001488
1489 # Make sure zip doesn't try to allocate a billion elements for the
1490 # result list when one of its arguments doesn't say how long it is.
1491 # A MemoryError is the most likely failure mode.
1492 class SequenceWithoutALength:
1493 def __getitem__(self, i):
1494 if i == 5:
1495 raise IndexError
1496 else:
1497 return i
1498 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001499 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001500 list(enumerate(range(5)))
1501 )
1502
1503 class BadSeq:
1504 def __getitem__(self, i):
1505 if i == 5:
1506 raise ValueError
1507 else:
1508 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001509 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001510
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001511 def test_zip_pickle(self):
1512 a = (1, 2, 3)
1513 b = (4, 5, 6)
1514 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001515 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1516 z1 = zip(a, b)
1517 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001518
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001519 def test_zip_bad_iterable(self):
1520 exception = TypeError()
1521
1522 class BadIterable:
1523 def __iter__(self):
1524 raise exception
1525
1526 with self.assertRaises(TypeError) as cm:
1527 zip(BadIterable())
1528
1529 self.assertIs(cm.exception, exception)
1530
Eric Smithe4d63172010-09-13 20:48:43 +00001531 def test_format(self):
1532 # Test the basic machinery of the format() builtin. Don't test
1533 # the specifics of the various formatters
1534 self.assertEqual(format(3, ''), '3')
1535
1536 # Returns some classes to use for various tests. There's
1537 # an old-style version, and a new-style version
1538 def classes_new():
1539 class A(object):
1540 def __init__(self, x):
1541 self.x = x
1542 def __format__(self, format_spec):
1543 return str(self.x) + format_spec
1544 class DerivedFromA(A):
1545 pass
1546
1547 class Simple(object): pass
1548 class DerivedFromSimple(Simple):
1549 def __init__(self, x):
1550 self.x = x
1551 def __format__(self, format_spec):
1552 return str(self.x) + format_spec
1553 class DerivedFromSimple2(DerivedFromSimple): pass
1554 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1555
1556 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1557 self.assertEqual(format(A(3), 'spec'), '3spec')
1558 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1559 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1560 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1561 '10abcdef')
1562
1563 class_test(*classes_new())
1564
1565 def empty_format_spec(value):
1566 # test that:
1567 # format(x, '') == str(x)
1568 # format(x) == str(x)
1569 self.assertEqual(format(value, ""), str(value))
1570 self.assertEqual(format(value), str(value))
1571
1572 # for builtin types, format(x, "") == str(x)
1573 empty_format_spec(17**13)
1574 empty_format_spec(1.0)
1575 empty_format_spec(3.1415e104)
1576 empty_format_spec(-3.1415e104)
1577 empty_format_spec(3.1415e-104)
1578 empty_format_spec(-3.1415e-104)
1579 empty_format_spec(object)
1580 empty_format_spec(None)
1581
1582 # TypeError because self.__format__ returns the wrong type
1583 class BadFormatResult:
1584 def __format__(self, format_spec):
1585 return 1.0
1586 self.assertRaises(TypeError, format, BadFormatResult(), "")
1587
1588 # TypeError because format_spec is not unicode or str
1589 self.assertRaises(TypeError, format, object(), 4)
1590 self.assertRaises(TypeError, format, object(), object())
1591
1592 # tests for object.__format__ really belong elsewhere, but
1593 # there's no good place to put them
1594 x = object().__format__('')
1595 self.assertTrue(x.startswith('<object object at'))
1596
1597 # first argument to object.__format__ must be string
1598 self.assertRaises(TypeError, object().__format__, 3)
1599 self.assertRaises(TypeError, object().__format__, object())
1600 self.assertRaises(TypeError, object().__format__, None)
1601
1602 # --------------------------------------------------------------------
1603 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001604 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001605 class A:
1606 def __format__(self, fmt_str):
1607 return format('', fmt_str)
1608
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001609 self.assertEqual(format(A()), '')
1610 self.assertEqual(format(A(), ''), '')
1611 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001612
1613 class B:
1614 pass
1615
1616 class C(object):
1617 pass
1618
1619 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001620 obj = cls()
1621 self.assertEqual(format(obj), str(obj))
1622 self.assertEqual(format(obj, ''), str(obj))
1623 with self.assertRaisesRegex(TypeError,
1624 r'\b%s\b' % re.escape(cls.__name__)):
1625 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001626 # --------------------------------------------------------------------
1627
1628 # make sure we can take a subclass of str as a format spec
1629 class DerivedFromStr(str): pass
1630 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1631
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001632 def test_bin(self):
1633 self.assertEqual(bin(0), '0b0')
1634 self.assertEqual(bin(1), '0b1')
1635 self.assertEqual(bin(-1), '-0b1')
1636 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1637 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1638 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1639 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1640
Georg Brandl953152f2009-07-22 12:03:59 +00001641 def test_bytearray_translate(self):
1642 x = bytearray(b"abc")
1643 self.assertRaises(ValueError, x.translate, b"1", 1)
1644 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1645
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001646 def test_bytearray_extend_error(self):
1647 array = bytearray()
1648 bad_iter = map(int, "X")
1649 self.assertRaises(ValueError, array.extend, bad_iter)
1650
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001651 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001652 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001653 tp = type(const)
1654 self.assertIs(tp(), const)
1655 self.assertRaises(TypeError, tp, 1, 2)
1656 self.assertRaises(TypeError, tp, a=1, b=2)
1657
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001658
1659class TestBreakpoint(unittest.TestCase):
1660 def setUp(self):
1661 # These tests require a clean slate environment. For example, if the
1662 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1663 # will mess up these tests. Similarly for sys.breakpointhook.
1664 # Cleaning the slate here means you can't use breakpoint() to debug
1665 # these tests, but I think that's okay. Just use pdb.set_trace() if
1666 # you must.
1667 self.resources = ExitStack()
1668 self.addCleanup(self.resources.close)
1669 self.env = self.resources.enter_context(EnvironmentVarGuard())
1670 del self.env['PYTHONBREAKPOINT']
1671 self.resources.enter_context(
1672 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1673
1674 def test_breakpoint(self):
1675 with patch('pdb.set_trace') as mock:
1676 breakpoint()
1677 mock.assert_called_once()
1678
1679 def test_breakpoint_with_breakpointhook_set(self):
1680 my_breakpointhook = MagicMock()
1681 sys.breakpointhook = my_breakpointhook
1682 breakpoint()
1683 my_breakpointhook.assert_called_once_with()
1684
1685 def test_breakpoint_with_breakpointhook_reset(self):
1686 my_breakpointhook = MagicMock()
1687 sys.breakpointhook = my_breakpointhook
1688 breakpoint()
1689 my_breakpointhook.assert_called_once_with()
1690 # Reset the hook and it will not be called again.
1691 sys.breakpointhook = sys.__breakpointhook__
1692 with patch('pdb.set_trace') as mock:
1693 breakpoint()
1694 mock.assert_called_once_with()
1695 my_breakpointhook.assert_called_once_with()
1696
1697 def test_breakpoint_with_args_and_keywords(self):
1698 my_breakpointhook = MagicMock()
1699 sys.breakpointhook = my_breakpointhook
1700 breakpoint(1, 2, 3, four=4, five=5)
1701 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1702
1703 def test_breakpoint_with_passthru_error(self):
1704 def my_breakpointhook():
1705 pass
1706 sys.breakpointhook = my_breakpointhook
1707 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1708
1709 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1710 def test_envar_good_path_builtin(self):
1711 self.env['PYTHONBREAKPOINT'] = 'int'
1712 with patch('builtins.int') as mock:
1713 breakpoint('7')
1714 mock.assert_called_once_with('7')
1715
1716 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1717 def test_envar_good_path_other(self):
1718 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1719 with patch('sys.exit') as mock:
1720 breakpoint()
1721 mock.assert_called_once_with()
1722
1723 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1724 def test_envar_good_path_noop_0(self):
1725 self.env['PYTHONBREAKPOINT'] = '0'
1726 with patch('pdb.set_trace') as mock:
1727 breakpoint()
1728 mock.assert_not_called()
1729
1730 def test_envar_good_path_empty_string(self):
1731 # PYTHONBREAKPOINT='' is the same as it not being set.
1732 self.env['PYTHONBREAKPOINT'] = ''
1733 with patch('pdb.set_trace') as mock:
1734 breakpoint()
1735 mock.assert_called_once_with()
1736
1737 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1738 def test_envar_unimportable(self):
1739 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001740 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001741 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001742 'nosuchbuiltin',
1743 'nosuchmodule.nosuchcallable',
1744 ):
1745 with self.subTest(envar=envar):
1746 self.env['PYTHONBREAKPOINT'] = envar
1747 mock = self.resources.enter_context(patch('pdb.set_trace'))
1748 w = self.resources.enter_context(check_warnings(quiet=True))
1749 breakpoint()
1750 self.assertEqual(
1751 str(w.message),
1752 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1753 self.assertEqual(w.category, RuntimeWarning)
1754 mock.assert_not_called()
1755
1756 def test_envar_ignored_when_hook_is_set(self):
1757 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1758 with patch('sys.exit') as mock:
1759 sys.breakpointhook = int
1760 breakpoint()
1761 mock.assert_not_called()
1762
1763
Martin Panterc9a6ab52015-10-10 01:25:38 +00001764@unittest.skipUnless(pty, "the pty and signal modules must be available")
1765class PtyTests(unittest.TestCase):
1766 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1767 terminals in the test environment"""
1768
Martin Pantere44dba32015-10-10 05:27:15 +00001769 def run_child(self, child, terminal_input):
1770 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001771 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001772 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001773 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001774 os.close(r)
1775 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001776 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001777 raise
1778 if pid == 0:
1779 # Child
1780 try:
1781 # Make sure we don't get stuck if there's a problem
1782 signal.alarm(2)
1783 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001784 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001785 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001786 except:
1787 traceback.print_exc()
1788 finally:
1789 # We don't want to return to unittest...
1790 os._exit(0)
1791 # Parent
1792 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001793 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001794 # Get results from the pipe
1795 with open(r, "r") as rpipe:
1796 lines = []
1797 while True:
1798 line = rpipe.readline().strip()
1799 if line == "":
1800 # The other end was closed => the child exited
1801 break
1802 lines.append(line)
1803 # Check the result was got and corresponds to the user's terminal input
1804 if len(lines) != 2:
1805 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001806 # Beware of Linux raising EIO when the slave is closed
1807 child_output = bytearray()
1808 while True:
1809 try:
1810 chunk = os.read(fd, 3000)
1811 except OSError: # Assume EIO
1812 break
1813 if not chunk:
1814 break
1815 child_output.extend(chunk)
1816 os.close(fd)
1817 child_output = child_output.decode("ascii", "ignore")
1818 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1819 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001820 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001821
Victor Stinner3ca9f502017-08-09 23:08:22 +02001822 # Wait until the child process completes
1823 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001824
Martin Pantere44dba32015-10-10 05:27:15 +00001825 return lines
1826
1827 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1828 if not sys.stdin.isatty() or not sys.stdout.isatty():
1829 self.skipTest("stdin and stdout must be ttys")
1830 def child(wpipe):
1831 # Check the error handlers are accounted for
1832 if stdio_encoding:
1833 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1834 encoding=stdio_encoding,
1835 errors='surrogateescape')
1836 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1837 encoding=stdio_encoding,
1838 errors='replace')
1839 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1840 print(ascii(input(prompt)), file=wpipe)
1841 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001842 # Check we did exercise the GNU readline path
1843 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1844 if lines[0] != 'tty = True':
1845 self.skipTest("standard IO in should have been a tty")
1846 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1847 if stdio_encoding:
1848 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1849 else:
1850 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1851 self.assertEqual(input_result, expected)
1852
1853 def test_input_tty(self):
1854 # Test input() functionality when wired to a tty (the code path
1855 # is different and invokes GNU readline if available).
1856 self.check_input_tty("prompt", b"quux")
1857
1858 def test_input_tty_non_ascii(self):
1859 # Check stdin/stdout encoding is used when invoking GNU readline
1860 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1861
1862 def test_input_tty_non_ascii_unicode_errors(self):
1863 # Check stdin/stdout error handler is used when invoking GNU readline
1864 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1865
1866 def test_input_no_stdout_fileno(self):
1867 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1868 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001869 def child(wpipe):
1870 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1871 sys.stdout = io.StringIO() # Does not support fileno()
1872 input("prompt")
1873 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1874 lines = self.run_child(child, b"quux\r")
1875 expected = (
1876 "stdin.isatty(): True",
1877 "captured: 'prompt'",
1878 )
1879 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001880
Raymond Hettinger64958a12003-12-17 20:43:33 +00001881class TestSorted(unittest.TestCase):
1882
1883 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001884 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001885 copy = data[:]
1886 random.shuffle(copy)
1887 self.assertEqual(data, sorted(copy))
1888 self.assertNotEqual(data, copy)
1889
1890 data.reverse()
1891 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001892 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1893 self.assertNotEqual(data, copy)
1894 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001895 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001896 self.assertNotEqual(data, copy)
1897
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001898 def test_bad_arguments(self):
1899 # Issue #29327: The first argument is positional-only.
1900 sorted([])
1901 with self.assertRaises(TypeError):
1902 sorted(iterable=[])
1903 # Other arguments are keyword-only
1904 sorted([], key=None)
1905 with self.assertRaises(TypeError):
1906 sorted([], None)
1907
Raymond Hettinger64958a12003-12-17 20:43:33 +00001908 def test_inputtypes(self):
1909 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001910 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001911 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001912 self.assertEqual(sorted(s), sorted(T(s)))
1913
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001914 s = ''.join(set(s)) # unique letters only
1915 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001916 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001917 self.assertEqual(sorted(s), sorted(T(s)))
1918
1919 def test_baddecorator(self):
1920 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1921 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1922
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001923
1924class ShutdownTest(unittest.TestCase):
1925
1926 def test_cleanup(self):
1927 # Issue #19255: builtins are still available at shutdown
1928 code = """if 1:
1929 import builtins
1930 import sys
1931
1932 class C:
1933 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001934 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001935 # Check that builtins still exist
1936 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001937 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001938
1939 c = C()
1940 # Make this module survive until builtins and sys are cleaned
1941 builtins.here = sys.modules[__name__]
1942 sys.here = sys.modules[__name__]
1943 # Create a reference loop so that this module needs to go
1944 # through a GC phase.
1945 here = sys.modules[__name__]
1946 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001947 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1948 # otherwise the codec may be unloaded before C.__del__() is called, and
1949 # so print("before") fails because the codec cannot be used to encode
1950 # "before" to sys.stdout.encoding. For example, on Windows,
1951 # sys.stdout.encoding is the OEM code page and these code pages are
1952 # implemented in Python
1953 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001954 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001955 self.assertEqual(["before", "after"], out.decode().splitlines())
1956
1957
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001958class TestType(unittest.TestCase):
1959 def test_new_type(self):
1960 A = type('A', (), {})
1961 self.assertEqual(A.__name__, 'A')
1962 self.assertEqual(A.__qualname__, 'A')
1963 self.assertEqual(A.__module__, __name__)
1964 self.assertEqual(A.__bases__, (object,))
1965 self.assertIs(A.__base__, object)
1966 x = A()
1967 self.assertIs(type(x), A)
1968 self.assertIs(x.__class__, A)
1969
1970 class B:
1971 def ham(self):
1972 return 'ham%d' % self
1973 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1974 self.assertEqual(C.__name__, 'C')
1975 self.assertEqual(C.__qualname__, 'C')
1976 self.assertEqual(C.__module__, __name__)
1977 self.assertEqual(C.__bases__, (B, int))
1978 self.assertIs(C.__base__, int)
1979 self.assertIn('spam', C.__dict__)
1980 self.assertNotIn('ham', C.__dict__)
1981 x = C(42)
1982 self.assertEqual(x, 42)
1983 self.assertIs(type(x), C)
1984 self.assertIs(x.__class__, C)
1985 self.assertEqual(x.ham(), 'ham42')
1986 self.assertEqual(x.spam(), 'spam42')
1987 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1988
Nick Coghland78448e2016-07-30 16:26:03 +10001989 def test_type_nokwargs(self):
1990 with self.assertRaises(TypeError):
1991 type('a', (), {}, x=5)
1992 with self.assertRaises(TypeError):
1993 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001994
1995 def test_type_name(self):
1996 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1997 with self.subTest(name=name):
1998 A = type(name, (), {})
1999 self.assertEqual(A.__name__, name)
2000 self.assertEqual(A.__qualname__, name)
2001 self.assertEqual(A.__module__, __name__)
2002 with self.assertRaises(ValueError):
2003 type('A\x00B', (), {})
2004 with self.assertRaises(ValueError):
2005 type('A\udcdcB', (), {})
2006 with self.assertRaises(TypeError):
2007 type(b'A', (), {})
2008
2009 C = type('C', (), {})
2010 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2011 with self.subTest(name=name):
2012 C.__name__ = name
2013 self.assertEqual(C.__name__, name)
2014 self.assertEqual(C.__qualname__, 'C')
2015 self.assertEqual(C.__module__, __name__)
2016
2017 A = type('C', (), {})
2018 with self.assertRaises(ValueError):
2019 A.__name__ = 'A\x00B'
2020 self.assertEqual(A.__name__, 'C')
2021 with self.assertRaises(ValueError):
2022 A.__name__ = 'A\udcdcB'
2023 self.assertEqual(A.__name__, 'C')
2024 with self.assertRaises(TypeError):
2025 A.__name__ = b'A'
2026 self.assertEqual(A.__name__, 'C')
2027
2028 def test_type_qualname(self):
2029 A = type('A', (), {'__qualname__': 'B.C'})
2030 self.assertEqual(A.__name__, 'A')
2031 self.assertEqual(A.__qualname__, 'B.C')
2032 self.assertEqual(A.__module__, __name__)
2033 with self.assertRaises(TypeError):
2034 type('A', (), {'__qualname__': b'B'})
2035 self.assertEqual(A.__qualname__, 'B.C')
2036
2037 A.__qualname__ = 'D.E'
2038 self.assertEqual(A.__name__, 'A')
2039 self.assertEqual(A.__qualname__, 'D.E')
2040 with self.assertRaises(TypeError):
2041 A.__qualname__ = b'B'
2042 self.assertEqual(A.__qualname__, 'D.E')
2043
2044 def test_type_doc(self):
2045 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2046 A = type('A', (), {'__doc__': doc})
2047 self.assertEqual(A.__doc__, doc)
2048 with self.assertRaises(UnicodeEncodeError):
2049 type('A', (), {'__doc__': 'x\udcdcy'})
2050
2051 A = type('A', (), {})
2052 self.assertEqual(A.__doc__, None)
2053 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2054 A.__doc__ = doc
2055 self.assertEqual(A.__doc__, doc)
2056
2057 def test_bad_args(self):
2058 with self.assertRaises(TypeError):
2059 type()
2060 with self.assertRaises(TypeError):
2061 type('A', ())
2062 with self.assertRaises(TypeError):
2063 type('A', (), {}, ())
2064 with self.assertRaises(TypeError):
2065 type('A', (), dict={})
2066 with self.assertRaises(TypeError):
2067 type('A', [], {})
2068 with self.assertRaises(TypeError):
2069 type('A', (), types.MappingProxyType({}))
2070 with self.assertRaises(TypeError):
2071 type('A', (None,), {})
2072 with self.assertRaises(TypeError):
2073 type('A', (bool,), {})
2074 with self.assertRaises(TypeError):
2075 type('A', (int, str), {})
2076
2077 def test_bad_slots(self):
2078 with self.assertRaises(TypeError):
2079 type('A', (), {'__slots__': b'x'})
2080 with self.assertRaises(TypeError):
2081 type('A', (int,), {'__slots__': 'x'})
2082 with self.assertRaises(TypeError):
2083 type('A', (), {'__slots__': ''})
2084 with self.assertRaises(TypeError):
2085 type('A', (), {'__slots__': '42'})
2086 with self.assertRaises(TypeError):
2087 type('A', (), {'__slots__': 'x\x00y'})
2088 with self.assertRaises(ValueError):
2089 type('A', (), {'__slots__': 'x', 'x': 0})
2090 with self.assertRaises(TypeError):
2091 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2092 with self.assertRaises(TypeError):
2093 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2094
2095 class B:
2096 pass
2097 with self.assertRaises(TypeError):
2098 type('A', (B,), {'__slots__': '__dict__'})
2099 with self.assertRaises(TypeError):
2100 type('A', (B,), {'__slots__': '__weakref__'})
2101
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002102 def test_namespace_order(self):
2103 # bpo-34320: namespace should preserve order
2104 od = collections.OrderedDict([('a', 1), ('b', 2)])
2105 od.move_to_end('a')
2106 expected = list(od.items())
2107
2108 C = type('C', (), od)
2109 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2110
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002111
Zachary Warea4b7a752013-11-24 01:19:09 -06002112def load_tests(loader, tests, pattern):
2113 from doctest import DocTestSuite
2114 tests.addTest(DocTestSuite(builtins))
2115 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002116
2117if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002118 unittest.main()