blob: 1e9012e7e5ed2e99f40167062f7773bb5ec1153b [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:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300393 a = 1''',
394 '''a = [x async for x in arange(2)][1]''',
395 '''a = 1 in {x async for x in arange(2)}''',
396 '''a = {x:1 async for x in arange(1)}[0]''',
397 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
398 '''a = [x async for x in (x async for x in arange(5))][1]''',
399 '''a, = [1 for x in {x async for x in arange(1)}]''',
400 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400401 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402 policy = maybe_get_event_loop_policy()
403 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400404 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700405 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400406 with self.assertRaises(
407 SyntaxError, msg=f"source={source} mode={mode}"):
408 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700409
410 co = compile(source,
411 '?',
412 mode,
413 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
414
415 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400416 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700417
418 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400419 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700420 async_f = FunctionType(co, globals_)
421 asyncio.run(async_f())
422 self.assertEqual(globals_['a'], 1)
423
424 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400425 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700426 asyncio.run(eval(co, globals_))
427 self.assertEqual(globals_['a'], 1)
428 finally:
429 asyncio.set_event_loop_policy(policy)
430
Pablo Galindo90235812020-03-15 04:29:22 +0000431 def test_compile_top_level_await_invalid_cases(self):
432 # helper function just to check we can run top=level async-for
433 async def arange(n):
434 for i in range(n):
435 yield i
436
437 modes = ('single', 'exec')
438 code_samples = [
439 '''def f(): await arange(10)\n''',
440 '''def f(): [x async for x in arange(10)]\n''',
441 '''def f(): [await x async for x in arange(10)]\n''',
442 '''def f():
443 async for i in arange(1):
444 a = 1
445 ''',
446 '''def f():
447 async with asyncio.Lock() as l:
448 a = 1
449 '''
450 ]
451 policy = maybe_get_event_loop_policy()
452 try:
453 for mode, code_sample in product(modes, code_samples):
454 source = dedent(code_sample)
455 with self.assertRaises(
456 SyntaxError, msg=f"source={source} mode={mode}"):
457 compile(source, '?', mode)
458
459 with self.assertRaises(
460 SyntaxError, msg=f"source={source} mode={mode}"):
461 co = compile(source,
462 '?',
463 mode,
464 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
465 finally:
466 asyncio.set_event_loop_policy(policy)
467
468
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700469 def test_compile_async_generator(self):
470 """
471 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400472 make sure AsyncGenerators are still properly not marked with the
473 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700474 """
475 code = dedent("""async def ticker():
476 for i in range(10):
477 yield i
478 await asyncio.sleep(0)""")
479
480 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
481 glob = {}
482 exec(co, glob)
483 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
484
Walter Dörwald919497e2003-01-19 16:23:59 +0000485 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 sys.spam = 1
487 delattr(sys, 'spam')
488 self.assertRaises(TypeError, delattr)
489
490 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000491 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000492 self.assertRaises(TypeError, dir, 42, 42)
493
Georg Brandle32b4222007-03-10 22:13:27 +0000494 # dir() - local scope
495 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000496 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000497
498 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000499 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000500
501 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000502 class Foo(types.ModuleType):
503 __dict__ = 8
504 f = Foo("foo")
505 self.assertRaises(TypeError, dir, f)
506
507 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000508 self.assertIn("strip", dir(str))
509 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000510
511 # dir(obj)
512 class Foo(object):
513 def __init__(self):
514 self.x = 7
515 self.y = 8
516 self.z = 9
517 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000518 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000519
520 # dir(obj_no__dict__)
521 class Foo(object):
522 __slots__ = []
523 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000524 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000525
526 # dir(obj_no__class__with__dict__)
527 # (an ugly trick to cause getattr(f, "__class__") to fail)
528 class Foo(object):
529 __slots__ = ["__class__", "__dict__"]
530 def __init__(self):
531 self.bar = "wow"
532 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000533 self.assertNotIn("__repr__", dir(f))
534 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000535
536 # dir(obj_using __dir__)
537 class Foo(object):
538 def __dir__(self):
539 return ["kan", "ga", "roo"]
540 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000542
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500543 # dir(obj__dir__tuple)
544 class Foo(object):
545 def __dir__(self):
546 return ("b", "c", "a")
547 res = dir(Foo())
548 self.assertIsInstance(res, list)
549 self.assertTrue(res == ["a", "b", "c"])
550
551 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000552 class Foo(object):
553 def __dir__(self):
554 return 7
555 f = Foo()
556 self.assertRaises(TypeError, dir, f)
557
Collin Winter3eed7652007-08-14 17:53:54 +0000558 # dir(traceback)
559 try:
560 raise IndexError
561 except:
562 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
563
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500564 # test that object has a __dir__()
565 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000566
Walter Dörwald919497e2003-01-19 16:23:59 +0000567 def test_divmod(self):
568 self.assertEqual(divmod(12, 7), (1, 5))
569 self.assertEqual(divmod(-12, 7), (-2, 2))
570 self.assertEqual(divmod(12, -7), (-2, -2))
571 self.assertEqual(divmod(-12, -7), (1, -5))
572
Mark Dickinson5c2db372009-12-05 20:28:34 +0000573 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000574
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000575 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
576 (-3.25, 1.0, (-4.0, 0.75)),
577 (3.25, -1.0, (-4.0, -0.75)),
578 (-3.25, -1.0, (3.0, -0.25))]:
579 result = divmod(num, denom)
580 self.assertAlmostEqual(result[0], exp_result[0])
581 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000582
583 self.assertRaises(TypeError, divmod)
584
585 def test_eval(self):
586 self.assertEqual(eval('1+1'), 2)
587 self.assertEqual(eval(' 1+1\n'), 2)
588 globals = {'a': 1, 'b': 2}
589 locals = {'b': 200, 'c': 300}
590 self.assertEqual(eval('a', globals) , 1)
591 self.assertEqual(eval('a', globals, locals), 1)
592 self.assertEqual(eval('b', globals, locals), 200)
593 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000594 globals = {'a': 1, 'b': 2}
595 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000596 bom = b'\xef\xbb\xbf'
597 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000598 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000599 self.assertRaises(TypeError, eval)
600 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000601 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000602
Benjamin Peterson92722792012-12-15 12:51:05 -0500603 class X:
604 def __getitem__(self, key):
605 raise ValueError
606 self.assertRaises(ValueError, eval, "foo", {}, X())
607
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000608 def test_general_eval(self):
609 # Tests that general mappings can be used for the locals argument
610
611 class M:
612 "Test mapping interface versus possible calls from eval()."
613 def __getitem__(self, key):
614 if key == 'a':
615 return 12
616 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000617 def keys(self):
618 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000619
620 m = M()
621 g = globals()
622 self.assertEqual(eval('a', g, m), 12)
623 self.assertRaises(NameError, eval, 'b', g, m)
624 self.assertEqual(eval('dir()', g, m), list('xyz'))
625 self.assertEqual(eval('globals()', g, m), g)
626 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000627 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000628 class A:
629 "Non-mapping"
630 pass
631 m = A()
632 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000633
634 # Verify that dict subclasses work as well
635 class D(dict):
636 def __getitem__(self, key):
637 if key == 'a':
638 return 12
639 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000640 def keys(self):
641 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000642
643 d = D()
644 self.assertEqual(eval('a', g, d), 12)
645 self.assertRaises(NameError, eval, 'b', g, d)
646 self.assertEqual(eval('dir()', g, d), list('xyz'))
647 self.assertEqual(eval('globals()', g, d), g)
648 self.assertEqual(eval('locals()', g, d), d)
649
650 # Verify locals stores (used by list comps)
651 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000652 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000653
654 class SpreadSheet:
655 "Sample application showing nested, calculated lookups."
656 _cells = {}
657 def __setitem__(self, key, formula):
658 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000659 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000660 return eval(self._cells[key], globals(), self)
661
662 ss = SpreadSheet()
663 ss['a1'] = '5'
664 ss['a2'] = 'a1*6'
665 ss['a3'] = 'a2*7'
666 self.assertEqual(ss['a3'], 210)
667
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000668 # Verify that dir() catches a non-list returned by eval
669 # SF bug #1004669
670 class C:
671 def __getitem__(self, item):
672 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000673 def keys(self):
674 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000675 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
676
Georg Brandl7cae87c2006-09-06 06:51:57 +0000677 def test_exec(self):
678 g = {}
679 exec('z = 1', g)
680 if '__builtins__' in g:
681 del g['__builtins__']
682 self.assertEqual(g, {'z': 1})
683
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000684 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000685 if '__builtins__' in g:
686 del g['__builtins__']
687 self.assertEqual(g, {'z': 2})
688 g = {}
689 l = {}
690
Brett Cannon77628992010-03-20 20:59:33 +0000691 with check_warnings():
692 warnings.filterwarnings("ignore", "global statement",
693 module="<string>")
694 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000695 if '__builtins__' in g:
696 del g['__builtins__']
697 if '__builtins__' in l:
698 del l['__builtins__']
699 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
700
Victor Stinnerb0b22422012-04-19 00:57:45 +0200701 def test_exec_globals(self):
702 code = compile("print('Hello World!')", "", "exec")
703 # no builtin function
704 self.assertRaisesRegex(NameError, "name 'print' is not defined",
705 exec, code, {'__builtins__': {}})
706 # __builtins__ must be a mapping type
707 self.assertRaises(TypeError,
708 exec, code, {'__builtins__': 123})
709
710 # no __build_class__ function
711 code = compile("class A: pass", "", "exec")
712 self.assertRaisesRegex(NameError, "__build_class__ not found",
713 exec, code, {'__builtins__': {}})
714
715 class frozendict_error(Exception):
716 pass
717
718 class frozendict(dict):
719 def __setitem__(self, key, value):
720 raise frozendict_error("frozendict is readonly")
721
722 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400723 if isinstance(__builtins__, types.ModuleType):
724 frozen_builtins = frozendict(__builtins__.__dict__)
725 else:
726 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200727 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
728 self.assertRaises(frozendict_error,
729 exec, code, {'__builtins__': frozen_builtins})
730
731 # read-only globals
732 namespace = frozendict({})
733 code = compile("x=1", "test", "exec")
734 self.assertRaises(frozendict_error,
735 exec, code, namespace)
736
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000737 def test_exec_redirected(self):
738 savestdout = sys.stdout
739 sys.stdout = None # Whatever that cannot flush()
740 try:
741 # Used to raise SystemError('error return without exception set')
742 exec('a')
743 except NameError:
744 pass
745 finally:
746 sys.stdout = savestdout
747
Walter Dörwald919497e2003-01-19 16:23:59 +0000748 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000749 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
750 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
751 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
752 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
753 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 def identity(item):
755 return 1
756 filter(identity, Squares(5))
757 self.assertRaises(TypeError, filter)
758 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000759 def __getitem__(self, index):
760 if index<4:
761 return 42
762 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000763 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000764 def badfunc():
765 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000766 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000767
Walter Dörwaldbf517072003-01-27 15:57:14 +0000768 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000769 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
770 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
771 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000772
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000773 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200774 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
775 f1 = filter(filter_char, "abcdeabcde")
776 f2 = filter(filter_char, "abcdeabcde")
777 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000778
Walter Dörwald919497e2003-01-19 16:23:59 +0000779 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000780 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 self.assertRaises(TypeError, getattr, sys, 1)
782 self.assertRaises(TypeError, getattr, sys, 1, "foo")
783 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000784 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000785 # unicode surrogates are not encodable to the default encoding (utf8)
786 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000787
788 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000789 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 self.assertRaises(TypeError, hasattr, sys, 1)
791 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000792 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000793
Benjamin Peterson17689992010-08-24 03:26:23 +0000794 # Check that hasattr propagates all exceptions outside of
795 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000796 class A:
797 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000798 raise SystemExit
799 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000800 class B:
801 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000802 raise ValueError
803 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000804
Walter Dörwald919497e2003-01-19 16:23:59 +0000805 def test_hash(self):
806 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000807 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000808 self.assertEqual(hash(1), hash(1.0))
809 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000810 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000811 hash((0,1,2,3))
812 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000813 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000814 self.assertRaises(TypeError, hash, [])
815 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000816 # Bug 1536021: Allow hash to return long objects
817 class X:
818 def __hash__(self):
819 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000820 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000821 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000822 def __hash__(self):
823 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000824 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000825
826 def test_hex(self):
827 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000828 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000829 self.assertRaises(TypeError, hex, {})
830
831 def test_id(self):
832 id(None)
833 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 id(1.0)
835 id('spam')
836 id((0,1,2,3))
837 id([0,1,2,3])
838 id({'spam': 1, 'eggs': 2, 'ham': 3})
839
Guido van Rossuma88a0332007-02-26 16:59:55 +0000840 # Test input() later, alphabetized as if it were raw_input
841
Walter Dörwald919497e2003-01-19 16:23:59 +0000842 def test_iter(self):
843 self.assertRaises(TypeError, iter)
844 self.assertRaises(TypeError, iter, 42, 42)
845 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000846 for l in lists:
847 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000848 self.assertEqual(next(i), '1')
849 self.assertEqual(next(i), '2')
850 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000851
852 def test_isinstance(self):
853 class C:
854 pass
855 class D(C):
856 pass
857 class E:
858 pass
859 c = C()
860 d = D()
861 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000862 self.assertTrue(isinstance(c, C))
863 self.assertTrue(isinstance(d, C))
864 self.assertTrue(not isinstance(e, C))
865 self.assertTrue(not isinstance(c, D))
866 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000867 self.assertRaises(TypeError, isinstance, E, 'foo')
868 self.assertRaises(TypeError, isinstance)
869
870 def test_issubclass(self):
871 class C:
872 pass
873 class D(C):
874 pass
875 class E:
876 pass
877 c = C()
878 d = D()
879 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000880 self.assertTrue(issubclass(D, C))
881 self.assertTrue(issubclass(C, C))
882 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000883 self.assertRaises(TypeError, issubclass, 'foo', E)
884 self.assertRaises(TypeError, issubclass, E, 'foo')
885 self.assertRaises(TypeError, issubclass)
886
887 def test_len(self):
888 self.assertEqual(len('123'), 3)
889 self.assertEqual(len(()), 0)
890 self.assertEqual(len((1, 2, 3, 4)), 4)
891 self.assertEqual(len([1, 2, 3, 4]), 4)
892 self.assertEqual(len({}), 0)
893 self.assertEqual(len({'a':1, 'b': 2}), 2)
894 class BadSeq:
895 def __len__(self):
896 raise ValueError
897 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000898 class InvalidLen:
899 def __len__(self):
900 return None
901 self.assertRaises(TypeError, len, InvalidLen())
902 class FloatLen:
903 def __len__(self):
904 return 4.5
905 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300906 class NegativeLen:
907 def __len__(self):
908 return -10
909 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000910 class HugeLen:
911 def __len__(self):
912 return sys.maxsize + 1
913 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300914 class HugeNegativeLen:
915 def __len__(self):
916 return -sys.maxsize-10
917 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000918 class NoLenMethod(object): pass
919 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000920
Walter Dörwald919497e2003-01-19 16:23:59 +0000921 def test_map(self):
922 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000923 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000924 [1, 4, 9]
925 )
926 try:
927 from math import sqrt
928 except ImportError:
929 def sqrt(x):
930 return pow(x, 0.5)
931 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000932 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000933 [[4.0, 2.0], [9.0, 3.0]]
934 )
935 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000936 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000937 [10, 4, 6]
938 )
939
940 def plus(*v):
941 accu = 0
942 for i in v: accu = accu + i
943 return accu
944 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000945 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000946 [1, 3, 7]
947 )
948 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000949 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000950 [1+4, 3+9, 7+2]
951 )
952 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000953 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000954 [1+4+1, 3+9+1, 7+2+0]
955 )
956 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000957 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000958 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
959 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000960 def Max(a, b):
961 if a is None:
962 return b
963 if b is None:
964 return a
965 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000966 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000967 list(map(Max, Squares(3), Squares(2))),
968 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000969 )
970 self.assertRaises(TypeError, map)
971 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000972 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000973 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000974 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000975 yield None
976 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000977 def badfunc(x):
978 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000979 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000980
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000981 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200982 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
983 m1 = map(map_char, "Is this the real life?")
984 m2 = map(map_char, "Is this the real life?")
985 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000986
Walter Dörwald919497e2003-01-19 16:23:59 +0000987 def test_max(self):
988 self.assertEqual(max('123123'), '3')
989 self.assertEqual(max(1, 2, 3), 3)
990 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
991 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
992
Guido van Rossume2a383d2007-01-15 16:59:06 +0000993 self.assertEqual(max(1, 2, 3.0), 3.0)
994 self.assertEqual(max(1, 2.0, 3), 3)
995 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000996
Dong-hee Naabdc6342020-01-11 01:31:43 +0900997 with self.assertRaisesRegex(
998 TypeError,
999 'max expected at least 1 argument, got 0'
1000 ):
1001 max()
1002
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001003 self.assertRaises(TypeError, max, 42)
1004 self.assertRaises(ValueError, max, ())
1005 class BadSeq:
1006 def __getitem__(self, index):
1007 raise ValueError
1008 self.assertRaises(ValueError, max, BadSeq())
1009
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001010 for stmt in (
1011 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001012 "max(default=None)",
1013 "max(1, 2, default=None)", # require container for default
1014 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001015 "max(1, key=int)", # single arg not iterable
1016 "max(1, 2, keystone=int)", # wrong keyword
1017 "max(1, 2, key=int, abc=int)", # two many keywords
1018 "max(1, 2, key=1)", # keyfunc is not callable
1019 ):
Tim Peters7f061872004-12-07 21:17:46 +00001020 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001021 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001022 except TypeError:
1023 pass
1024 else:
1025 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001026
1027 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1028 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1029 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1030
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001031 self.assertEqual(max((), default=None), None) # zero elem iterable
1032 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1033 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1034
1035 self.assertEqual(max((), default=1, key=neg), 1)
1036 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1037
Alexander Marshalove22072f2018-07-24 10:58:21 +07001038 self.assertEqual(max((1, 2), key=None), 2)
1039
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001040 data = [random.randrange(200) for i in range(100)]
1041 keys = dict((elem, random.randrange(50)) for elem in data)
1042 f = keys.__getitem__
1043 self.assertEqual(max(data, key=f),
1044 sorted(reversed(data), key=f)[-1])
1045
Walter Dörwald919497e2003-01-19 16:23:59 +00001046 def test_min(self):
1047 self.assertEqual(min('123123'), '1')
1048 self.assertEqual(min(1, 2, 3), 1)
1049 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1050 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1051
Guido van Rossume2a383d2007-01-15 16:59:06 +00001052 self.assertEqual(min(1, 2, 3.0), 1)
1053 self.assertEqual(min(1, 2.0, 3), 1)
1054 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001055
Dong-hee Naabdc6342020-01-11 01:31:43 +09001056 with self.assertRaisesRegex(
1057 TypeError,
1058 'min expected at least 1 argument, got 0'
1059 ):
1060 min()
1061
Walter Dörwald919497e2003-01-19 16:23:59 +00001062 self.assertRaises(TypeError, min, 42)
1063 self.assertRaises(ValueError, min, ())
1064 class BadSeq:
1065 def __getitem__(self, index):
1066 raise ValueError
1067 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001068
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001069 for stmt in (
1070 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001071 "min(default=None)",
1072 "min(1, 2, default=None)", # require container for default
1073 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001074 "min(1, key=int)", # single arg not iterable
1075 "min(1, 2, keystone=int)", # wrong keyword
1076 "min(1, 2, key=int, abc=int)", # two many keywords
1077 "min(1, 2, key=1)", # keyfunc is not callable
1078 ):
Tim Peters7f061872004-12-07 21:17:46 +00001079 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001080 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001081 except TypeError:
1082 pass
1083 else:
1084 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001085
1086 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1087 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1088 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1089
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001090 self.assertEqual(min((), default=None), None) # zero elem iterable
1091 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1092 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1093
1094 self.assertEqual(min((), default=1, key=neg), 1)
1095 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1096
Alexander Marshalove22072f2018-07-24 10:58:21 +07001097 self.assertEqual(min((1, 2), key=None), 1)
1098
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001099 data = [random.randrange(200) for i in range(100)]
1100 keys = dict((elem, random.randrange(50)) for elem in data)
1101 f = keys.__getitem__
1102 self.assertEqual(min(data, key=f),
1103 sorted(data, key=f)[0])
1104
Georg Brandla18af4e2007-04-21 15:47:16 +00001105 def test_next(self):
1106 it = iter(range(2))
1107 self.assertEqual(next(it), 0)
1108 self.assertEqual(next(it), 1)
1109 self.assertRaises(StopIteration, next, it)
1110 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001111 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001112
1113 class Iter(object):
1114 def __iter__(self):
1115 return self
1116 def __next__(self):
1117 raise StopIteration
1118
1119 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001120 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001121 self.assertRaises(StopIteration, next, it)
1122
1123 def gen():
1124 yield 1
1125 return
1126
1127 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001128 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001129 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001130 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001131
Walter Dörwald919497e2003-01-19 16:23:59 +00001132 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001133 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001134 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 self.assertRaises(TypeError, oct, ())
1136
1137 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001138 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001139 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001140 self.addCleanup(unlink, TESTFN)
1141 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 fp.write('The quick brown fox jumps over the lazy dog')
1144 fp.write('.\n')
1145 fp.write('Dear John\n')
1146 fp.write('XXX'*100)
1147 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001148
1149 def test_open(self):
1150 self.write_testfile()
1151 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001152 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001153 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1155 self.assertEqual(fp.readline(4), 'Dear')
1156 self.assertEqual(fp.readline(100), ' John\n')
1157 self.assertEqual(fp.read(300), 'XXX'*100)
1158 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001159
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001160 # embedded null bytes and characters
1161 self.assertRaises(ValueError, open, 'a\x00b')
1162 self.assertRaises(ValueError, open, b'a\x00b')
1163
Victor Stinner91106cd2017-12-13 12:29:09 +01001164 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001165 def test_open_default_encoding(self):
1166 old_environ = dict(os.environ)
1167 try:
1168 # try to get a user preferred encoding different than the current
1169 # locale encoding to check that open() uses the current locale
1170 # encoding and not the user preferred encoding
1171 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1172 if key in os.environ:
1173 del os.environ[key]
1174
1175 self.write_testfile()
1176 current_locale_encoding = locale.getpreferredencoding(False)
1177 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001178 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001179 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001180 finally:
1181 os.environ.clear()
1182 os.environ.update(old_environ)
1183
Victor Stinnerdaf45552013-08-28 00:53:59 +02001184 def test_open_non_inheritable(self):
1185 fileobj = open(__file__)
1186 with fileobj:
1187 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1188
Walter Dörwald919497e2003-01-19 16:23:59 +00001189 def test_ord(self):
1190 self.assertEqual(ord(' '), 32)
1191 self.assertEqual(ord('A'), 65)
1192 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001193 self.assertEqual(ord('\x80'), 128)
1194 self.assertEqual(ord('\xff'), 255)
1195
1196 self.assertEqual(ord(b' '), 32)
1197 self.assertEqual(ord(b'A'), 65)
1198 self.assertEqual(ord(b'a'), 97)
1199 self.assertEqual(ord(b'\x80'), 128)
1200 self.assertEqual(ord(b'\xff'), 255)
1201
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001202 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001203 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001204
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001205 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1206 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1207 self.assertEqual(ord("\U00010000"), 0x00010000)
1208 self.assertEqual(ord("\U00010001"), 0x00010001)
1209 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1210 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1211 self.assertEqual(ord("\U00100000"), 0x00100000)
1212 self.assertEqual(ord("\U00100001"), 0x00100001)
1213 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1214 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1215
Walter Dörwald919497e2003-01-19 16:23:59 +00001216 def test_pow(self):
1217 self.assertEqual(pow(0,0), 1)
1218 self.assertEqual(pow(0,1), 0)
1219 self.assertEqual(pow(1,0), 1)
1220 self.assertEqual(pow(1,1), 1)
1221
1222 self.assertEqual(pow(2,0), 1)
1223 self.assertEqual(pow(2,10), 1024)
1224 self.assertEqual(pow(2,20), 1024*1024)
1225 self.assertEqual(pow(2,30), 1024*1024*1024)
1226
1227 self.assertEqual(pow(-2,0), 1)
1228 self.assertEqual(pow(-2,1), -2)
1229 self.assertEqual(pow(-2,2), 4)
1230 self.assertEqual(pow(-2,3), -8)
1231
Walter Dörwald919497e2003-01-19 16:23:59 +00001232 self.assertAlmostEqual(pow(0.,0), 1.)
1233 self.assertAlmostEqual(pow(0.,1), 0.)
1234 self.assertAlmostEqual(pow(1.,0), 1.)
1235 self.assertAlmostEqual(pow(1.,1), 1.)
1236
1237 self.assertAlmostEqual(pow(2.,0), 1.)
1238 self.assertAlmostEqual(pow(2.,10), 1024.)
1239 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1240 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1241
1242 self.assertAlmostEqual(pow(-2.,0), 1.)
1243 self.assertAlmostEqual(pow(-2.,1), -2.)
1244 self.assertAlmostEqual(pow(-2.,2), 4.)
1245 self.assertAlmostEqual(pow(-2.,3), -8.)
1246
Mark Dickinson5c2db372009-12-05 20:28:34 +00001247 for x in 2, 2.0:
1248 for y in 10, 10.0:
1249 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001250 if isinstance(x, float) or \
1251 isinstance(y, float) or \
1252 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001253 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001254 else:
1255 self.assertAlmostEqual(pow(x, y, z), 24.0)
1256
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001257 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1258 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1259
Mark Dickinsonc5299672019-06-02 10:24:06 +01001260 # See test_pow for additional tests for three-argument pow.
1261 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001263
1264 self.assertRaises(TypeError, pow)
1265
Ammar Askar87d6cd32019-09-21 00:28:49 -04001266 # Test passing in arguments as keywords.
1267 self.assertEqual(pow(0, exp=0), 1)
1268 self.assertEqual(pow(base=2, exp=4), 16)
1269 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1270 twopow = partial(pow, base=2)
1271 self.assertEqual(twopow(exp=5), 32)
1272 fifth_power = partial(pow, exp=5)
1273 self.assertEqual(fifth_power(2), 32)
1274 mod10 = partial(pow, mod=10)
1275 self.assertEqual(mod10(2, 6), 4)
1276 self.assertEqual(mod10(exp=6, base=2), 4)
1277
Guido van Rossuma88a0332007-02-26 16:59:55 +00001278 def test_input(self):
1279 self.write_testfile()
1280 fp = open(TESTFN, 'r')
1281 savestdin = sys.stdin
1282 savestdout = sys.stdout # Eats the echo
1283 try:
1284 sys.stdin = fp
1285 sys.stdout = BitBucket()
1286 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001287 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1288 self.assertEqual(input('testing\n'), 'Dear John')
1289
1290 # SF 1535165: don't segfault on closed stdin
1291 # sys.stdout must be a regular file for triggering
1292 sys.stdout = savestdout
1293 sys.stdin.close()
1294 self.assertRaises(ValueError, input)
1295
1296 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001297 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001298 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001299 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001300 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001301 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001302 self.assertRaises(EOFError, input)
1303
1304 del sys.stdout
1305 self.assertRaises(RuntimeError, input, 'prompt')
1306 del sys.stdin
1307 self.assertRaises(RuntimeError, input, 'prompt')
1308 finally:
1309 sys.stdin = savestdin
1310 sys.stdout = savestdout
1311 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001312
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001313 # test_int(): see test_int.py for tests of built-in function int().
1314
Walter Dörwald919497e2003-01-19 16:23:59 +00001315 def test_repr(self):
1316 self.assertEqual(repr(''), '\'\'')
1317 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001318 self.assertEqual(repr(()), '()')
1319 self.assertEqual(repr([]), '[]')
1320 self.assertEqual(repr({}), '{}')
1321 a = []
1322 a.append(a)
1323 self.assertEqual(repr(a), '[[...]]')
1324 a = {}
1325 a[0] = a
1326 self.assertEqual(repr(a), '{0: {...}}')
1327
1328 def test_round(self):
1329 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001330 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001331 self.assertEqual(round(1.0), 1.0)
1332 self.assertEqual(round(10.0), 10.0)
1333 self.assertEqual(round(1000000000.0), 1000000000.0)
1334 self.assertEqual(round(1e20), 1e20)
1335
1336 self.assertEqual(round(-1.0), -1.0)
1337 self.assertEqual(round(-10.0), -10.0)
1338 self.assertEqual(round(-1000000000.0), -1000000000.0)
1339 self.assertEqual(round(-1e20), -1e20)
1340
1341 self.assertEqual(round(0.1), 0.0)
1342 self.assertEqual(round(1.1), 1.0)
1343 self.assertEqual(round(10.1), 10.0)
1344 self.assertEqual(round(1000000000.1), 1000000000.0)
1345
1346 self.assertEqual(round(-1.1), -1.0)
1347 self.assertEqual(round(-10.1), -10.0)
1348 self.assertEqual(round(-1000000000.1), -1000000000.0)
1349
1350 self.assertEqual(round(0.9), 1.0)
1351 self.assertEqual(round(9.9), 10.0)
1352 self.assertEqual(round(999999999.9), 1000000000.0)
1353
1354 self.assertEqual(round(-0.9), -1.0)
1355 self.assertEqual(round(-9.9), -10.0)
1356 self.assertEqual(round(-999999999.9), -1000000000.0)
1357
1358 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001359 self.assertEqual(type(round(-8.0, -1)), float)
1360
1361 self.assertEqual(type(round(-8.0, 0)), float)
1362 self.assertEqual(type(round(-8.0, 1)), float)
1363
1364 # Check even / odd rounding behaviour
1365 self.assertEqual(round(5.5), 6)
1366 self.assertEqual(round(6.5), 6)
1367 self.assertEqual(round(-5.5), -6)
1368 self.assertEqual(round(-6.5), -6)
1369
1370 # Check behavior on ints
1371 self.assertEqual(round(0), 0)
1372 self.assertEqual(round(8), 8)
1373 self.assertEqual(round(-8), -8)
1374 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001375 self.assertEqual(type(round(-8, -1)), int)
1376 self.assertEqual(type(round(-8, 0)), int)
1377 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001378
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001379 # test new kwargs
1380 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1381
Walter Dörwald919497e2003-01-19 16:23:59 +00001382 self.assertRaises(TypeError, round)
1383
Alex Martelliae211f92007-08-22 23:21:33 +00001384 # test generic rounding delegation for reals
1385 class TestRound:
1386 def __round__(self):
1387 return 23
1388
1389 class TestNoRound:
1390 pass
1391
1392 self.assertEqual(round(TestRound()), 23)
1393
1394 self.assertRaises(TypeError, round, 1, 2, 3)
1395 self.assertRaises(TypeError, round, TestNoRound())
1396
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001397 t = TestNoRound()
1398 t.__round__ = lambda *args: args
1399 self.assertRaises(TypeError, round, t)
1400 self.assertRaises(TypeError, round, t, 0)
1401
Mark Dickinsonad731b92009-11-09 17:12:30 +00001402 # Some versions of glibc for alpha have a bug that affects
1403 # float -> integer rounding (floor, ceil, rint, round) for
1404 # values in the range [2**52, 2**53). See:
1405 #
1406 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1407 #
1408 # We skip this test on Linux/alpha if it would fail.
1409 linux_alpha = (platform.system().startswith('Linux') and
1410 platform.machine().startswith('alpha'))
1411 system_round_bug = round(5e15+1) != 5e15+1
1412 @unittest.skipIf(linux_alpha and system_round_bug,
1413 "test will fail; failure is probably due to a "
1414 "buggy system round function")
1415 def test_round_large(self):
1416 # Issue #1869: integral floats should remain unchanged
1417 self.assertEqual(round(5e15-1), 5e15-1)
1418 self.assertEqual(round(5e15), 5e15)
1419 self.assertEqual(round(5e15+1), 5e15+1)
1420 self.assertEqual(round(5e15+2), 5e15+2)
1421 self.assertEqual(round(5e15+3), 5e15+3)
1422
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001423 def test_bug_27936(self):
1424 # Verify that ndigits=None means the same as passing in no argument
1425 for x in [1234,
1426 1234.56,
1427 decimal.Decimal('1234.56'),
1428 fractions.Fraction(123456, 100)]:
1429 self.assertEqual(round(x, None), round(x))
1430 self.assertEqual(type(round(x, None)), type(round(x)))
1431
Walter Dörwald919497e2003-01-19 16:23:59 +00001432 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001433 setattr(sys, 'spam', 1)
1434 self.assertEqual(sys.spam, 1)
1435 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1436 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001437
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001438 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001439
Alex Martellia70b1912003-04-22 08:12:33 +00001440 def test_sum(self):
1441 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001442 self.assertEqual(sum(list(range(2,8))), 27)
1443 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001444 self.assertEqual(sum(Squares(10)), 285)
1445 self.assertEqual(sum(iter(Squares(10))), 285)
1446 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1447
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001448 self.assertEqual(sum(range(10), 1000), 1045)
1449 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001450 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1451 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1452
1453 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1454 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1455 2**31+2)
1456 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1457 2**63+2)
1458 self.assertIs(sum([], False), False)
1459
1460 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1461 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1462 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1463 self.assertEqual(sum([0.5, 1]), 1.5)
1464 self.assertEqual(sum([1, 0.5]), 1.5)
1465 self.assertEqual(repr(sum([-0.0])), '0.0')
1466 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1467 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001468
Alex Martellia70b1912003-04-22 08:12:33 +00001469 self.assertRaises(TypeError, sum)
1470 self.assertRaises(TypeError, sum, 42)
1471 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1472 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001473 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1474 values = [bytearray(b'a'), bytearray(b'b')]
1475 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001476 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1477 self.assertRaises(TypeError, sum, [{2:3}])
1478 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001479 self.assertRaises(TypeError, sum, [], '')
1480 self.assertRaises(TypeError, sum, [], b'')
1481 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001482
1483 class BadSeq:
1484 def __getitem__(self, index):
1485 raise ValueError
1486 self.assertRaises(ValueError, sum, BadSeq())
1487
Mark Dickinson3a22b472009-10-17 21:48:16 +00001488 empty = []
1489 sum(([x] for x in range(10)), empty)
1490 self.assertEqual(empty, [])
1491
Walter Dörwald919497e2003-01-19 16:23:59 +00001492 def test_type(self):
1493 self.assertEqual(type(''), type('123'))
1494 self.assertNotEqual(type(''), type(()))
1495
Guido van Rossumfee7b932005-01-16 00:21:28 +00001496 # We don't want self in vars(), so these are static methods
1497
1498 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001499 def get_vars_f0():
1500 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001501
Guido van Rossumfee7b932005-01-16 00:21:28 +00001502 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001503 def get_vars_f2():
1504 BuiltinTest.get_vars_f0()
1505 a = 1
1506 b = 2
1507 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001508
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001509 class C_get_vars(object):
1510 def getDict(self):
1511 return {'a':2}
1512 __dict__ = property(fget=getDict)
1513
Walter Dörwald919497e2003-01-19 16:23:59 +00001514 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001515 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001516 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001517 self.assertEqual(self.get_vars_f0(), {})
1518 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1519 self.assertRaises(TypeError, vars, 42, 42)
1520 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001521 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001522
1523 def test_zip(self):
1524 a = (1, 2, 3)
1525 b = (4, 5, 6)
1526 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001527 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001528 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001529 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001530 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001531 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001532 class I:
1533 def __getitem__(self, i):
1534 if i < 0 or i > 2: raise IndexError
1535 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001536 self.assertEqual(list(zip(a, I())), t)
1537 self.assertEqual(list(zip()), [])
1538 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001539 self.assertRaises(TypeError, zip, None)
1540 class G:
1541 pass
1542 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001543 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001544
1545 # Make sure zip doesn't try to allocate a billion elements for the
1546 # result list when one of its arguments doesn't say how long it is.
1547 # A MemoryError is the most likely failure mode.
1548 class SequenceWithoutALength:
1549 def __getitem__(self, i):
1550 if i == 5:
1551 raise IndexError
1552 else:
1553 return i
1554 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001555 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001556 list(enumerate(range(5)))
1557 )
1558
1559 class BadSeq:
1560 def __getitem__(self, i):
1561 if i == 5:
1562 raise ValueError
1563 else:
1564 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001565 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001566
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001567 def test_zip_pickle(self):
1568 a = (1, 2, 3)
1569 b = (4, 5, 6)
1570 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001571 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1572 z1 = zip(a, b)
1573 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001574
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001575 def test_zip_bad_iterable(self):
1576 exception = TypeError()
1577
1578 class BadIterable:
1579 def __iter__(self):
1580 raise exception
1581
1582 with self.assertRaises(TypeError) as cm:
1583 zip(BadIterable())
1584
1585 self.assertIs(cm.exception, exception)
1586
Eric Smithe4d63172010-09-13 20:48:43 +00001587 def test_format(self):
1588 # Test the basic machinery of the format() builtin. Don't test
1589 # the specifics of the various formatters
1590 self.assertEqual(format(3, ''), '3')
1591
1592 # Returns some classes to use for various tests. There's
1593 # an old-style version, and a new-style version
1594 def classes_new():
1595 class A(object):
1596 def __init__(self, x):
1597 self.x = x
1598 def __format__(self, format_spec):
1599 return str(self.x) + format_spec
1600 class DerivedFromA(A):
1601 pass
1602
1603 class Simple(object): pass
1604 class DerivedFromSimple(Simple):
1605 def __init__(self, x):
1606 self.x = x
1607 def __format__(self, format_spec):
1608 return str(self.x) + format_spec
1609 class DerivedFromSimple2(DerivedFromSimple): pass
1610 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1611
1612 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1613 self.assertEqual(format(A(3), 'spec'), '3spec')
1614 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1615 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1616 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1617 '10abcdef')
1618
1619 class_test(*classes_new())
1620
1621 def empty_format_spec(value):
1622 # test that:
1623 # format(x, '') == str(x)
1624 # format(x) == str(x)
1625 self.assertEqual(format(value, ""), str(value))
1626 self.assertEqual(format(value), str(value))
1627
1628 # for builtin types, format(x, "") == str(x)
1629 empty_format_spec(17**13)
1630 empty_format_spec(1.0)
1631 empty_format_spec(3.1415e104)
1632 empty_format_spec(-3.1415e104)
1633 empty_format_spec(3.1415e-104)
1634 empty_format_spec(-3.1415e-104)
1635 empty_format_spec(object)
1636 empty_format_spec(None)
1637
1638 # TypeError because self.__format__ returns the wrong type
1639 class BadFormatResult:
1640 def __format__(self, format_spec):
1641 return 1.0
1642 self.assertRaises(TypeError, format, BadFormatResult(), "")
1643
1644 # TypeError because format_spec is not unicode or str
1645 self.assertRaises(TypeError, format, object(), 4)
1646 self.assertRaises(TypeError, format, object(), object())
1647
1648 # tests for object.__format__ really belong elsewhere, but
1649 # there's no good place to put them
1650 x = object().__format__('')
1651 self.assertTrue(x.startswith('<object object at'))
1652
1653 # first argument to object.__format__ must be string
1654 self.assertRaises(TypeError, object().__format__, 3)
1655 self.assertRaises(TypeError, object().__format__, object())
1656 self.assertRaises(TypeError, object().__format__, None)
1657
1658 # --------------------------------------------------------------------
1659 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001660 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001661 class A:
1662 def __format__(self, fmt_str):
1663 return format('', fmt_str)
1664
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001665 self.assertEqual(format(A()), '')
1666 self.assertEqual(format(A(), ''), '')
1667 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001668
1669 class B:
1670 pass
1671
1672 class C(object):
1673 pass
1674
1675 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001676 obj = cls()
1677 self.assertEqual(format(obj), str(obj))
1678 self.assertEqual(format(obj, ''), str(obj))
1679 with self.assertRaisesRegex(TypeError,
1680 r'\b%s\b' % re.escape(cls.__name__)):
1681 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001682 # --------------------------------------------------------------------
1683
1684 # make sure we can take a subclass of str as a format spec
1685 class DerivedFromStr(str): pass
1686 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1687
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001688 def test_bin(self):
1689 self.assertEqual(bin(0), '0b0')
1690 self.assertEqual(bin(1), '0b1')
1691 self.assertEqual(bin(-1), '-0b1')
1692 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1693 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1694 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1695 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1696
Georg Brandl953152f2009-07-22 12:03:59 +00001697 def test_bytearray_translate(self):
1698 x = bytearray(b"abc")
1699 self.assertRaises(ValueError, x.translate, b"1", 1)
1700 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1701
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001702 def test_bytearray_extend_error(self):
1703 array = bytearray()
1704 bad_iter = map(int, "X")
1705 self.assertRaises(ValueError, array.extend, bad_iter)
1706
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001707 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001708 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001709 tp = type(const)
1710 self.assertIs(tp(), const)
1711 self.assertRaises(TypeError, tp, 1, 2)
1712 self.assertRaises(TypeError, tp, a=1, b=2)
1713
MojoVampire469325c2020-03-03 18:50:17 +00001714 def test_warning_notimplemented(self):
1715 # Issue #35712: NotImplemented is a sentinel value that should never
1716 # be evaluated in a boolean context (virtually all such use cases
1717 # are a result of accidental misuse implementing rich comparison
1718 # operations in terms of one another).
1719 # For the time being, it will continue to evaluate as truthy, but
1720 # issue a deprecation warning (with the eventual intent to make it
1721 # a TypeError).
1722 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1723 with self.assertWarns(DeprecationWarning):
1724 self.assertTrue(NotImplemented)
1725 with self.assertWarns(DeprecationWarning):
1726 self.assertFalse(not NotImplemented)
1727
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001728
1729class TestBreakpoint(unittest.TestCase):
1730 def setUp(self):
1731 # These tests require a clean slate environment. For example, if the
1732 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1733 # will mess up these tests. Similarly for sys.breakpointhook.
1734 # Cleaning the slate here means you can't use breakpoint() to debug
1735 # these tests, but I think that's okay. Just use pdb.set_trace() if
1736 # you must.
1737 self.resources = ExitStack()
1738 self.addCleanup(self.resources.close)
1739 self.env = self.resources.enter_context(EnvironmentVarGuard())
1740 del self.env['PYTHONBREAKPOINT']
1741 self.resources.enter_context(
1742 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1743
1744 def test_breakpoint(self):
1745 with patch('pdb.set_trace') as mock:
1746 breakpoint()
1747 mock.assert_called_once()
1748
1749 def test_breakpoint_with_breakpointhook_set(self):
1750 my_breakpointhook = MagicMock()
1751 sys.breakpointhook = my_breakpointhook
1752 breakpoint()
1753 my_breakpointhook.assert_called_once_with()
1754
1755 def test_breakpoint_with_breakpointhook_reset(self):
1756 my_breakpointhook = MagicMock()
1757 sys.breakpointhook = my_breakpointhook
1758 breakpoint()
1759 my_breakpointhook.assert_called_once_with()
1760 # Reset the hook and it will not be called again.
1761 sys.breakpointhook = sys.__breakpointhook__
1762 with patch('pdb.set_trace') as mock:
1763 breakpoint()
1764 mock.assert_called_once_with()
1765 my_breakpointhook.assert_called_once_with()
1766
1767 def test_breakpoint_with_args_and_keywords(self):
1768 my_breakpointhook = MagicMock()
1769 sys.breakpointhook = my_breakpointhook
1770 breakpoint(1, 2, 3, four=4, five=5)
1771 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1772
1773 def test_breakpoint_with_passthru_error(self):
1774 def my_breakpointhook():
1775 pass
1776 sys.breakpointhook = my_breakpointhook
1777 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1778
1779 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1780 def test_envar_good_path_builtin(self):
1781 self.env['PYTHONBREAKPOINT'] = 'int'
1782 with patch('builtins.int') as mock:
1783 breakpoint('7')
1784 mock.assert_called_once_with('7')
1785
1786 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1787 def test_envar_good_path_other(self):
1788 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1789 with patch('sys.exit') as mock:
1790 breakpoint()
1791 mock.assert_called_once_with()
1792
1793 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1794 def test_envar_good_path_noop_0(self):
1795 self.env['PYTHONBREAKPOINT'] = '0'
1796 with patch('pdb.set_trace') as mock:
1797 breakpoint()
1798 mock.assert_not_called()
1799
1800 def test_envar_good_path_empty_string(self):
1801 # PYTHONBREAKPOINT='' is the same as it not being set.
1802 self.env['PYTHONBREAKPOINT'] = ''
1803 with patch('pdb.set_trace') as mock:
1804 breakpoint()
1805 mock.assert_called_once_with()
1806
1807 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1808 def test_envar_unimportable(self):
1809 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001810 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001811 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001812 'nosuchbuiltin',
1813 'nosuchmodule.nosuchcallable',
1814 ):
1815 with self.subTest(envar=envar):
1816 self.env['PYTHONBREAKPOINT'] = envar
1817 mock = self.resources.enter_context(patch('pdb.set_trace'))
1818 w = self.resources.enter_context(check_warnings(quiet=True))
1819 breakpoint()
1820 self.assertEqual(
1821 str(w.message),
1822 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1823 self.assertEqual(w.category, RuntimeWarning)
1824 mock.assert_not_called()
1825
1826 def test_envar_ignored_when_hook_is_set(self):
1827 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1828 with patch('sys.exit') as mock:
1829 sys.breakpointhook = int
1830 breakpoint()
1831 mock.assert_not_called()
1832
1833
Martin Panterc9a6ab52015-10-10 01:25:38 +00001834@unittest.skipUnless(pty, "the pty and signal modules must be available")
1835class PtyTests(unittest.TestCase):
1836 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1837 terminals in the test environment"""
1838
Martin Pantere44dba32015-10-10 05:27:15 +00001839 def run_child(self, child, terminal_input):
1840 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001841 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001842 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001843 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001844 os.close(r)
1845 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001846 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001847 raise
1848 if pid == 0:
1849 # Child
1850 try:
1851 # Make sure we don't get stuck if there's a problem
1852 signal.alarm(2)
1853 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001854 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001855 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001856 except:
1857 traceback.print_exc()
1858 finally:
1859 # We don't want to return to unittest...
1860 os._exit(0)
1861 # Parent
1862 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001863 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001864 # Get results from the pipe
1865 with open(r, "r") as rpipe:
1866 lines = []
1867 while True:
1868 line = rpipe.readline().strip()
1869 if line == "":
1870 # The other end was closed => the child exited
1871 break
1872 lines.append(line)
1873 # Check the result was got and corresponds to the user's terminal input
1874 if len(lines) != 2:
1875 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001876 # Beware of Linux raising EIO when the slave is closed
1877 child_output = bytearray()
1878 while True:
1879 try:
1880 chunk = os.read(fd, 3000)
1881 except OSError: # Assume EIO
1882 break
1883 if not chunk:
1884 break
1885 child_output.extend(chunk)
1886 os.close(fd)
1887 child_output = child_output.decode("ascii", "ignore")
1888 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1889 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001890 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001891
Victor Stinner3ca9f502017-08-09 23:08:22 +02001892 # Wait until the child process completes
1893 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001894
Martin Pantere44dba32015-10-10 05:27:15 +00001895 return lines
1896
1897 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1898 if not sys.stdin.isatty() or not sys.stdout.isatty():
1899 self.skipTest("stdin and stdout must be ttys")
1900 def child(wpipe):
1901 # Check the error handlers are accounted for
1902 if stdio_encoding:
1903 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1904 encoding=stdio_encoding,
1905 errors='surrogateescape')
1906 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1907 encoding=stdio_encoding,
1908 errors='replace')
1909 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1910 print(ascii(input(prompt)), file=wpipe)
1911 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001912 # Check we did exercise the GNU readline path
1913 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1914 if lines[0] != 'tty = True':
1915 self.skipTest("standard IO in should have been a tty")
1916 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1917 if stdio_encoding:
1918 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1919 else:
1920 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1921 self.assertEqual(input_result, expected)
1922
1923 def test_input_tty(self):
1924 # Test input() functionality when wired to a tty (the code path
1925 # is different and invokes GNU readline if available).
1926 self.check_input_tty("prompt", b"quux")
1927
1928 def test_input_tty_non_ascii(self):
1929 # Check stdin/stdout encoding is used when invoking GNU readline
1930 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1931
1932 def test_input_tty_non_ascii_unicode_errors(self):
1933 # Check stdin/stdout error handler is used when invoking GNU readline
1934 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1935
1936 def test_input_no_stdout_fileno(self):
1937 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1938 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001939 def child(wpipe):
1940 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1941 sys.stdout = io.StringIO() # Does not support fileno()
1942 input("prompt")
1943 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1944 lines = self.run_child(child, b"quux\r")
1945 expected = (
1946 "stdin.isatty(): True",
1947 "captured: 'prompt'",
1948 )
1949 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001950
Raymond Hettinger64958a12003-12-17 20:43:33 +00001951class TestSorted(unittest.TestCase):
1952
1953 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001954 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001955 copy = data[:]
1956 random.shuffle(copy)
1957 self.assertEqual(data, sorted(copy))
1958 self.assertNotEqual(data, copy)
1959
1960 data.reverse()
1961 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001962 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1963 self.assertNotEqual(data, copy)
1964 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001965 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001966 self.assertNotEqual(data, copy)
1967
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001968 def test_bad_arguments(self):
1969 # Issue #29327: The first argument is positional-only.
1970 sorted([])
1971 with self.assertRaises(TypeError):
1972 sorted(iterable=[])
1973 # Other arguments are keyword-only
1974 sorted([], key=None)
1975 with self.assertRaises(TypeError):
1976 sorted([], None)
1977
Raymond Hettinger64958a12003-12-17 20:43:33 +00001978 def test_inputtypes(self):
1979 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001980 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001981 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001982 self.assertEqual(sorted(s), sorted(T(s)))
1983
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001984 s = ''.join(set(s)) # unique letters only
1985 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001986 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001987 self.assertEqual(sorted(s), sorted(T(s)))
1988
1989 def test_baddecorator(self):
1990 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1991 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1992
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001993
1994class ShutdownTest(unittest.TestCase):
1995
1996 def test_cleanup(self):
1997 # Issue #19255: builtins are still available at shutdown
1998 code = """if 1:
1999 import builtins
2000 import sys
2001
2002 class C:
2003 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002004 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002005 # Check that builtins still exist
2006 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002007 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002008
2009 c = C()
2010 # Make this module survive until builtins and sys are cleaned
2011 builtins.here = sys.modules[__name__]
2012 sys.here = sys.modules[__name__]
2013 # Create a reference loop so that this module needs to go
2014 # through a GC phase.
2015 here = sys.modules[__name__]
2016 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002017 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2018 # otherwise the codec may be unloaded before C.__del__() is called, and
2019 # so print("before") fails because the codec cannot be used to encode
2020 # "before" to sys.stdout.encoding. For example, on Windows,
2021 # sys.stdout.encoding is the OEM code page and these code pages are
2022 # implemented in Python
2023 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002024 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002025 self.assertEqual(["before", "after"], out.decode().splitlines())
2026
2027
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002028class TestType(unittest.TestCase):
2029 def test_new_type(self):
2030 A = type('A', (), {})
2031 self.assertEqual(A.__name__, 'A')
2032 self.assertEqual(A.__qualname__, 'A')
2033 self.assertEqual(A.__module__, __name__)
2034 self.assertEqual(A.__bases__, (object,))
2035 self.assertIs(A.__base__, object)
2036 x = A()
2037 self.assertIs(type(x), A)
2038 self.assertIs(x.__class__, A)
2039
2040 class B:
2041 def ham(self):
2042 return 'ham%d' % self
2043 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2044 self.assertEqual(C.__name__, 'C')
2045 self.assertEqual(C.__qualname__, 'C')
2046 self.assertEqual(C.__module__, __name__)
2047 self.assertEqual(C.__bases__, (B, int))
2048 self.assertIs(C.__base__, int)
2049 self.assertIn('spam', C.__dict__)
2050 self.assertNotIn('ham', C.__dict__)
2051 x = C(42)
2052 self.assertEqual(x, 42)
2053 self.assertIs(type(x), C)
2054 self.assertIs(x.__class__, C)
2055 self.assertEqual(x.ham(), 'ham42')
2056 self.assertEqual(x.spam(), 'spam42')
2057 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2058
Nick Coghland78448e2016-07-30 16:26:03 +10002059 def test_type_nokwargs(self):
2060 with self.assertRaises(TypeError):
2061 type('a', (), {}, x=5)
2062 with self.assertRaises(TypeError):
2063 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002064
2065 def test_type_name(self):
2066 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2067 with self.subTest(name=name):
2068 A = type(name, (), {})
2069 self.assertEqual(A.__name__, name)
2070 self.assertEqual(A.__qualname__, name)
2071 self.assertEqual(A.__module__, __name__)
2072 with self.assertRaises(ValueError):
2073 type('A\x00B', (), {})
2074 with self.assertRaises(ValueError):
2075 type('A\udcdcB', (), {})
2076 with self.assertRaises(TypeError):
2077 type(b'A', (), {})
2078
2079 C = type('C', (), {})
2080 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2081 with self.subTest(name=name):
2082 C.__name__ = name
2083 self.assertEqual(C.__name__, name)
2084 self.assertEqual(C.__qualname__, 'C')
2085 self.assertEqual(C.__module__, __name__)
2086
2087 A = type('C', (), {})
2088 with self.assertRaises(ValueError):
2089 A.__name__ = 'A\x00B'
2090 self.assertEqual(A.__name__, 'C')
2091 with self.assertRaises(ValueError):
2092 A.__name__ = 'A\udcdcB'
2093 self.assertEqual(A.__name__, 'C')
2094 with self.assertRaises(TypeError):
2095 A.__name__ = b'A'
2096 self.assertEqual(A.__name__, 'C')
2097
2098 def test_type_qualname(self):
2099 A = type('A', (), {'__qualname__': 'B.C'})
2100 self.assertEqual(A.__name__, 'A')
2101 self.assertEqual(A.__qualname__, 'B.C')
2102 self.assertEqual(A.__module__, __name__)
2103 with self.assertRaises(TypeError):
2104 type('A', (), {'__qualname__': b'B'})
2105 self.assertEqual(A.__qualname__, 'B.C')
2106
2107 A.__qualname__ = 'D.E'
2108 self.assertEqual(A.__name__, 'A')
2109 self.assertEqual(A.__qualname__, 'D.E')
2110 with self.assertRaises(TypeError):
2111 A.__qualname__ = b'B'
2112 self.assertEqual(A.__qualname__, 'D.E')
2113
2114 def test_type_doc(self):
2115 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2116 A = type('A', (), {'__doc__': doc})
2117 self.assertEqual(A.__doc__, doc)
2118 with self.assertRaises(UnicodeEncodeError):
2119 type('A', (), {'__doc__': 'x\udcdcy'})
2120
2121 A = type('A', (), {})
2122 self.assertEqual(A.__doc__, None)
2123 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2124 A.__doc__ = doc
2125 self.assertEqual(A.__doc__, doc)
2126
2127 def test_bad_args(self):
2128 with self.assertRaises(TypeError):
2129 type()
2130 with self.assertRaises(TypeError):
2131 type('A', ())
2132 with self.assertRaises(TypeError):
2133 type('A', (), {}, ())
2134 with self.assertRaises(TypeError):
2135 type('A', (), dict={})
2136 with self.assertRaises(TypeError):
2137 type('A', [], {})
2138 with self.assertRaises(TypeError):
2139 type('A', (), types.MappingProxyType({}))
2140 with self.assertRaises(TypeError):
2141 type('A', (None,), {})
2142 with self.assertRaises(TypeError):
2143 type('A', (bool,), {})
2144 with self.assertRaises(TypeError):
2145 type('A', (int, str), {})
2146
2147 def test_bad_slots(self):
2148 with self.assertRaises(TypeError):
2149 type('A', (), {'__slots__': b'x'})
2150 with self.assertRaises(TypeError):
2151 type('A', (int,), {'__slots__': 'x'})
2152 with self.assertRaises(TypeError):
2153 type('A', (), {'__slots__': ''})
2154 with self.assertRaises(TypeError):
2155 type('A', (), {'__slots__': '42'})
2156 with self.assertRaises(TypeError):
2157 type('A', (), {'__slots__': 'x\x00y'})
2158 with self.assertRaises(ValueError):
2159 type('A', (), {'__slots__': 'x', 'x': 0})
2160 with self.assertRaises(TypeError):
2161 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2162 with self.assertRaises(TypeError):
2163 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2164
2165 class B:
2166 pass
2167 with self.assertRaises(TypeError):
2168 type('A', (B,), {'__slots__': '__dict__'})
2169 with self.assertRaises(TypeError):
2170 type('A', (B,), {'__slots__': '__weakref__'})
2171
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002172 def test_namespace_order(self):
2173 # bpo-34320: namespace should preserve order
2174 od = collections.OrderedDict([('a', 1), ('b', 2)])
2175 od.move_to_end('a')
2176 expected = list(od.items())
2177
2178 C = type('C', (), od)
2179 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2180
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002181
Zachary Warea4b7a752013-11-24 01:19:09 -06002182def load_tests(loader, tests, pattern):
2183 from doctest import DocTestSuite
2184 tests.addTest(DocTestSuite(builtins))
2185 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002186
2187if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002188 unittest.main()