blob: 290ba2cad8e5eb276fa0c90b508ba97c08e05e30 [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
Victor Stinner278c1e12020-03-31 20:08:12 +020028from test import support
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040029from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070030 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
31 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030032from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040033from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010034try:
Antoine Pitrou772add72011-11-06 02:37:42 +010035 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010036except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010037 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Walter Dörwald919497e2003-01-19 16:23:59 +000040class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000041
Walter Dörwald919497e2003-01-19 16:23:59 +000042 def __init__(self, max):
43 self.max = max
44 self.sofar = []
45
46 def __len__(self): return len(self.sofar)
47
48 def __getitem__(self, i):
49 if not 0 <= i < self.max: raise IndexError
50 n = len(self.sofar)
51 while n <= i:
52 self.sofar.append(n*n)
53 n += 1
54 return self.sofar[i]
55
56class StrSquares:
57
58 def __init__(self, max):
59 self.max = max
60 self.sofar = []
61
62 def __len__(self):
63 return len(self.sofar)
64
65 def __getitem__(self, i):
66 if not 0 <= i < self.max:
67 raise IndexError
68 n = len(self.sofar)
69 while n <= i:
70 self.sofar.append(str(n*n))
71 n += 1
72 return self.sofar[i]
73
74class BitBucket:
75 def write(self, line):
76 pass
77
Facundo Batista2336bdd2008-01-19 19:12:01 +000078test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000079 ('0', 0),
80 ('1', 1),
81 ('9', 9),
82 ('10', 10),
83 ('99', 99),
84 ('100', 100),
85 ('314', 314),
86 (' 314', 314),
87 ('314 ', 314),
88 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000089 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000090 (' 1x', ValueError),
91 (' 1 ', 1),
92 (' 1\02 ', ValueError),
93 ('', ValueError),
94 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000095 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040096 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000097 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000098]
99
Facundo Batista2336bdd2008-01-19 19:12:01 +0000100test_conv_sign = [
101 ('0', 0),
102 ('1', 1),
103 ('9', 9),
104 ('10', 10),
105 ('99', 99),
106 ('100', 100),
107 ('314', 314),
108 (' 314', ValueError),
109 ('314 ', 314),
110 (' \t\t 314 \t\t ', ValueError),
111 (repr(sys.maxsize), sys.maxsize),
112 (' 1x', ValueError),
113 (' 1 ', ValueError),
114 (' 1\02 ', ValueError),
115 ('', ValueError),
116 (' ', ValueError),
117 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400118 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000119 (chr(0x200), ValueError),
120]
121
Raymond Hettinger96229b12005-03-11 06:49:40 +0000122class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000123 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000124 raise RuntimeError
125
126class TestFailingIter:
127 def __iter__(self):
128 raise RuntimeError
129
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000130def filter_char(arg):
131 return ord(arg) > ord("d")
132
133def map_char(arg):
134 return chr(ord(arg)+1)
135
Walter Dörwald919497e2003-01-19 16:23:59 +0000136class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000137 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200138 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000139 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200140 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000141 it = pickle.loads(d)
142 self.assertEqual(type(itorg), type(it))
143 self.assertEqual(list(it), seq)
144
145 #test the iterator after dropping one from it
146 it = pickle.loads(d)
147 try:
148 next(it)
149 except StopIteration:
150 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200151 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000152 it = pickle.loads(d)
153 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000154
155 def test_import(self):
156 __import__('sys')
157 __import__('time')
158 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000159 __import__(name='sys')
160 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000161 self.assertRaises(ImportError, __import__, 'spamspam')
162 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000163 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000164 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000165 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100166 with self.assertWarns(ImportWarning):
167 self.assertRaises(ImportError, __import__, '',
168 {'__package__': None, '__spec__': None, '__name__': '__main__'},
169 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300170 # embedded null character
171 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000172
173 def test_abs(self):
174 # int
175 self.assertEqual(abs(0), 0)
176 self.assertEqual(abs(1234), 1234)
177 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 # float
180 self.assertEqual(abs(0.0), 0.0)
181 self.assertEqual(abs(3.14), 3.14)
182 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 # str
184 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000185 # bool
186 self.assertEqual(abs(True), 1)
187 self.assertEqual(abs(False), 0)
188 # other
189 self.assertRaises(TypeError, abs)
190 self.assertRaises(TypeError, abs, None)
191 class AbsClass(object):
192 def __abs__(self):
193 return -5
194 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000195
Raymond Hettinger96229b12005-03-11 06:49:40 +0000196 def test_all(self):
197 self.assertEqual(all([2, 4, 6]), True)
198 self.assertEqual(all([2, None, 6]), False)
199 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
200 self.assertRaises(RuntimeError, all, TestFailingIter())
201 self.assertRaises(TypeError, all, 10) # Non-iterable
202 self.assertRaises(TypeError, all) # No args
203 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
204 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200205 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000206 S = [50, 60]
207 self.assertEqual(all(x > 42 for x in S), True)
208 S = [50, 40, 60]
209 self.assertEqual(all(x > 42 for x in S), False)
210
211 def test_any(self):
212 self.assertEqual(any([None, None, None]), False)
213 self.assertEqual(any([None, 4, None]), True)
214 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500215 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000216 self.assertRaises(TypeError, any, 10) # Non-iterable
217 self.assertRaises(TypeError, any) # No args
218 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
219 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200220 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000221 S = [40, 60, 30]
222 self.assertEqual(any(x > 42 for x in S), True)
223 S = [10, 20, 30]
224 self.assertEqual(any(x > 42 for x in S), False)
225
Georg Brandl559e5d72008-06-11 18:37:52 +0000226 def test_ascii(self):
227 self.assertEqual(ascii(''), '\'\'')
228 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000229 self.assertEqual(ascii(()), '()')
230 self.assertEqual(ascii([]), '[]')
231 self.assertEqual(ascii({}), '{}')
232 a = []
233 a.append(a)
234 self.assertEqual(ascii(a), '[[...]]')
235 a = {}
236 a[0] = a
237 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000238 # Advanced checks for unicode strings
239 def _check_uni(s):
240 self.assertEqual(ascii(s), repr(s))
241 _check_uni("'")
242 _check_uni('"')
243 _check_uni('"\'')
244 _check_uni('\0')
245 _check_uni('\r\n\t .')
246 # Unprintable non-ASCII characters
247 _check_uni('\x85')
248 _check_uni('\u1fff')
249 _check_uni('\U00012fff')
250 # Lone surrogates
251 _check_uni('\ud800')
252 _check_uni('\udfff')
253 # Issue #9804: surrogates should be joined even for printable
254 # wide characters (UCS-2 builds).
255 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
256 # All together
257 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
258 self.assertEqual(ascii(s),
259 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000260
Thomas Wouters89f507f2006-12-13 04:49:30 +0000261 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000262 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000264 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265
Walter Dörwald919497e2003-01-19 16:23:59 +0000266 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000267 self.assertTrue(callable(len))
268 self.assertFalse(callable("a"))
269 self.assertTrue(callable(callable))
270 self.assertTrue(callable(lambda x, y: x + y))
271 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000272 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000273 self.assertTrue(callable(f))
274
275 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000276 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000277 self.assertTrue(callable(C1))
278 c = C1()
279 self.assertTrue(callable(c.meth))
280 self.assertFalse(callable(c))
281
282 # __call__ is looked up on the class, not the instance
283 c.__call__ = None
284 self.assertFalse(callable(c))
285 c.__call__ = lambda self: 0
286 self.assertFalse(callable(c))
287 del c.__call__
288 self.assertFalse(callable(c))
289
290 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000291 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000292 c2 = C2()
293 self.assertTrue(callable(c2))
294 c2.__call__ = None
295 self.assertTrue(callable(c2))
296 class C3(C2): pass
297 c3 = C3()
298 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000299
300 def test_chr(self):
301 self.assertEqual(chr(32), ' ')
302 self.assertEqual(chr(65), 'A')
303 self.assertEqual(chr(97), 'a')
304 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000305 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000306 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300307 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000308 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000309 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
310 self.assertEqual(chr(0x00010000), "\U00010000")
311 self.assertEqual(chr(0x00010001), "\U00010001")
312 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
313 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
314 self.assertEqual(chr(0x00100000), "\U00100000")
315 self.assertEqual(chr(0x00100001), "\U00100001")
316 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
317 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
318 self.assertRaises(ValueError, chr, -1)
319 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000320 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000321
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000322 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000323 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000324
Walter Dörwald919497e2003-01-19 16:23:59 +0000325 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000326 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000327 bom = b'\xef\xbb\xbf'
328 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000329 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300330 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
331 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000332 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000333 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
335 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300336 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
338 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000339 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300340 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000341 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 # test the optimize argument
344
345 codestr = '''def f():
346 """doc"""
diana543386b2017-10-03 10:46:56 -0600347 debug_enabled = False
348 if __debug__:
349 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000350 try:
351 assert False
352 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200353 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000354 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200355 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000356 '''
357 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200358 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
359 (0, True, 'doc', True, True),
360 (1, False, 'doc', False, False),
361 (2, False, None, False, False)]
362 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000363 # test both direct compilation and compilation via AST
364 codeobjs = []
365 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
366 tree = ast.parse(codestr)
367 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
368 for code in codeobjs:
369 ns = {}
370 exec(code, ns)
371 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200372 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000373
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700374 def test_compile_top_level_await(self):
375 """Test whether code some top level await can be compiled.
376
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400377 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
378 set, and make sure the generated code object has the CO_COROUTINE flag
379 set in order to execute it with `await eval(.....)` instead of exec,
380 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700381 """
382
383 # helper function just to check we can run top=level async-for
384 async def arange(n):
385 for i in range(n):
386 yield i
387
388 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400389 code_samples = [
390 '''a = await asyncio.sleep(0, result=1)''',
391 '''async for i in arange(1):
392 a = 1''',
393 '''async with asyncio.Lock() as l:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300394 a = 1''',
395 '''a = [x async for x in arange(2)][1]''',
396 '''a = 1 in {x async for x in arange(2)}''',
397 '''a = {x:1 async for x in arange(1)}[0]''',
398 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
399 '''a = [x async for x in (x async for x in arange(5))][1]''',
400 '''a, = [1 for x in {x async for x in arange(1)}]''',
401 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400402 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700403 policy = maybe_get_event_loop_policy()
404 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400405 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700406 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400407 with self.assertRaises(
408 SyntaxError, msg=f"source={source} mode={mode}"):
409 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700410
411 co = compile(source,
412 '?',
413 mode,
414 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
415
416 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400417 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700418
419 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400420 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700421 async_f = FunctionType(co, globals_)
422 asyncio.run(async_f())
423 self.assertEqual(globals_['a'], 1)
424
425 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400426 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700427 asyncio.run(eval(co, globals_))
428 self.assertEqual(globals_['a'], 1)
429 finally:
430 asyncio.set_event_loop_policy(policy)
431
Pablo Galindo90235812020-03-15 04:29:22 +0000432 def test_compile_top_level_await_invalid_cases(self):
433 # helper function just to check we can run top=level async-for
434 async def arange(n):
435 for i in range(n):
436 yield i
437
438 modes = ('single', 'exec')
439 code_samples = [
440 '''def f(): await arange(10)\n''',
441 '''def f(): [x async for x in arange(10)]\n''',
442 '''def f(): [await x async for x in arange(10)]\n''',
443 '''def f():
444 async for i in arange(1):
445 a = 1
446 ''',
447 '''def f():
448 async with asyncio.Lock() as l:
449 a = 1
450 '''
451 ]
452 policy = maybe_get_event_loop_policy()
453 try:
454 for mode, code_sample in product(modes, code_samples):
455 source = dedent(code_sample)
456 with self.assertRaises(
457 SyntaxError, msg=f"source={source} mode={mode}"):
458 compile(source, '?', mode)
459
460 with self.assertRaises(
461 SyntaxError, msg=f"source={source} mode={mode}"):
462 co = compile(source,
463 '?',
464 mode,
465 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
466 finally:
467 asyncio.set_event_loop_policy(policy)
468
469
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700470 def test_compile_async_generator(self):
471 """
472 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400473 make sure AsyncGenerators are still properly not marked with the
474 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700475 """
476 code = dedent("""async def ticker():
477 for i in range(10):
478 yield i
479 await asyncio.sleep(0)""")
480
481 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
482 glob = {}
483 exec(co, glob)
484 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
485
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000487 sys.spam = 1
488 delattr(sys, 'spam')
489 self.assertRaises(TypeError, delattr)
490
491 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000492 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000493 self.assertRaises(TypeError, dir, 42, 42)
494
Georg Brandle32b4222007-03-10 22:13:27 +0000495 # dir() - local scope
496 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000497 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000498
499 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000500 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000501
502 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000503 class Foo(types.ModuleType):
504 __dict__ = 8
505 f = Foo("foo")
506 self.assertRaises(TypeError, dir, f)
507
508 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000509 self.assertIn("strip", dir(str))
510 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000511
512 # dir(obj)
513 class Foo(object):
514 def __init__(self):
515 self.x = 7
516 self.y = 8
517 self.z = 9
518 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000519 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000520
521 # dir(obj_no__dict__)
522 class Foo(object):
523 __slots__ = []
524 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000525 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000526
527 # dir(obj_no__class__with__dict__)
528 # (an ugly trick to cause getattr(f, "__class__") to fail)
529 class Foo(object):
530 __slots__ = ["__class__", "__dict__"]
531 def __init__(self):
532 self.bar = "wow"
533 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000534 self.assertNotIn("__repr__", dir(f))
535 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000536
537 # dir(obj_using __dir__)
538 class Foo(object):
539 def __dir__(self):
540 return ["kan", "ga", "roo"]
541 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000542 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000543
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500544 # dir(obj__dir__tuple)
545 class Foo(object):
546 def __dir__(self):
547 return ("b", "c", "a")
548 res = dir(Foo())
549 self.assertIsInstance(res, list)
550 self.assertTrue(res == ["a", "b", "c"])
551
552 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000553 class Foo(object):
554 def __dir__(self):
555 return 7
556 f = Foo()
557 self.assertRaises(TypeError, dir, f)
558
Collin Winter3eed7652007-08-14 17:53:54 +0000559 # dir(traceback)
560 try:
561 raise IndexError
562 except:
563 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
564
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500565 # test that object has a __dir__()
566 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000567
Walter Dörwald919497e2003-01-19 16:23:59 +0000568 def test_divmod(self):
569 self.assertEqual(divmod(12, 7), (1, 5))
570 self.assertEqual(divmod(-12, 7), (-2, 2))
571 self.assertEqual(divmod(12, -7), (-2, -2))
572 self.assertEqual(divmod(-12, -7), (1, -5))
573
Mark Dickinson5c2db372009-12-05 20:28:34 +0000574 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000575
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000576 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
577 (-3.25, 1.0, (-4.0, 0.75)),
578 (3.25, -1.0, (-4.0, -0.75)),
579 (-3.25, -1.0, (3.0, -0.25))]:
580 result = divmod(num, denom)
581 self.assertAlmostEqual(result[0], exp_result[0])
582 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000583
584 self.assertRaises(TypeError, divmod)
585
586 def test_eval(self):
587 self.assertEqual(eval('1+1'), 2)
588 self.assertEqual(eval(' 1+1\n'), 2)
589 globals = {'a': 1, 'b': 2}
590 locals = {'b': 200, 'c': 300}
591 self.assertEqual(eval('a', globals) , 1)
592 self.assertEqual(eval('a', globals, locals), 1)
593 self.assertEqual(eval('b', globals, locals), 200)
594 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000595 globals = {'a': 1, 'b': 2}
596 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000597 bom = b'\xef\xbb\xbf'
598 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000599 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000600 self.assertRaises(TypeError, eval)
601 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000602 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000603
Benjamin Peterson92722792012-12-15 12:51:05 -0500604 class X:
605 def __getitem__(self, key):
606 raise ValueError
607 self.assertRaises(ValueError, eval, "foo", {}, X())
608
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000609 def test_general_eval(self):
610 # Tests that general mappings can be used for the locals argument
611
612 class M:
613 "Test mapping interface versus possible calls from eval()."
614 def __getitem__(self, key):
615 if key == 'a':
616 return 12
617 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000618 def keys(self):
619 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000620
621 m = M()
622 g = globals()
623 self.assertEqual(eval('a', g, m), 12)
624 self.assertRaises(NameError, eval, 'b', g, m)
625 self.assertEqual(eval('dir()', g, m), list('xyz'))
626 self.assertEqual(eval('globals()', g, m), g)
627 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000628 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000629 class A:
630 "Non-mapping"
631 pass
632 m = A()
633 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000634
635 # Verify that dict subclasses work as well
636 class D(dict):
637 def __getitem__(self, key):
638 if key == 'a':
639 return 12
640 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000641 def keys(self):
642 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000643
644 d = D()
645 self.assertEqual(eval('a', g, d), 12)
646 self.assertRaises(NameError, eval, 'b', g, d)
647 self.assertEqual(eval('dir()', g, d), list('xyz'))
648 self.assertEqual(eval('globals()', g, d), g)
649 self.assertEqual(eval('locals()', g, d), d)
650
651 # Verify locals stores (used by list comps)
652 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000653 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000654
655 class SpreadSheet:
656 "Sample application showing nested, calculated lookups."
657 _cells = {}
658 def __setitem__(self, key, formula):
659 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000660 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000661 return eval(self._cells[key], globals(), self)
662
663 ss = SpreadSheet()
664 ss['a1'] = '5'
665 ss['a2'] = 'a1*6'
666 ss['a3'] = 'a2*7'
667 self.assertEqual(ss['a3'], 210)
668
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000669 # Verify that dir() catches a non-list returned by eval
670 # SF bug #1004669
671 class C:
672 def __getitem__(self, item):
673 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000674 def keys(self):
675 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000676 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
677
Georg Brandl7cae87c2006-09-06 06:51:57 +0000678 def test_exec(self):
679 g = {}
680 exec('z = 1', g)
681 if '__builtins__' in g:
682 del g['__builtins__']
683 self.assertEqual(g, {'z': 1})
684
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000685 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000686 if '__builtins__' in g:
687 del g['__builtins__']
688 self.assertEqual(g, {'z': 2})
689 g = {}
690 l = {}
691
Brett Cannon77628992010-03-20 20:59:33 +0000692 with check_warnings():
693 warnings.filterwarnings("ignore", "global statement",
694 module="<string>")
695 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000696 if '__builtins__' in g:
697 del g['__builtins__']
698 if '__builtins__' in l:
699 del l['__builtins__']
700 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
701
Victor Stinnerb0b22422012-04-19 00:57:45 +0200702 def test_exec_globals(self):
703 code = compile("print('Hello World!')", "", "exec")
704 # no builtin function
705 self.assertRaisesRegex(NameError, "name 'print' is not defined",
706 exec, code, {'__builtins__': {}})
707 # __builtins__ must be a mapping type
708 self.assertRaises(TypeError,
709 exec, code, {'__builtins__': 123})
710
711 # no __build_class__ function
712 code = compile("class A: pass", "", "exec")
713 self.assertRaisesRegex(NameError, "__build_class__ not found",
714 exec, code, {'__builtins__': {}})
715
716 class frozendict_error(Exception):
717 pass
718
719 class frozendict(dict):
720 def __setitem__(self, key, value):
721 raise frozendict_error("frozendict is readonly")
722
723 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400724 if isinstance(__builtins__, types.ModuleType):
725 frozen_builtins = frozendict(__builtins__.__dict__)
726 else:
727 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200728 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
729 self.assertRaises(frozendict_error,
730 exec, code, {'__builtins__': frozen_builtins})
731
732 # read-only globals
733 namespace = frozendict({})
734 code = compile("x=1", "test", "exec")
735 self.assertRaises(frozendict_error,
736 exec, code, namespace)
737
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000738 def test_exec_redirected(self):
739 savestdout = sys.stdout
740 sys.stdout = None # Whatever that cannot flush()
741 try:
742 # Used to raise SystemError('error return without exception set')
743 exec('a')
744 except NameError:
745 pass
746 finally:
747 sys.stdout = savestdout
748
Walter Dörwald919497e2003-01-19 16:23:59 +0000749 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000750 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
751 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
752 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
753 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
754 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000755 def identity(item):
756 return 1
757 filter(identity, Squares(5))
758 self.assertRaises(TypeError, filter)
759 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000760 def __getitem__(self, index):
761 if index<4:
762 return 42
763 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000764 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000765 def badfunc():
766 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000767 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000768
Walter Dörwaldbf517072003-01-27 15:57:14 +0000769 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000770 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
771 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
772 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000773
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000774 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200775 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
776 f1 = filter(filter_char, "abcdeabcde")
777 f2 = filter(filter_char, "abcdeabcde")
778 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000779
Walter Dörwald919497e2003-01-19 16:23:59 +0000780 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000781 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 self.assertRaises(TypeError, getattr, sys, 1)
783 self.assertRaises(TypeError, getattr, sys, 1, "foo")
784 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000785 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000786 # unicode surrogates are not encodable to the default encoding (utf8)
787 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000788
789 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000790 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000791 self.assertRaises(TypeError, hasattr, sys, 1)
792 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000793 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000794
Benjamin Peterson17689992010-08-24 03:26:23 +0000795 # Check that hasattr propagates all exceptions outside of
796 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000797 class A:
798 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000799 raise SystemExit
800 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000801 class B:
802 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000803 raise ValueError
804 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000805
Walter Dörwald919497e2003-01-19 16:23:59 +0000806 def test_hash(self):
807 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000808 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000809 self.assertEqual(hash(1), hash(1.0))
810 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000811 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000812 hash((0,1,2,3))
813 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000814 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 self.assertRaises(TypeError, hash, [])
816 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000817 # Bug 1536021: Allow hash to return long objects
818 class X:
819 def __hash__(self):
820 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000821 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000822 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000823 def __hash__(self):
824 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000825 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000826
827 def test_hex(self):
828 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000829 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000830 self.assertRaises(TypeError, hex, {})
831
832 def test_id(self):
833 id(None)
834 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 id(1.0)
836 id('spam')
837 id((0,1,2,3))
838 id([0,1,2,3])
839 id({'spam': 1, 'eggs': 2, 'ham': 3})
840
Guido van Rossuma88a0332007-02-26 16:59:55 +0000841 # Test input() later, alphabetized as if it were raw_input
842
Walter Dörwald919497e2003-01-19 16:23:59 +0000843 def test_iter(self):
844 self.assertRaises(TypeError, iter)
845 self.assertRaises(TypeError, iter, 42, 42)
846 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 for l in lists:
848 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000849 self.assertEqual(next(i), '1')
850 self.assertEqual(next(i), '2')
851 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000852
853 def test_isinstance(self):
854 class C:
855 pass
856 class D(C):
857 pass
858 class E:
859 pass
860 c = C()
861 d = D()
862 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000863 self.assertTrue(isinstance(c, C))
864 self.assertTrue(isinstance(d, C))
865 self.assertTrue(not isinstance(e, C))
866 self.assertTrue(not isinstance(c, D))
867 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000868 self.assertRaises(TypeError, isinstance, E, 'foo')
869 self.assertRaises(TypeError, isinstance)
870
871 def test_issubclass(self):
872 class C:
873 pass
874 class D(C):
875 pass
876 class E:
877 pass
878 c = C()
879 d = D()
880 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000881 self.assertTrue(issubclass(D, C))
882 self.assertTrue(issubclass(C, C))
883 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000884 self.assertRaises(TypeError, issubclass, 'foo', E)
885 self.assertRaises(TypeError, issubclass, E, 'foo')
886 self.assertRaises(TypeError, issubclass)
887
888 def test_len(self):
889 self.assertEqual(len('123'), 3)
890 self.assertEqual(len(()), 0)
891 self.assertEqual(len((1, 2, 3, 4)), 4)
892 self.assertEqual(len([1, 2, 3, 4]), 4)
893 self.assertEqual(len({}), 0)
894 self.assertEqual(len({'a':1, 'b': 2}), 2)
895 class BadSeq:
896 def __len__(self):
897 raise ValueError
898 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000899 class InvalidLen:
900 def __len__(self):
901 return None
902 self.assertRaises(TypeError, len, InvalidLen())
903 class FloatLen:
904 def __len__(self):
905 return 4.5
906 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300907 class NegativeLen:
908 def __len__(self):
909 return -10
910 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000911 class HugeLen:
912 def __len__(self):
913 return sys.maxsize + 1
914 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300915 class HugeNegativeLen:
916 def __len__(self):
917 return -sys.maxsize-10
918 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000919 class NoLenMethod(object): pass
920 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000921
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 def test_map(self):
923 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000924 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000925 [1, 4, 9]
926 )
927 try:
928 from math import sqrt
929 except ImportError:
930 def sqrt(x):
931 return pow(x, 0.5)
932 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000933 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000934 [[4.0, 2.0], [9.0, 3.0]]
935 )
936 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000937 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000938 [10, 4, 6]
939 )
940
941 def plus(*v):
942 accu = 0
943 for i in v: accu = accu + i
944 return accu
945 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000946 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 [1, 3, 7]
948 )
949 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000950 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000951 [1+4, 3+9, 7+2]
952 )
953 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000954 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000955 [1+4+1, 3+9+1, 7+2+0]
956 )
957 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000958 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000959 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
960 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000961 def Max(a, b):
962 if a is None:
963 return b
964 if b is None:
965 return a
966 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000967 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000968 list(map(Max, Squares(3), Squares(2))),
969 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000970 )
971 self.assertRaises(TypeError, map)
972 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000973 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000974 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000975 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000976 yield None
977 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000978 def badfunc(x):
979 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000980 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000981
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000982 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200983 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
984 m1 = map(map_char, "Is this the real life?")
985 m2 = map(map_char, "Is this the real life?")
986 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000987
Walter Dörwald919497e2003-01-19 16:23:59 +0000988 def test_max(self):
989 self.assertEqual(max('123123'), '3')
990 self.assertEqual(max(1, 2, 3), 3)
991 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
992 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
993
Guido van Rossume2a383d2007-01-15 16:59:06 +0000994 self.assertEqual(max(1, 2, 3.0), 3.0)
995 self.assertEqual(max(1, 2.0, 3), 3)
996 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000997
Dong-hee Naabdc6342020-01-11 01:31:43 +0900998 with self.assertRaisesRegex(
999 TypeError,
1000 'max expected at least 1 argument, got 0'
1001 ):
1002 max()
1003
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001004 self.assertRaises(TypeError, max, 42)
1005 self.assertRaises(ValueError, max, ())
1006 class BadSeq:
1007 def __getitem__(self, index):
1008 raise ValueError
1009 self.assertRaises(ValueError, max, BadSeq())
1010
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001011 for stmt in (
1012 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001013 "max(default=None)",
1014 "max(1, 2, default=None)", # require container for default
1015 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001016 "max(1, key=int)", # single arg not iterable
1017 "max(1, 2, keystone=int)", # wrong keyword
1018 "max(1, 2, key=int, abc=int)", # two many keywords
1019 "max(1, 2, key=1)", # keyfunc is not callable
1020 ):
Tim Peters7f061872004-12-07 21:17:46 +00001021 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001022 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001023 except TypeError:
1024 pass
1025 else:
1026 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001027
1028 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1029 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1030 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1031
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001032 self.assertEqual(max((), default=None), None) # zero elem iterable
1033 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1034 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1035
1036 self.assertEqual(max((), default=1, key=neg), 1)
1037 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1038
Alexander Marshalove22072f2018-07-24 10:58:21 +07001039 self.assertEqual(max((1, 2), key=None), 2)
1040
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001041 data = [random.randrange(200) for i in range(100)]
1042 keys = dict((elem, random.randrange(50)) for elem in data)
1043 f = keys.__getitem__
1044 self.assertEqual(max(data, key=f),
1045 sorted(reversed(data), key=f)[-1])
1046
Walter Dörwald919497e2003-01-19 16:23:59 +00001047 def test_min(self):
1048 self.assertEqual(min('123123'), '1')
1049 self.assertEqual(min(1, 2, 3), 1)
1050 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1051 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1052
Guido van Rossume2a383d2007-01-15 16:59:06 +00001053 self.assertEqual(min(1, 2, 3.0), 1)
1054 self.assertEqual(min(1, 2.0, 3), 1)
1055 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001056
Dong-hee Naabdc6342020-01-11 01:31:43 +09001057 with self.assertRaisesRegex(
1058 TypeError,
1059 'min expected at least 1 argument, got 0'
1060 ):
1061 min()
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 self.assertRaises(TypeError, min, 42)
1064 self.assertRaises(ValueError, min, ())
1065 class BadSeq:
1066 def __getitem__(self, index):
1067 raise ValueError
1068 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001069
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001070 for stmt in (
1071 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001072 "min(default=None)",
1073 "min(1, 2, default=None)", # require container for default
1074 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001075 "min(1, key=int)", # single arg not iterable
1076 "min(1, 2, keystone=int)", # wrong keyword
1077 "min(1, 2, key=int, abc=int)", # two many keywords
1078 "min(1, 2, key=1)", # keyfunc is not callable
1079 ):
Tim Peters7f061872004-12-07 21:17:46 +00001080 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001081 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001082 except TypeError:
1083 pass
1084 else:
1085 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001086
1087 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1088 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1089 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1090
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001091 self.assertEqual(min((), default=None), None) # zero elem iterable
1092 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1093 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1094
1095 self.assertEqual(min((), default=1, key=neg), 1)
1096 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1097
Alexander Marshalove22072f2018-07-24 10:58:21 +07001098 self.assertEqual(min((1, 2), key=None), 1)
1099
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001100 data = [random.randrange(200) for i in range(100)]
1101 keys = dict((elem, random.randrange(50)) for elem in data)
1102 f = keys.__getitem__
1103 self.assertEqual(min(data, key=f),
1104 sorted(data, key=f)[0])
1105
Georg Brandla18af4e2007-04-21 15:47:16 +00001106 def test_next(self):
1107 it = iter(range(2))
1108 self.assertEqual(next(it), 0)
1109 self.assertEqual(next(it), 1)
1110 self.assertRaises(StopIteration, next, it)
1111 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001112 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001113
1114 class Iter(object):
1115 def __iter__(self):
1116 return self
1117 def __next__(self):
1118 raise StopIteration
1119
1120 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001122 self.assertRaises(StopIteration, next, it)
1123
1124 def gen():
1125 yield 1
1126 return
1127
1128 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001129 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001130 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001131 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001132
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001134 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001135 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001136 self.assertRaises(TypeError, oct, ())
1137
1138 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001139 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001140 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001141 self.addCleanup(unlink, TESTFN)
1142 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001144 fp.write('The quick brown fox jumps over the lazy dog')
1145 fp.write('.\n')
1146 fp.write('Dear John\n')
1147 fp.write('XXX'*100)
1148 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
1150 def test_open(self):
1151 self.write_testfile()
1152 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001153 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1156 self.assertEqual(fp.readline(4), 'Dear')
1157 self.assertEqual(fp.readline(100), ' John\n')
1158 self.assertEqual(fp.read(300), 'XXX'*100)
1159 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001160
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001161 # embedded null bytes and characters
1162 self.assertRaises(ValueError, open, 'a\x00b')
1163 self.assertRaises(ValueError, open, b'a\x00b')
1164
Victor Stinner91106cd2017-12-13 12:29:09 +01001165 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001166 def test_open_default_encoding(self):
1167 old_environ = dict(os.environ)
1168 try:
1169 # try to get a user preferred encoding different than the current
1170 # locale encoding to check that open() uses the current locale
1171 # encoding and not the user preferred encoding
1172 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1173 if key in os.environ:
1174 del os.environ[key]
1175
1176 self.write_testfile()
1177 current_locale_encoding = locale.getpreferredencoding(False)
1178 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001179 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001180 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001181 finally:
1182 os.environ.clear()
1183 os.environ.update(old_environ)
1184
Victor Stinnerdaf45552013-08-28 00:53:59 +02001185 def test_open_non_inheritable(self):
1186 fileobj = open(__file__)
1187 with fileobj:
1188 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1189
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 def test_ord(self):
1191 self.assertEqual(ord(' '), 32)
1192 self.assertEqual(ord('A'), 65)
1193 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001194 self.assertEqual(ord('\x80'), 128)
1195 self.assertEqual(ord('\xff'), 255)
1196
1197 self.assertEqual(ord(b' '), 32)
1198 self.assertEqual(ord(b'A'), 65)
1199 self.assertEqual(ord(b'a'), 97)
1200 self.assertEqual(ord(b'\x80'), 128)
1201 self.assertEqual(ord(b'\xff'), 255)
1202
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001203 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001204 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001205
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001206 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1207 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1208 self.assertEqual(ord("\U00010000"), 0x00010000)
1209 self.assertEqual(ord("\U00010001"), 0x00010001)
1210 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1211 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1212 self.assertEqual(ord("\U00100000"), 0x00100000)
1213 self.assertEqual(ord("\U00100001"), 0x00100001)
1214 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1215 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1216
Walter Dörwald919497e2003-01-19 16:23:59 +00001217 def test_pow(self):
1218 self.assertEqual(pow(0,0), 1)
1219 self.assertEqual(pow(0,1), 0)
1220 self.assertEqual(pow(1,0), 1)
1221 self.assertEqual(pow(1,1), 1)
1222
1223 self.assertEqual(pow(2,0), 1)
1224 self.assertEqual(pow(2,10), 1024)
1225 self.assertEqual(pow(2,20), 1024*1024)
1226 self.assertEqual(pow(2,30), 1024*1024*1024)
1227
1228 self.assertEqual(pow(-2,0), 1)
1229 self.assertEqual(pow(-2,1), -2)
1230 self.assertEqual(pow(-2,2), 4)
1231 self.assertEqual(pow(-2,3), -8)
1232
Walter Dörwald919497e2003-01-19 16:23:59 +00001233 self.assertAlmostEqual(pow(0.,0), 1.)
1234 self.assertAlmostEqual(pow(0.,1), 0.)
1235 self.assertAlmostEqual(pow(1.,0), 1.)
1236 self.assertAlmostEqual(pow(1.,1), 1.)
1237
1238 self.assertAlmostEqual(pow(2.,0), 1.)
1239 self.assertAlmostEqual(pow(2.,10), 1024.)
1240 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1241 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1242
1243 self.assertAlmostEqual(pow(-2.,0), 1.)
1244 self.assertAlmostEqual(pow(-2.,1), -2.)
1245 self.assertAlmostEqual(pow(-2.,2), 4.)
1246 self.assertAlmostEqual(pow(-2.,3), -8.)
1247
Mark Dickinson5c2db372009-12-05 20:28:34 +00001248 for x in 2, 2.0:
1249 for y in 10, 10.0:
1250 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001251 if isinstance(x, float) or \
1252 isinstance(y, float) or \
1253 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001254 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001255 else:
1256 self.assertAlmostEqual(pow(x, y, z), 24.0)
1257
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001258 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1259 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1260
Mark Dickinsonc5299672019-06-02 10:24:06 +01001261 # See test_pow for additional tests for three-argument pow.
1262 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001263 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001264
1265 self.assertRaises(TypeError, pow)
1266
Ammar Askar87d6cd32019-09-21 00:28:49 -04001267 # Test passing in arguments as keywords.
1268 self.assertEqual(pow(0, exp=0), 1)
1269 self.assertEqual(pow(base=2, exp=4), 16)
1270 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1271 twopow = partial(pow, base=2)
1272 self.assertEqual(twopow(exp=5), 32)
1273 fifth_power = partial(pow, exp=5)
1274 self.assertEqual(fifth_power(2), 32)
1275 mod10 = partial(pow, mod=10)
1276 self.assertEqual(mod10(2, 6), 4)
1277 self.assertEqual(mod10(exp=6, base=2), 4)
1278
Guido van Rossuma88a0332007-02-26 16:59:55 +00001279 def test_input(self):
1280 self.write_testfile()
1281 fp = open(TESTFN, 'r')
1282 savestdin = sys.stdin
1283 savestdout = sys.stdout # Eats the echo
1284 try:
1285 sys.stdin = fp
1286 sys.stdout = BitBucket()
1287 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001288 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1289 self.assertEqual(input('testing\n'), 'Dear John')
1290
1291 # SF 1535165: don't segfault on closed stdin
1292 # sys.stdout must be a regular file for triggering
1293 sys.stdout = savestdout
1294 sys.stdin.close()
1295 self.assertRaises(ValueError, input)
1296
1297 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001298 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001299 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001300 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001301 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001302 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001303 self.assertRaises(EOFError, input)
1304
1305 del sys.stdout
1306 self.assertRaises(RuntimeError, input, 'prompt')
1307 del sys.stdin
1308 self.assertRaises(RuntimeError, input, 'prompt')
1309 finally:
1310 sys.stdin = savestdin
1311 sys.stdout = savestdout
1312 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001313
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001314 # test_int(): see test_int.py for tests of built-in function int().
1315
Walter Dörwald919497e2003-01-19 16:23:59 +00001316 def test_repr(self):
1317 self.assertEqual(repr(''), '\'\'')
1318 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001319 self.assertEqual(repr(()), '()')
1320 self.assertEqual(repr([]), '[]')
1321 self.assertEqual(repr({}), '{}')
1322 a = []
1323 a.append(a)
1324 self.assertEqual(repr(a), '[[...]]')
1325 a = {}
1326 a[0] = a
1327 self.assertEqual(repr(a), '{0: {...}}')
1328
1329 def test_round(self):
1330 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001331 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001332 self.assertEqual(round(1.0), 1.0)
1333 self.assertEqual(round(10.0), 10.0)
1334 self.assertEqual(round(1000000000.0), 1000000000.0)
1335 self.assertEqual(round(1e20), 1e20)
1336
1337 self.assertEqual(round(-1.0), -1.0)
1338 self.assertEqual(round(-10.0), -10.0)
1339 self.assertEqual(round(-1000000000.0), -1000000000.0)
1340 self.assertEqual(round(-1e20), -1e20)
1341
1342 self.assertEqual(round(0.1), 0.0)
1343 self.assertEqual(round(1.1), 1.0)
1344 self.assertEqual(round(10.1), 10.0)
1345 self.assertEqual(round(1000000000.1), 1000000000.0)
1346
1347 self.assertEqual(round(-1.1), -1.0)
1348 self.assertEqual(round(-10.1), -10.0)
1349 self.assertEqual(round(-1000000000.1), -1000000000.0)
1350
1351 self.assertEqual(round(0.9), 1.0)
1352 self.assertEqual(round(9.9), 10.0)
1353 self.assertEqual(round(999999999.9), 1000000000.0)
1354
1355 self.assertEqual(round(-0.9), -1.0)
1356 self.assertEqual(round(-9.9), -10.0)
1357 self.assertEqual(round(-999999999.9), -1000000000.0)
1358
1359 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001360 self.assertEqual(type(round(-8.0, -1)), float)
1361
1362 self.assertEqual(type(round(-8.0, 0)), float)
1363 self.assertEqual(type(round(-8.0, 1)), float)
1364
1365 # Check even / odd rounding behaviour
1366 self.assertEqual(round(5.5), 6)
1367 self.assertEqual(round(6.5), 6)
1368 self.assertEqual(round(-5.5), -6)
1369 self.assertEqual(round(-6.5), -6)
1370
1371 # Check behavior on ints
1372 self.assertEqual(round(0), 0)
1373 self.assertEqual(round(8), 8)
1374 self.assertEqual(round(-8), -8)
1375 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001376 self.assertEqual(type(round(-8, -1)), int)
1377 self.assertEqual(type(round(-8, 0)), int)
1378 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001379
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001380 # test new kwargs
1381 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1382
Walter Dörwald919497e2003-01-19 16:23:59 +00001383 self.assertRaises(TypeError, round)
1384
Alex Martelliae211f92007-08-22 23:21:33 +00001385 # test generic rounding delegation for reals
1386 class TestRound:
1387 def __round__(self):
1388 return 23
1389
1390 class TestNoRound:
1391 pass
1392
1393 self.assertEqual(round(TestRound()), 23)
1394
1395 self.assertRaises(TypeError, round, 1, 2, 3)
1396 self.assertRaises(TypeError, round, TestNoRound())
1397
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001398 t = TestNoRound()
1399 t.__round__ = lambda *args: args
1400 self.assertRaises(TypeError, round, t)
1401 self.assertRaises(TypeError, round, t, 0)
1402
Mark Dickinsonad731b92009-11-09 17:12:30 +00001403 # Some versions of glibc for alpha have a bug that affects
1404 # float -> integer rounding (floor, ceil, rint, round) for
1405 # values in the range [2**52, 2**53). See:
1406 #
1407 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1408 #
1409 # We skip this test on Linux/alpha if it would fail.
1410 linux_alpha = (platform.system().startswith('Linux') and
1411 platform.machine().startswith('alpha'))
1412 system_round_bug = round(5e15+1) != 5e15+1
1413 @unittest.skipIf(linux_alpha and system_round_bug,
1414 "test will fail; failure is probably due to a "
1415 "buggy system round function")
1416 def test_round_large(self):
1417 # Issue #1869: integral floats should remain unchanged
1418 self.assertEqual(round(5e15-1), 5e15-1)
1419 self.assertEqual(round(5e15), 5e15)
1420 self.assertEqual(round(5e15+1), 5e15+1)
1421 self.assertEqual(round(5e15+2), 5e15+2)
1422 self.assertEqual(round(5e15+3), 5e15+3)
1423
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001424 def test_bug_27936(self):
1425 # Verify that ndigits=None means the same as passing in no argument
1426 for x in [1234,
1427 1234.56,
1428 decimal.Decimal('1234.56'),
1429 fractions.Fraction(123456, 100)]:
1430 self.assertEqual(round(x, None), round(x))
1431 self.assertEqual(type(round(x, None)), type(round(x)))
1432
Walter Dörwald919497e2003-01-19 16:23:59 +00001433 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001434 setattr(sys, 'spam', 1)
1435 self.assertEqual(sys.spam, 1)
1436 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1437 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001438
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001439 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001440
Alex Martellia70b1912003-04-22 08:12:33 +00001441 def test_sum(self):
1442 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001443 self.assertEqual(sum(list(range(2,8))), 27)
1444 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001445 self.assertEqual(sum(Squares(10)), 285)
1446 self.assertEqual(sum(iter(Squares(10))), 285)
1447 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1448
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001449 self.assertEqual(sum(range(10), 1000), 1045)
1450 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001451 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1452 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1453
1454 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1455 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1456 2**31+2)
1457 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1458 2**63+2)
1459 self.assertIs(sum([], False), False)
1460
1461 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1462 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1463 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1464 self.assertEqual(sum([0.5, 1]), 1.5)
1465 self.assertEqual(sum([1, 0.5]), 1.5)
1466 self.assertEqual(repr(sum([-0.0])), '0.0')
1467 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1468 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001469
Alex Martellia70b1912003-04-22 08:12:33 +00001470 self.assertRaises(TypeError, sum)
1471 self.assertRaises(TypeError, sum, 42)
1472 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1473 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001474 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1475 values = [bytearray(b'a'), bytearray(b'b')]
1476 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001477 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1478 self.assertRaises(TypeError, sum, [{2:3}])
1479 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001480 self.assertRaises(TypeError, sum, [], '')
1481 self.assertRaises(TypeError, sum, [], b'')
1482 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001483
1484 class BadSeq:
1485 def __getitem__(self, index):
1486 raise ValueError
1487 self.assertRaises(ValueError, sum, BadSeq())
1488
Mark Dickinson3a22b472009-10-17 21:48:16 +00001489 empty = []
1490 sum(([x] for x in range(10)), empty)
1491 self.assertEqual(empty, [])
1492
Walter Dörwald919497e2003-01-19 16:23:59 +00001493 def test_type(self):
1494 self.assertEqual(type(''), type('123'))
1495 self.assertNotEqual(type(''), type(()))
1496
Guido van Rossumfee7b932005-01-16 00:21:28 +00001497 # We don't want self in vars(), so these are static methods
1498
1499 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001500 def get_vars_f0():
1501 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001502
Guido van Rossumfee7b932005-01-16 00:21:28 +00001503 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001504 def get_vars_f2():
1505 BuiltinTest.get_vars_f0()
1506 a = 1
1507 b = 2
1508 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001509
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001510 class C_get_vars(object):
1511 def getDict(self):
1512 return {'a':2}
1513 __dict__ = property(fget=getDict)
1514
Walter Dörwald919497e2003-01-19 16:23:59 +00001515 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001516 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001517 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001518 self.assertEqual(self.get_vars_f0(), {})
1519 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1520 self.assertRaises(TypeError, vars, 42, 42)
1521 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001522 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001523
1524 def test_zip(self):
1525 a = (1, 2, 3)
1526 b = (4, 5, 6)
1527 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001528 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001529 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001530 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001531 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001532 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001533 class I:
1534 def __getitem__(self, i):
1535 if i < 0 or i > 2: raise IndexError
1536 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001537 self.assertEqual(list(zip(a, I())), t)
1538 self.assertEqual(list(zip()), [])
1539 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001540 self.assertRaises(TypeError, zip, None)
1541 class G:
1542 pass
1543 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001544 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001545
1546 # Make sure zip doesn't try to allocate a billion elements for the
1547 # result list when one of its arguments doesn't say how long it is.
1548 # A MemoryError is the most likely failure mode.
1549 class SequenceWithoutALength:
1550 def __getitem__(self, i):
1551 if i == 5:
1552 raise IndexError
1553 else:
1554 return i
1555 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001556 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001557 list(enumerate(range(5)))
1558 )
1559
1560 class BadSeq:
1561 def __getitem__(self, i):
1562 if i == 5:
1563 raise ValueError
1564 else:
1565 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001566 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001567
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001568 def test_zip_pickle(self):
1569 a = (1, 2, 3)
1570 b = (4, 5, 6)
1571 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001572 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1573 z1 = zip(a, b)
1574 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001575
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001576 def test_zip_bad_iterable(self):
1577 exception = TypeError()
1578
1579 class BadIterable:
1580 def __iter__(self):
1581 raise exception
1582
1583 with self.assertRaises(TypeError) as cm:
1584 zip(BadIterable())
1585
1586 self.assertIs(cm.exception, exception)
1587
Eric Smithe4d63172010-09-13 20:48:43 +00001588 def test_format(self):
1589 # Test the basic machinery of the format() builtin. Don't test
1590 # the specifics of the various formatters
1591 self.assertEqual(format(3, ''), '3')
1592
1593 # Returns some classes to use for various tests. There's
1594 # an old-style version, and a new-style version
1595 def classes_new():
1596 class A(object):
1597 def __init__(self, x):
1598 self.x = x
1599 def __format__(self, format_spec):
1600 return str(self.x) + format_spec
1601 class DerivedFromA(A):
1602 pass
1603
1604 class Simple(object): pass
1605 class DerivedFromSimple(Simple):
1606 def __init__(self, x):
1607 self.x = x
1608 def __format__(self, format_spec):
1609 return str(self.x) + format_spec
1610 class DerivedFromSimple2(DerivedFromSimple): pass
1611 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1612
1613 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1614 self.assertEqual(format(A(3), 'spec'), '3spec')
1615 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1616 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1617 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1618 '10abcdef')
1619
1620 class_test(*classes_new())
1621
1622 def empty_format_spec(value):
1623 # test that:
1624 # format(x, '') == str(x)
1625 # format(x) == str(x)
1626 self.assertEqual(format(value, ""), str(value))
1627 self.assertEqual(format(value), str(value))
1628
1629 # for builtin types, format(x, "") == str(x)
1630 empty_format_spec(17**13)
1631 empty_format_spec(1.0)
1632 empty_format_spec(3.1415e104)
1633 empty_format_spec(-3.1415e104)
1634 empty_format_spec(3.1415e-104)
1635 empty_format_spec(-3.1415e-104)
1636 empty_format_spec(object)
1637 empty_format_spec(None)
1638
1639 # TypeError because self.__format__ returns the wrong type
1640 class BadFormatResult:
1641 def __format__(self, format_spec):
1642 return 1.0
1643 self.assertRaises(TypeError, format, BadFormatResult(), "")
1644
1645 # TypeError because format_spec is not unicode or str
1646 self.assertRaises(TypeError, format, object(), 4)
1647 self.assertRaises(TypeError, format, object(), object())
1648
1649 # tests for object.__format__ really belong elsewhere, but
1650 # there's no good place to put them
1651 x = object().__format__('')
1652 self.assertTrue(x.startswith('<object object at'))
1653
1654 # first argument to object.__format__ must be string
1655 self.assertRaises(TypeError, object().__format__, 3)
1656 self.assertRaises(TypeError, object().__format__, object())
1657 self.assertRaises(TypeError, object().__format__, None)
1658
1659 # --------------------------------------------------------------------
1660 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001661 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001662 class A:
1663 def __format__(self, fmt_str):
1664 return format('', fmt_str)
1665
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001666 self.assertEqual(format(A()), '')
1667 self.assertEqual(format(A(), ''), '')
1668 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001669
1670 class B:
1671 pass
1672
1673 class C(object):
1674 pass
1675
1676 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001677 obj = cls()
1678 self.assertEqual(format(obj), str(obj))
1679 self.assertEqual(format(obj, ''), str(obj))
1680 with self.assertRaisesRegex(TypeError,
1681 r'\b%s\b' % re.escape(cls.__name__)):
1682 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001683 # --------------------------------------------------------------------
1684
1685 # make sure we can take a subclass of str as a format spec
1686 class DerivedFromStr(str): pass
1687 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1688
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001689 def test_bin(self):
1690 self.assertEqual(bin(0), '0b0')
1691 self.assertEqual(bin(1), '0b1')
1692 self.assertEqual(bin(-1), '-0b1')
1693 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1694 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1695 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1696 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1697
Georg Brandl953152f2009-07-22 12:03:59 +00001698 def test_bytearray_translate(self):
1699 x = bytearray(b"abc")
1700 self.assertRaises(ValueError, x.translate, b"1", 1)
1701 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1702
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001703 def test_bytearray_extend_error(self):
1704 array = bytearray()
1705 bad_iter = map(int, "X")
1706 self.assertRaises(ValueError, array.extend, bad_iter)
1707
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001708 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001709 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001710 tp = type(const)
1711 self.assertIs(tp(), const)
1712 self.assertRaises(TypeError, tp, 1, 2)
1713 self.assertRaises(TypeError, tp, a=1, b=2)
1714
MojoVampire469325c2020-03-03 18:50:17 +00001715 def test_warning_notimplemented(self):
1716 # Issue #35712: NotImplemented is a sentinel value that should never
1717 # be evaluated in a boolean context (virtually all such use cases
1718 # are a result of accidental misuse implementing rich comparison
1719 # operations in terms of one another).
1720 # For the time being, it will continue to evaluate as truthy, but
1721 # issue a deprecation warning (with the eventual intent to make it
1722 # a TypeError).
1723 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1724 with self.assertWarns(DeprecationWarning):
1725 self.assertTrue(NotImplemented)
1726 with self.assertWarns(DeprecationWarning):
1727 self.assertFalse(not NotImplemented)
1728
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001729
1730class TestBreakpoint(unittest.TestCase):
1731 def setUp(self):
1732 # These tests require a clean slate environment. For example, if the
1733 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1734 # will mess up these tests. Similarly for sys.breakpointhook.
1735 # Cleaning the slate here means you can't use breakpoint() to debug
1736 # these tests, but I think that's okay. Just use pdb.set_trace() if
1737 # you must.
1738 self.resources = ExitStack()
1739 self.addCleanup(self.resources.close)
1740 self.env = self.resources.enter_context(EnvironmentVarGuard())
1741 del self.env['PYTHONBREAKPOINT']
1742 self.resources.enter_context(
1743 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1744
1745 def test_breakpoint(self):
1746 with patch('pdb.set_trace') as mock:
1747 breakpoint()
1748 mock.assert_called_once()
1749
1750 def test_breakpoint_with_breakpointhook_set(self):
1751 my_breakpointhook = MagicMock()
1752 sys.breakpointhook = my_breakpointhook
1753 breakpoint()
1754 my_breakpointhook.assert_called_once_with()
1755
1756 def test_breakpoint_with_breakpointhook_reset(self):
1757 my_breakpointhook = MagicMock()
1758 sys.breakpointhook = my_breakpointhook
1759 breakpoint()
1760 my_breakpointhook.assert_called_once_with()
1761 # Reset the hook and it will not be called again.
1762 sys.breakpointhook = sys.__breakpointhook__
1763 with patch('pdb.set_trace') as mock:
1764 breakpoint()
1765 mock.assert_called_once_with()
1766 my_breakpointhook.assert_called_once_with()
1767
1768 def test_breakpoint_with_args_and_keywords(self):
1769 my_breakpointhook = MagicMock()
1770 sys.breakpointhook = my_breakpointhook
1771 breakpoint(1, 2, 3, four=4, five=5)
1772 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1773
1774 def test_breakpoint_with_passthru_error(self):
1775 def my_breakpointhook():
1776 pass
1777 sys.breakpointhook = my_breakpointhook
1778 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1779
1780 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1781 def test_envar_good_path_builtin(self):
1782 self.env['PYTHONBREAKPOINT'] = 'int'
1783 with patch('builtins.int') as mock:
1784 breakpoint('7')
1785 mock.assert_called_once_with('7')
1786
1787 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1788 def test_envar_good_path_other(self):
1789 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1790 with patch('sys.exit') as mock:
1791 breakpoint()
1792 mock.assert_called_once_with()
1793
1794 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1795 def test_envar_good_path_noop_0(self):
1796 self.env['PYTHONBREAKPOINT'] = '0'
1797 with patch('pdb.set_trace') as mock:
1798 breakpoint()
1799 mock.assert_not_called()
1800
1801 def test_envar_good_path_empty_string(self):
1802 # PYTHONBREAKPOINT='' is the same as it not being set.
1803 self.env['PYTHONBREAKPOINT'] = ''
1804 with patch('pdb.set_trace') as mock:
1805 breakpoint()
1806 mock.assert_called_once_with()
1807
1808 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1809 def test_envar_unimportable(self):
1810 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001811 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001812 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001813 'nosuchbuiltin',
1814 'nosuchmodule.nosuchcallable',
1815 ):
1816 with self.subTest(envar=envar):
1817 self.env['PYTHONBREAKPOINT'] = envar
1818 mock = self.resources.enter_context(patch('pdb.set_trace'))
1819 w = self.resources.enter_context(check_warnings(quiet=True))
1820 breakpoint()
1821 self.assertEqual(
1822 str(w.message),
1823 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1824 self.assertEqual(w.category, RuntimeWarning)
1825 mock.assert_not_called()
1826
1827 def test_envar_ignored_when_hook_is_set(self):
1828 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1829 with patch('sys.exit') as mock:
1830 sys.breakpointhook = int
1831 breakpoint()
1832 mock.assert_not_called()
1833
1834
Martin Panterc9a6ab52015-10-10 01:25:38 +00001835@unittest.skipUnless(pty, "the pty and signal modules must be available")
1836class PtyTests(unittest.TestCase):
1837 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1838 terminals in the test environment"""
1839
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001840 @staticmethod
1841 def handle_sighup(signum, frame):
1842 # bpo-40140: if the process is the session leader, os.close(fd)
1843 # of "pid, fd = pty.fork()" can raise SIGHUP signal:
1844 # just ignore the signal.
1845 pass
1846
Martin Pantere44dba32015-10-10 05:27:15 +00001847 def run_child(self, child, terminal_input):
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001848 old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
1849 try:
1850 return self._run_child(child, terminal_input)
1851 finally:
1852 signal.signal(signal.SIGHUP, old_sighup)
1853
1854 def _run_child(self, child, terminal_input):
Martin Pantere44dba32015-10-10 05:27:15 +00001855 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001856 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001857 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001858 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001859 os.close(r)
1860 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001861 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001862 raise
Victor Stinner16d75672020-04-01 00:27:18 +02001863
Martin Panterc9a6ab52015-10-10 01:25:38 +00001864 if pid == 0:
1865 # Child
1866 try:
1867 # Make sure we don't get stuck if there's a problem
1868 signal.alarm(2)
1869 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001870 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001871 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001872 except:
1873 traceback.print_exc()
1874 finally:
1875 # We don't want to return to unittest...
1876 os._exit(0)
Victor Stinner16d75672020-04-01 00:27:18 +02001877
Martin Panterc9a6ab52015-10-10 01:25:38 +00001878 # Parent
1879 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001880 os.write(fd, terminal_input)
Victor Stinner16d75672020-04-01 00:27:18 +02001881
Martin Panterc9a6ab52015-10-10 01:25:38 +00001882 # Get results from the pipe
1883 with open(r, "r") as rpipe:
1884 lines = []
1885 while True:
1886 line = rpipe.readline().strip()
1887 if line == "":
1888 # The other end was closed => the child exited
1889 break
1890 lines.append(line)
Victor Stinner16d75672020-04-01 00:27:18 +02001891
Martin Panterc9a6ab52015-10-10 01:25:38 +00001892 # Check the result was got and corresponds to the user's terminal input
1893 if len(lines) != 2:
1894 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001895 # Beware of Linux raising EIO when the slave is closed
1896 child_output = bytearray()
1897 while True:
1898 try:
1899 chunk = os.read(fd, 3000)
1900 except OSError: # Assume EIO
1901 break
1902 if not chunk:
1903 break
1904 child_output.extend(chunk)
1905 os.close(fd)
1906 child_output = child_output.decode("ascii", "ignore")
1907 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1908 % (len(lines), child_output))
Victor Stinner4baca1b2017-08-09 17:44:19 +02001909
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001910 # bpo-40155: Close the PTY before waiting for the child process
1911 # completion, otherwise the child process hangs on AIX.
Victor Stinner16d75672020-04-01 00:27:18 +02001912 os.close(fd)
1913
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001914 support.wait_process(pid, exitcode=0)
1915
Martin Pantere44dba32015-10-10 05:27:15 +00001916 return lines
1917
1918 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1919 if not sys.stdin.isatty() or not sys.stdout.isatty():
1920 self.skipTest("stdin and stdout must be ttys")
1921 def child(wpipe):
1922 # Check the error handlers are accounted for
1923 if stdio_encoding:
1924 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1925 encoding=stdio_encoding,
1926 errors='surrogateescape')
1927 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1928 encoding=stdio_encoding,
1929 errors='replace')
1930 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1931 print(ascii(input(prompt)), file=wpipe)
1932 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001933 # Check we did exercise the GNU readline path
1934 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1935 if lines[0] != 'tty = True':
1936 self.skipTest("standard IO in should have been a tty")
1937 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1938 if stdio_encoding:
1939 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1940 else:
1941 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1942 self.assertEqual(input_result, expected)
1943
1944 def test_input_tty(self):
1945 # Test input() functionality when wired to a tty (the code path
1946 # is different and invokes GNU readline if available).
1947 self.check_input_tty("prompt", b"quux")
1948
1949 def test_input_tty_non_ascii(self):
1950 # Check stdin/stdout encoding is used when invoking GNU readline
1951 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1952
1953 def test_input_tty_non_ascii_unicode_errors(self):
1954 # Check stdin/stdout error handler is used when invoking GNU readline
1955 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1956
1957 def test_input_no_stdout_fileno(self):
1958 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1959 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001960 def child(wpipe):
1961 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1962 sys.stdout = io.StringIO() # Does not support fileno()
1963 input("prompt")
1964 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1965 lines = self.run_child(child, b"quux\r")
1966 expected = (
1967 "stdin.isatty(): True",
1968 "captured: 'prompt'",
1969 )
1970 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001971
Raymond Hettinger64958a12003-12-17 20:43:33 +00001972class TestSorted(unittest.TestCase):
1973
1974 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001975 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001976 copy = data[:]
1977 random.shuffle(copy)
1978 self.assertEqual(data, sorted(copy))
1979 self.assertNotEqual(data, copy)
1980
1981 data.reverse()
1982 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001983 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1984 self.assertNotEqual(data, copy)
1985 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001986 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001987 self.assertNotEqual(data, copy)
1988
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001989 def test_bad_arguments(self):
1990 # Issue #29327: The first argument is positional-only.
1991 sorted([])
1992 with self.assertRaises(TypeError):
1993 sorted(iterable=[])
1994 # Other arguments are keyword-only
1995 sorted([], key=None)
1996 with self.assertRaises(TypeError):
1997 sorted([], None)
1998
Raymond Hettinger64958a12003-12-17 20:43:33 +00001999 def test_inputtypes(self):
2000 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002001 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002002 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002003 self.assertEqual(sorted(s), sorted(T(s)))
2004
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002005 s = ''.join(set(s)) # unique letters only
2006 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002007 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002008 self.assertEqual(sorted(s), sorted(T(s)))
2009
2010 def test_baddecorator(self):
2011 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2012 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2013
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002014
2015class ShutdownTest(unittest.TestCase):
2016
2017 def test_cleanup(self):
2018 # Issue #19255: builtins are still available at shutdown
2019 code = """if 1:
2020 import builtins
2021 import sys
2022
2023 class C:
2024 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002025 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002026 # Check that builtins still exist
2027 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002028 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002029
2030 c = C()
2031 # Make this module survive until builtins and sys are cleaned
2032 builtins.here = sys.modules[__name__]
2033 sys.here = sys.modules[__name__]
2034 # Create a reference loop so that this module needs to go
2035 # through a GC phase.
2036 here = sys.modules[__name__]
2037 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002038 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2039 # otherwise the codec may be unloaded before C.__del__() is called, and
2040 # so print("before") fails because the codec cannot be used to encode
2041 # "before" to sys.stdout.encoding. For example, on Windows,
2042 # sys.stdout.encoding is the OEM code page and these code pages are
2043 # implemented in Python
2044 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002045 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002046 self.assertEqual(["before", "after"], out.decode().splitlines())
2047
2048
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002049class TestType(unittest.TestCase):
2050 def test_new_type(self):
2051 A = type('A', (), {})
2052 self.assertEqual(A.__name__, 'A')
2053 self.assertEqual(A.__qualname__, 'A')
2054 self.assertEqual(A.__module__, __name__)
2055 self.assertEqual(A.__bases__, (object,))
2056 self.assertIs(A.__base__, object)
2057 x = A()
2058 self.assertIs(type(x), A)
2059 self.assertIs(x.__class__, A)
2060
2061 class B:
2062 def ham(self):
2063 return 'ham%d' % self
2064 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2065 self.assertEqual(C.__name__, 'C')
2066 self.assertEqual(C.__qualname__, 'C')
2067 self.assertEqual(C.__module__, __name__)
2068 self.assertEqual(C.__bases__, (B, int))
2069 self.assertIs(C.__base__, int)
2070 self.assertIn('spam', C.__dict__)
2071 self.assertNotIn('ham', C.__dict__)
2072 x = C(42)
2073 self.assertEqual(x, 42)
2074 self.assertIs(type(x), C)
2075 self.assertIs(x.__class__, C)
2076 self.assertEqual(x.ham(), 'ham42')
2077 self.assertEqual(x.spam(), 'spam42')
2078 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2079
Nick Coghland78448e2016-07-30 16:26:03 +10002080 def test_type_nokwargs(self):
2081 with self.assertRaises(TypeError):
2082 type('a', (), {}, x=5)
2083 with self.assertRaises(TypeError):
2084 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002085
2086 def test_type_name(self):
2087 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2088 with self.subTest(name=name):
2089 A = type(name, (), {})
2090 self.assertEqual(A.__name__, name)
2091 self.assertEqual(A.__qualname__, name)
2092 self.assertEqual(A.__module__, __name__)
2093 with self.assertRaises(ValueError):
2094 type('A\x00B', (), {})
2095 with self.assertRaises(ValueError):
2096 type('A\udcdcB', (), {})
2097 with self.assertRaises(TypeError):
2098 type(b'A', (), {})
2099
2100 C = type('C', (), {})
2101 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2102 with self.subTest(name=name):
2103 C.__name__ = name
2104 self.assertEqual(C.__name__, name)
2105 self.assertEqual(C.__qualname__, 'C')
2106 self.assertEqual(C.__module__, __name__)
2107
2108 A = type('C', (), {})
2109 with self.assertRaises(ValueError):
2110 A.__name__ = 'A\x00B'
2111 self.assertEqual(A.__name__, 'C')
2112 with self.assertRaises(ValueError):
2113 A.__name__ = 'A\udcdcB'
2114 self.assertEqual(A.__name__, 'C')
2115 with self.assertRaises(TypeError):
2116 A.__name__ = b'A'
2117 self.assertEqual(A.__name__, 'C')
2118
2119 def test_type_qualname(self):
2120 A = type('A', (), {'__qualname__': 'B.C'})
2121 self.assertEqual(A.__name__, 'A')
2122 self.assertEqual(A.__qualname__, 'B.C')
2123 self.assertEqual(A.__module__, __name__)
2124 with self.assertRaises(TypeError):
2125 type('A', (), {'__qualname__': b'B'})
2126 self.assertEqual(A.__qualname__, 'B.C')
2127
2128 A.__qualname__ = 'D.E'
2129 self.assertEqual(A.__name__, 'A')
2130 self.assertEqual(A.__qualname__, 'D.E')
2131 with self.assertRaises(TypeError):
2132 A.__qualname__ = b'B'
2133 self.assertEqual(A.__qualname__, 'D.E')
2134
2135 def test_type_doc(self):
2136 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2137 A = type('A', (), {'__doc__': doc})
2138 self.assertEqual(A.__doc__, doc)
2139 with self.assertRaises(UnicodeEncodeError):
2140 type('A', (), {'__doc__': 'x\udcdcy'})
2141
2142 A = type('A', (), {})
2143 self.assertEqual(A.__doc__, None)
2144 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2145 A.__doc__ = doc
2146 self.assertEqual(A.__doc__, doc)
2147
2148 def test_bad_args(self):
2149 with self.assertRaises(TypeError):
2150 type()
2151 with self.assertRaises(TypeError):
2152 type('A', ())
2153 with self.assertRaises(TypeError):
2154 type('A', (), {}, ())
2155 with self.assertRaises(TypeError):
2156 type('A', (), dict={})
2157 with self.assertRaises(TypeError):
2158 type('A', [], {})
2159 with self.assertRaises(TypeError):
2160 type('A', (), types.MappingProxyType({}))
2161 with self.assertRaises(TypeError):
2162 type('A', (None,), {})
2163 with self.assertRaises(TypeError):
2164 type('A', (bool,), {})
2165 with self.assertRaises(TypeError):
2166 type('A', (int, str), {})
2167
2168 def test_bad_slots(self):
2169 with self.assertRaises(TypeError):
2170 type('A', (), {'__slots__': b'x'})
2171 with self.assertRaises(TypeError):
2172 type('A', (int,), {'__slots__': 'x'})
2173 with self.assertRaises(TypeError):
2174 type('A', (), {'__slots__': ''})
2175 with self.assertRaises(TypeError):
2176 type('A', (), {'__slots__': '42'})
2177 with self.assertRaises(TypeError):
2178 type('A', (), {'__slots__': 'x\x00y'})
2179 with self.assertRaises(ValueError):
2180 type('A', (), {'__slots__': 'x', 'x': 0})
2181 with self.assertRaises(TypeError):
2182 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2183 with self.assertRaises(TypeError):
2184 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2185
2186 class B:
2187 pass
2188 with self.assertRaises(TypeError):
2189 type('A', (B,), {'__slots__': '__dict__'})
2190 with self.assertRaises(TypeError):
2191 type('A', (B,), {'__slots__': '__weakref__'})
2192
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002193 def test_namespace_order(self):
2194 # bpo-34320: namespace should preserve order
2195 od = collections.OrderedDict([('a', 1), ('b', 2)])
2196 od.move_to_end('a')
2197 expected = list(od.items())
2198
2199 C = type('C', (), od)
2200 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2201
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002202
Zachary Warea4b7a752013-11-24 01:19:09 -06002203def load_tests(loader, tests, pattern):
2204 from doctest import DocTestSuite
2205 tests.addTest(DocTestSuite(builtins))
2206 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002207
2208if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002209 unittest.main()