blob: 8c9573731ae2eda23b9a97b4819506324f93ceb3 [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
Brandt Bucher226a0122020-12-04 19:45:57 -08009import gc
Benjamin Peterson076e0312010-08-23 21:58:59 +000010import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020011import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010012import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000013import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020014import platform
15import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020016import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020017import sys
18import traceback
19import types
20import unittest
21import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040022from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040023from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070024from inspect import CO_COROUTINE
25from itertools import product
26from textwrap import dedent
27from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020028from operator import neg
Victor Stinner278c1e12020-03-31 20:08:12 +020029from test import support
Hai Shia7f5d932020-08-04 00:41:24 +080030from test.support import (swap_attr, maybe_get_event_loop_policy)
31from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink)
Berker Peksagce643912015-05-06 06:33:17 +030032from test.support.script_helper import assert_python_ok
Hai Shia7f5d932020-08-04 00:41:24 +080033from test.support.warnings_helper import check_warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040034from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010035try:
Antoine Pitrou772add72011-11-06 02:37:42 +010036 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010037except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010038 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Guido van Rossum3bead091992-01-27 17:00:37 +000040
Walter Dörwald919497e2003-01-19 16:23:59 +000041class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000042
Walter Dörwald919497e2003-01-19 16:23:59 +000043 def __init__(self, max):
44 self.max = max
45 self.sofar = []
46
47 def __len__(self): return len(self.sofar)
48
49 def __getitem__(self, i):
50 if not 0 <= i < self.max: raise IndexError
51 n = len(self.sofar)
52 while n <= i:
53 self.sofar.append(n*n)
54 n += 1
55 return self.sofar[i]
56
57class StrSquares:
58
59 def __init__(self, max):
60 self.max = max
61 self.sofar = []
62
63 def __len__(self):
64 return len(self.sofar)
65
66 def __getitem__(self, i):
67 if not 0 <= i < self.max:
68 raise IndexError
69 n = len(self.sofar)
70 while n <= i:
71 self.sofar.append(str(n*n))
72 n += 1
73 return self.sofar[i]
74
75class BitBucket:
76 def write(self, line):
77 pass
78
Facundo Batista2336bdd2008-01-19 19:12:01 +000079test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000080 ('0', 0),
81 ('1', 1),
82 ('9', 9),
83 ('10', 10),
84 ('99', 99),
85 ('100', 100),
86 ('314', 314),
87 (' 314', 314),
88 ('314 ', 314),
89 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000090 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000091 (' 1x', ValueError),
92 (' 1 ', 1),
93 (' 1\02 ', ValueError),
94 ('', ValueError),
95 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000096 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040097 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000098 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000099]
100
Facundo Batista2336bdd2008-01-19 19:12:01 +0000101test_conv_sign = [
102 ('0', 0),
103 ('1', 1),
104 ('9', 9),
105 ('10', 10),
106 ('99', 99),
107 ('100', 100),
108 ('314', 314),
109 (' 314', ValueError),
110 ('314 ', 314),
111 (' \t\t 314 \t\t ', ValueError),
112 (repr(sys.maxsize), sys.maxsize),
113 (' 1x', ValueError),
114 (' 1 ', ValueError),
115 (' 1\02 ', ValueError),
116 ('', ValueError),
117 (' ', ValueError),
118 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400119 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000120 (chr(0x200), ValueError),
121]
122
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000124 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000125 raise RuntimeError
126
127class TestFailingIter:
128 def __iter__(self):
129 raise RuntimeError
130
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000131def filter_char(arg):
132 return ord(arg) > ord("d")
133
134def map_char(arg):
135 return chr(ord(arg)+1)
136
Walter Dörwald919497e2003-01-19 16:23:59 +0000137class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000138 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200139 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000140 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200141 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000142 it = pickle.loads(d)
143 self.assertEqual(type(itorg), type(it))
144 self.assertEqual(list(it), seq)
145
146 #test the iterator after dropping one from it
147 it = pickle.loads(d)
148 try:
149 next(it)
150 except StopIteration:
151 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200152 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000153 it = pickle.loads(d)
154 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000155
156 def test_import(self):
157 __import__('sys')
158 __import__('time')
159 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000160 __import__(name='sys')
161 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000162 self.assertRaises(ImportError, __import__, 'spamspam')
163 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000164 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000165 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000166 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100167 with self.assertWarns(ImportWarning):
168 self.assertRaises(ImportError, __import__, '',
169 {'__package__': None, '__spec__': None, '__name__': '__main__'},
170 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300171 # embedded null character
172 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000173
174 def test_abs(self):
175 # int
176 self.assertEqual(abs(0), 0)
177 self.assertEqual(abs(1234), 1234)
178 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000179 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000180 # float
181 self.assertEqual(abs(0.0), 0.0)
182 self.assertEqual(abs(3.14), 3.14)
183 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 # str
185 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000186 # bool
187 self.assertEqual(abs(True), 1)
188 self.assertEqual(abs(False), 0)
189 # other
190 self.assertRaises(TypeError, abs)
191 self.assertRaises(TypeError, abs, None)
192 class AbsClass(object):
193 def __abs__(self):
194 return -5
195 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000196
Raymond Hettinger96229b12005-03-11 06:49:40 +0000197 def test_all(self):
198 self.assertEqual(all([2, 4, 6]), True)
199 self.assertEqual(all([2, None, 6]), False)
200 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
201 self.assertRaises(RuntimeError, all, TestFailingIter())
202 self.assertRaises(TypeError, all, 10) # Non-iterable
203 self.assertRaises(TypeError, all) # No args
204 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
205 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200206 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000207 S = [50, 60]
208 self.assertEqual(all(x > 42 for x in S), True)
209 S = [50, 40, 60]
210 self.assertEqual(all(x > 42 for x in S), False)
211
212 def test_any(self):
213 self.assertEqual(any([None, None, None]), False)
214 self.assertEqual(any([None, 4, None]), True)
215 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500216 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000217 self.assertRaises(TypeError, any, 10) # Non-iterable
218 self.assertRaises(TypeError, any) # No args
219 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
220 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200221 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000222 S = [40, 60, 30]
223 self.assertEqual(any(x > 42 for x in S), True)
224 S = [10, 20, 30]
225 self.assertEqual(any(x > 42 for x in S), False)
226
Georg Brandl559e5d72008-06-11 18:37:52 +0000227 def test_ascii(self):
228 self.assertEqual(ascii(''), '\'\'')
229 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000230 self.assertEqual(ascii(()), '()')
231 self.assertEqual(ascii([]), '[]')
232 self.assertEqual(ascii({}), '{}')
233 a = []
234 a.append(a)
235 self.assertEqual(ascii(a), '[[...]]')
236 a = {}
237 a[0] = a
238 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000239 # Advanced checks for unicode strings
240 def _check_uni(s):
241 self.assertEqual(ascii(s), repr(s))
242 _check_uni("'")
243 _check_uni('"')
244 _check_uni('"\'')
245 _check_uni('\0')
246 _check_uni('\r\n\t .')
247 # Unprintable non-ASCII characters
248 _check_uni('\x85')
249 _check_uni('\u1fff')
250 _check_uni('\U00012fff')
251 # Lone surrogates
252 _check_uni('\ud800')
253 _check_uni('\udfff')
254 # Issue #9804: surrogates should be joined even for printable
255 # wide characters (UCS-2 builds).
256 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
257 # All together
258 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
259 self.assertEqual(ascii(s),
260 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000261
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000263 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000264 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000265 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000266
Walter Dörwald919497e2003-01-19 16:23:59 +0000267 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000268 self.assertTrue(callable(len))
269 self.assertFalse(callable("a"))
270 self.assertTrue(callable(callable))
271 self.assertTrue(callable(lambda x, y: x + y))
272 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000273 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000274 self.assertTrue(callable(f))
275
276 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000277 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000278 self.assertTrue(callable(C1))
279 c = C1()
280 self.assertTrue(callable(c.meth))
281 self.assertFalse(callable(c))
282
283 # __call__ is looked up on the class, not the instance
284 c.__call__ = None
285 self.assertFalse(callable(c))
286 c.__call__ = lambda self: 0
287 self.assertFalse(callable(c))
288 del c.__call__
289 self.assertFalse(callable(c))
290
291 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000292 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000293 c2 = C2()
294 self.assertTrue(callable(c2))
295 c2.__call__ = None
296 self.assertTrue(callable(c2))
297 class C3(C2): pass
298 c3 = C3()
299 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000300
301 def test_chr(self):
302 self.assertEqual(chr(32), ' ')
303 self.assertEqual(chr(65), 'A')
304 self.assertEqual(chr(97), 'a')
305 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000306 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000307 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300308 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000309 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000310 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
311 self.assertEqual(chr(0x00010000), "\U00010000")
312 self.assertEqual(chr(0x00010001), "\U00010001")
313 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
314 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
315 self.assertEqual(chr(0x00100000), "\U00100000")
316 self.assertEqual(chr(0x00100001), "\U00100001")
317 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
318 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
319 self.assertRaises(ValueError, chr, -1)
320 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000321 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000322
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000323 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000324 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000325
Walter Dörwald919497e2003-01-19 16:23:59 +0000326 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000327 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000328 bom = b'\xef\xbb\xbf'
329 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300331 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
332 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000333 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000335 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
336 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300337 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
339 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000340 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300341 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000342 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000343
Georg Brandl8334fd92010-12-04 10:26:46 +0000344 # test the optimize argument
345
346 codestr = '''def f():
347 """doc"""
diana543386b2017-10-03 10:46:56 -0600348 debug_enabled = False
349 if __debug__:
350 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000351 try:
352 assert False
353 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200354 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000355 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200356 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000357 '''
358 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200359 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
360 (0, True, 'doc', True, True),
361 (1, False, 'doc', False, False),
362 (2, False, None, False, False)]
363 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000364 # test both direct compilation and compilation via AST
365 codeobjs = []
366 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
367 tree = ast.parse(codestr)
368 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
369 for code in codeobjs:
370 ns = {}
371 exec(code, ns)
372 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200373 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000374
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700375 def test_compile_top_level_await_no_coro(self):
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100376 """Make sure top level non-await codes get the correct coroutine flags"""
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700377 modes = ('single', 'exec')
378 code_samples = [
379 '''def f():pass\n''',
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100380 '''[x for x in l]''',
381 '''{x for x in l}''',
382 '''(x for x in l)''',
383 '''{x:x for x in l}''',
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700384 ]
385 for mode, code_sample in product(modes, code_samples):
386 source = dedent(code_sample)
387 co = compile(source,
388 '?',
389 mode,
390 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
391
392 self.assertNotEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
393 msg=f"source={source} mode={mode}")
394
395
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700396 def test_compile_top_level_await(self):
397 """Test whether code some top level await can be compiled.
398
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
400 set, and make sure the generated code object has the CO_COROUTINE flag
401 set in order to execute it with `await eval(.....)` instead of exec,
402 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700403 """
404
405 # helper function just to check we can run top=level async-for
406 async def arange(n):
407 for i in range(n):
408 yield i
409
410 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400411 code_samples = [
412 '''a = await asyncio.sleep(0, result=1)''',
413 '''async for i in arange(1):
414 a = 1''',
415 '''async with asyncio.Lock() as l:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300416 a = 1''',
417 '''a = [x async for x in arange(2)][1]''',
418 '''a = 1 in {x async for x in arange(2)}''',
419 '''a = {x:1 async for x in arange(1)}[0]''',
420 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
421 '''a = [x async for x in (x async for x in arange(5))][1]''',
422 '''a, = [1 for x in {x async for x in arange(1)}]''',
423 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400424 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700425 policy = maybe_get_event_loop_policy()
426 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400427 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700428 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400429 with self.assertRaises(
430 SyntaxError, msg=f"source={source} mode={mode}"):
431 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700432
433 co = compile(source,
434 '?',
435 mode,
436 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
437
438 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400439 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700440
441 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400442 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700443 async_f = FunctionType(co, globals_)
444 asyncio.run(async_f())
445 self.assertEqual(globals_['a'], 1)
446
447 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400448 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700449 asyncio.run(eval(co, globals_))
450 self.assertEqual(globals_['a'], 1)
451 finally:
452 asyncio.set_event_loop_policy(policy)
453
Pablo Galindo90235812020-03-15 04:29:22 +0000454 def test_compile_top_level_await_invalid_cases(self):
455 # helper function just to check we can run top=level async-for
456 async def arange(n):
457 for i in range(n):
458 yield i
459
460 modes = ('single', 'exec')
461 code_samples = [
462 '''def f(): await arange(10)\n''',
463 '''def f(): [x async for x in arange(10)]\n''',
464 '''def f(): [await x async for x in arange(10)]\n''',
465 '''def f():
466 async for i in arange(1):
467 a = 1
468 ''',
469 '''def f():
470 async with asyncio.Lock() as l:
471 a = 1
472 '''
473 ]
474 policy = maybe_get_event_loop_policy()
475 try:
476 for mode, code_sample in product(modes, code_samples):
477 source = dedent(code_sample)
478 with self.assertRaises(
479 SyntaxError, msg=f"source={source} mode={mode}"):
480 compile(source, '?', mode)
481
482 with self.assertRaises(
483 SyntaxError, msg=f"source={source} mode={mode}"):
484 co = compile(source,
485 '?',
486 mode,
487 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
488 finally:
489 asyncio.set_event_loop_policy(policy)
490
491
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700492 def test_compile_async_generator(self):
493 """
494 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400495 make sure AsyncGenerators are still properly not marked with the
496 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700497 """
498 code = dedent("""async def ticker():
499 for i in range(10):
500 yield i
501 await asyncio.sleep(0)""")
502
503 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
504 glob = {}
505 exec(co, glob)
506 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
507
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000509 sys.spam = 1
510 delattr(sys, 'spam')
511 self.assertRaises(TypeError, delattr)
512
513 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000514 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000515 self.assertRaises(TypeError, dir, 42, 42)
516
Georg Brandle32b4222007-03-10 22:13:27 +0000517 # dir() - local scope
518 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000519 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000520
521 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000522 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000523
524 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000525 class Foo(types.ModuleType):
526 __dict__ = 8
527 f = Foo("foo")
528 self.assertRaises(TypeError, dir, f)
529
530 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000531 self.assertIn("strip", dir(str))
532 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000533
534 # dir(obj)
535 class Foo(object):
536 def __init__(self):
537 self.x = 7
538 self.y = 8
539 self.z = 9
540 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000541 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000542
543 # dir(obj_no__dict__)
544 class Foo(object):
545 __slots__ = []
546 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000547 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000548
549 # dir(obj_no__class__with__dict__)
550 # (an ugly trick to cause getattr(f, "__class__") to fail)
551 class Foo(object):
552 __slots__ = ["__class__", "__dict__"]
553 def __init__(self):
554 self.bar = "wow"
555 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000556 self.assertNotIn("__repr__", dir(f))
557 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000558
559 # dir(obj_using __dir__)
560 class Foo(object):
561 def __dir__(self):
562 return ["kan", "ga", "roo"]
563 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000564 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000565
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500566 # dir(obj__dir__tuple)
567 class Foo(object):
568 def __dir__(self):
569 return ("b", "c", "a")
570 res = dir(Foo())
571 self.assertIsInstance(res, list)
572 self.assertTrue(res == ["a", "b", "c"])
573
574 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000575 class Foo(object):
576 def __dir__(self):
577 return 7
578 f = Foo()
579 self.assertRaises(TypeError, dir, f)
580
Collin Winter3eed7652007-08-14 17:53:54 +0000581 # dir(traceback)
582 try:
583 raise IndexError
584 except:
585 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
586
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500587 # test that object has a __dir__()
588 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000589
Walter Dörwald919497e2003-01-19 16:23:59 +0000590 def test_divmod(self):
591 self.assertEqual(divmod(12, 7), (1, 5))
592 self.assertEqual(divmod(-12, 7), (-2, 2))
593 self.assertEqual(divmod(12, -7), (-2, -2))
594 self.assertEqual(divmod(-12, -7), (1, -5))
595
Mark Dickinson5c2db372009-12-05 20:28:34 +0000596 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000597
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000598 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
599 (-3.25, 1.0, (-4.0, 0.75)),
600 (3.25, -1.0, (-4.0, -0.75)),
601 (-3.25, -1.0, (3.0, -0.25))]:
602 result = divmod(num, denom)
603 self.assertAlmostEqual(result[0], exp_result[0])
604 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000605
606 self.assertRaises(TypeError, divmod)
607
608 def test_eval(self):
609 self.assertEqual(eval('1+1'), 2)
610 self.assertEqual(eval(' 1+1\n'), 2)
611 globals = {'a': 1, 'b': 2}
612 locals = {'b': 200, 'c': 300}
613 self.assertEqual(eval('a', globals) , 1)
614 self.assertEqual(eval('a', globals, locals), 1)
615 self.assertEqual(eval('b', globals, locals), 200)
616 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 globals = {'a': 1, 'b': 2}
618 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000619 bom = b'\xef\xbb\xbf'
620 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000621 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 self.assertRaises(TypeError, eval)
623 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000624 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000625
Benjamin Peterson92722792012-12-15 12:51:05 -0500626 class X:
627 def __getitem__(self, key):
628 raise ValueError
629 self.assertRaises(ValueError, eval, "foo", {}, X())
630
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000631 def test_general_eval(self):
632 # Tests that general mappings can be used for the locals argument
633
634 class M:
635 "Test mapping interface versus possible calls from eval()."
636 def __getitem__(self, key):
637 if key == 'a':
638 return 12
639 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000640 def keys(self):
641 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000642
643 m = M()
644 g = globals()
645 self.assertEqual(eval('a', g, m), 12)
646 self.assertRaises(NameError, eval, 'b', g, m)
647 self.assertEqual(eval('dir()', g, m), list('xyz'))
648 self.assertEqual(eval('globals()', g, m), g)
649 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000650 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000651 class A:
652 "Non-mapping"
653 pass
654 m = A()
655 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000656
657 # Verify that dict subclasses work as well
658 class D(dict):
659 def __getitem__(self, key):
660 if key == 'a':
661 return 12
662 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000663 def keys(self):
664 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000665
666 d = D()
667 self.assertEqual(eval('a', g, d), 12)
668 self.assertRaises(NameError, eval, 'b', g, d)
669 self.assertEqual(eval('dir()', g, d), list('xyz'))
670 self.assertEqual(eval('globals()', g, d), g)
671 self.assertEqual(eval('locals()', g, d), d)
672
673 # Verify locals stores (used by list comps)
674 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000675 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000676
677 class SpreadSheet:
678 "Sample application showing nested, calculated lookups."
679 _cells = {}
680 def __setitem__(self, key, formula):
681 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000682 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000683 return eval(self._cells[key], globals(), self)
684
685 ss = SpreadSheet()
686 ss['a1'] = '5'
687 ss['a2'] = 'a1*6'
688 ss['a3'] = 'a2*7'
689 self.assertEqual(ss['a3'], 210)
690
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000691 # Verify that dir() catches a non-list returned by eval
692 # SF bug #1004669
693 class C:
694 def __getitem__(self, item):
695 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000696 def keys(self):
697 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000698 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
699
Georg Brandl7cae87c2006-09-06 06:51:57 +0000700 def test_exec(self):
701 g = {}
702 exec('z = 1', g)
703 if '__builtins__' in g:
704 del g['__builtins__']
705 self.assertEqual(g, {'z': 1})
706
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000707 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000708 if '__builtins__' in g:
709 del g['__builtins__']
710 self.assertEqual(g, {'z': 2})
711 g = {}
712 l = {}
713
Brett Cannon77628992010-03-20 20:59:33 +0000714 with check_warnings():
715 warnings.filterwarnings("ignore", "global statement",
716 module="<string>")
717 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000718 if '__builtins__' in g:
719 del g['__builtins__']
720 if '__builtins__' in l:
721 del l['__builtins__']
722 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
723
Victor Stinnerb0b22422012-04-19 00:57:45 +0200724 def test_exec_globals(self):
725 code = compile("print('Hello World!')", "", "exec")
726 # no builtin function
727 self.assertRaisesRegex(NameError, "name 'print' is not defined",
728 exec, code, {'__builtins__': {}})
729 # __builtins__ must be a mapping type
730 self.assertRaises(TypeError,
731 exec, code, {'__builtins__': 123})
732
733 # no __build_class__ function
734 code = compile("class A: pass", "", "exec")
735 self.assertRaisesRegex(NameError, "__build_class__ not found",
736 exec, code, {'__builtins__': {}})
737
738 class frozendict_error(Exception):
739 pass
740
741 class frozendict(dict):
742 def __setitem__(self, key, value):
743 raise frozendict_error("frozendict is readonly")
744
745 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400746 if isinstance(__builtins__, types.ModuleType):
747 frozen_builtins = frozendict(__builtins__.__dict__)
748 else:
749 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200750 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
751 self.assertRaises(frozendict_error,
752 exec, code, {'__builtins__': frozen_builtins})
753
754 # read-only globals
755 namespace = frozendict({})
756 code = compile("x=1", "test", "exec")
757 self.assertRaises(frozendict_error,
758 exec, code, namespace)
759
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000760 def test_exec_redirected(self):
761 savestdout = sys.stdout
762 sys.stdout = None # Whatever that cannot flush()
763 try:
764 # Used to raise SystemError('error return without exception set')
765 exec('a')
766 except NameError:
767 pass
768 finally:
769 sys.stdout = savestdout
770
Walter Dörwald919497e2003-01-19 16:23:59 +0000771 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000772 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
773 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
774 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
775 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
776 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 def identity(item):
778 return 1
779 filter(identity, Squares(5))
780 self.assertRaises(TypeError, filter)
781 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000782 def __getitem__(self, index):
783 if index<4:
784 return 42
785 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000786 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000787 def badfunc():
788 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000790
Walter Dörwaldbf517072003-01-27 15:57:14 +0000791 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000792 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
793 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
794 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000795
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000796 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200797 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
798 f1 = filter(filter_char, "abcdeabcde")
799 f2 = filter(filter_char, "abcdeabcde")
800 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000801
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000803 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 self.assertRaises(TypeError, getattr, sys, 1)
805 self.assertRaises(TypeError, getattr, sys, 1, "foo")
806 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000807 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000808 # unicode surrogates are not encodable to the default encoding (utf8)
809 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000810
811 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000812 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 self.assertRaises(TypeError, hasattr, sys, 1)
814 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000815 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000816
Benjamin Peterson17689992010-08-24 03:26:23 +0000817 # Check that hasattr propagates all exceptions outside of
818 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000819 class A:
820 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000821 raise SystemExit
822 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000823 class B:
824 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000825 raise ValueError
826 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000827
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 def test_hash(self):
829 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000830 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000831 self.assertEqual(hash(1), hash(1.0))
832 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000833 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 hash((0,1,2,3))
835 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000836 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000837 self.assertRaises(TypeError, hash, [])
838 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000839 # Bug 1536021: Allow hash to return long objects
840 class X:
841 def __hash__(self):
842 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000843 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000844 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000845 def __hash__(self):
846 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000847 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000848
849 def test_hex(self):
850 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000851 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000852 self.assertRaises(TypeError, hex, {})
853
854 def test_id(self):
855 id(None)
856 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000857 id(1.0)
858 id('spam')
859 id((0,1,2,3))
860 id([0,1,2,3])
861 id({'spam': 1, 'eggs': 2, 'ham': 3})
862
Guido van Rossuma88a0332007-02-26 16:59:55 +0000863 # Test input() later, alphabetized as if it were raw_input
864
Walter Dörwald919497e2003-01-19 16:23:59 +0000865 def test_iter(self):
866 self.assertRaises(TypeError, iter)
867 self.assertRaises(TypeError, iter, 42, 42)
868 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 for l in lists:
870 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000871 self.assertEqual(next(i), '1')
872 self.assertEqual(next(i), '2')
873 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000874
875 def test_isinstance(self):
876 class C:
877 pass
878 class D(C):
879 pass
880 class E:
881 pass
882 c = C()
883 d = D()
884 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000885 self.assertTrue(isinstance(c, C))
886 self.assertTrue(isinstance(d, C))
887 self.assertTrue(not isinstance(e, C))
888 self.assertTrue(not isinstance(c, D))
889 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000890 self.assertRaises(TypeError, isinstance, E, 'foo')
891 self.assertRaises(TypeError, isinstance)
892
893 def test_issubclass(self):
894 class C:
895 pass
896 class D(C):
897 pass
898 class E:
899 pass
900 c = C()
901 d = D()
902 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000903 self.assertTrue(issubclass(D, C))
904 self.assertTrue(issubclass(C, C))
905 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 self.assertRaises(TypeError, issubclass, 'foo', E)
907 self.assertRaises(TypeError, issubclass, E, 'foo')
908 self.assertRaises(TypeError, issubclass)
909
910 def test_len(self):
911 self.assertEqual(len('123'), 3)
912 self.assertEqual(len(()), 0)
913 self.assertEqual(len((1, 2, 3, 4)), 4)
914 self.assertEqual(len([1, 2, 3, 4]), 4)
915 self.assertEqual(len({}), 0)
916 self.assertEqual(len({'a':1, 'b': 2}), 2)
917 class BadSeq:
918 def __len__(self):
919 raise ValueError
920 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000921 class InvalidLen:
922 def __len__(self):
923 return None
924 self.assertRaises(TypeError, len, InvalidLen())
925 class FloatLen:
926 def __len__(self):
927 return 4.5
928 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300929 class NegativeLen:
930 def __len__(self):
931 return -10
932 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000933 class HugeLen:
934 def __len__(self):
935 return sys.maxsize + 1
936 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300937 class HugeNegativeLen:
938 def __len__(self):
939 return -sys.maxsize-10
940 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000941 class NoLenMethod(object): pass
942 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000943
Walter Dörwald919497e2003-01-19 16:23:59 +0000944 def test_map(self):
945 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000946 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 [1, 4, 9]
948 )
949 try:
950 from math import sqrt
951 except ImportError:
952 def sqrt(x):
953 return pow(x, 0.5)
954 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000955 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000956 [[4.0, 2.0], [9.0, 3.0]]
957 )
958 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000959 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000960 [10, 4, 6]
961 )
962
963 def plus(*v):
964 accu = 0
965 for i in v: accu = accu + i
966 return accu
967 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000968 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000969 [1, 3, 7]
970 )
971 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000972 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000973 [1+4, 3+9, 7+2]
974 )
975 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000976 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000977 [1+4+1, 3+9+1, 7+2+0]
978 )
979 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000980 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000981 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
982 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000983 def Max(a, b):
984 if a is None:
985 return b
986 if b is None:
987 return a
988 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000990 list(map(Max, Squares(3), Squares(2))),
991 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 )
993 self.assertRaises(TypeError, map)
994 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000995 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000996 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000997 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000998 yield None
999 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001000 def badfunc(x):
1001 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001002 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001003
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001004 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +02001005 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1006 m1 = map(map_char, "Is this the real life?")
1007 m2 = map(map_char, "Is this the real life?")
1008 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001009
Walter Dörwald919497e2003-01-19 16:23:59 +00001010 def test_max(self):
1011 self.assertEqual(max('123123'), '3')
1012 self.assertEqual(max(1, 2, 3), 3)
1013 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1014 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1015
Guido van Rossume2a383d2007-01-15 16:59:06 +00001016 self.assertEqual(max(1, 2, 3.0), 3.0)
1017 self.assertEqual(max(1, 2.0, 3), 3)
1018 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001019
Dong-hee Naabdc6342020-01-11 01:31:43 +09001020 with self.assertRaisesRegex(
1021 TypeError,
1022 'max expected at least 1 argument, got 0'
1023 ):
1024 max()
1025
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001026 self.assertRaises(TypeError, max, 42)
1027 self.assertRaises(ValueError, max, ())
1028 class BadSeq:
1029 def __getitem__(self, index):
1030 raise ValueError
1031 self.assertRaises(ValueError, max, BadSeq())
1032
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001033 for stmt in (
1034 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001035 "max(default=None)",
1036 "max(1, 2, default=None)", # require container for default
1037 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001038 "max(1, key=int)", # single arg not iterable
1039 "max(1, 2, keystone=int)", # wrong keyword
1040 "max(1, 2, key=int, abc=int)", # two many keywords
1041 "max(1, 2, key=1)", # keyfunc is not callable
1042 ):
Tim Peters7f061872004-12-07 21:17:46 +00001043 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001044 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001045 except TypeError:
1046 pass
1047 else:
1048 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001049
1050 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1051 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1052 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1053
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001054 self.assertEqual(max((), default=None), None) # zero elem iterable
1055 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1056 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1057
1058 self.assertEqual(max((), default=1, key=neg), 1)
1059 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1060
Alexander Marshalove22072f2018-07-24 10:58:21 +07001061 self.assertEqual(max((1, 2), key=None), 2)
1062
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001063 data = [random.randrange(200) for i in range(100)]
1064 keys = dict((elem, random.randrange(50)) for elem in data)
1065 f = keys.__getitem__
1066 self.assertEqual(max(data, key=f),
1067 sorted(reversed(data), key=f)[-1])
1068
Walter Dörwald919497e2003-01-19 16:23:59 +00001069 def test_min(self):
1070 self.assertEqual(min('123123'), '1')
1071 self.assertEqual(min(1, 2, 3), 1)
1072 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1073 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1074
Guido van Rossume2a383d2007-01-15 16:59:06 +00001075 self.assertEqual(min(1, 2, 3.0), 1)
1076 self.assertEqual(min(1, 2.0, 3), 1)
1077 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001078
Dong-hee Naabdc6342020-01-11 01:31:43 +09001079 with self.assertRaisesRegex(
1080 TypeError,
1081 'min expected at least 1 argument, got 0'
1082 ):
1083 min()
1084
Walter Dörwald919497e2003-01-19 16:23:59 +00001085 self.assertRaises(TypeError, min, 42)
1086 self.assertRaises(ValueError, min, ())
1087 class BadSeq:
1088 def __getitem__(self, index):
1089 raise ValueError
1090 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001091
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001092 for stmt in (
1093 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001094 "min(default=None)",
1095 "min(1, 2, default=None)", # require container for default
1096 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001097 "min(1, key=int)", # single arg not iterable
1098 "min(1, 2, keystone=int)", # wrong keyword
1099 "min(1, 2, key=int, abc=int)", # two many keywords
1100 "min(1, 2, key=1)", # keyfunc is not callable
1101 ):
Tim Peters7f061872004-12-07 21:17:46 +00001102 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001103 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001104 except TypeError:
1105 pass
1106 else:
1107 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001108
1109 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1110 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1111 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1112
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001113 self.assertEqual(min((), default=None), None) # zero elem iterable
1114 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1115 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1116
1117 self.assertEqual(min((), default=1, key=neg), 1)
1118 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1119
Alexander Marshalove22072f2018-07-24 10:58:21 +07001120 self.assertEqual(min((1, 2), key=None), 1)
1121
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001122 data = [random.randrange(200) for i in range(100)]
1123 keys = dict((elem, random.randrange(50)) for elem in data)
1124 f = keys.__getitem__
1125 self.assertEqual(min(data, key=f),
1126 sorted(data, key=f)[0])
1127
Georg Brandla18af4e2007-04-21 15:47:16 +00001128 def test_next(self):
1129 it = iter(range(2))
1130 self.assertEqual(next(it), 0)
1131 self.assertEqual(next(it), 1)
1132 self.assertRaises(StopIteration, next, it)
1133 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001134 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001135
1136 class Iter(object):
1137 def __iter__(self):
1138 return self
1139 def __next__(self):
1140 raise StopIteration
1141
1142 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001143 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001144 self.assertRaises(StopIteration, next, it)
1145
1146 def gen():
1147 yield 1
1148 return
1149
1150 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001151 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001152 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001153 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001154
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001156 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001157 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001158 self.assertRaises(TypeError, oct, ())
1159
1160 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001161 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001162 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001163 self.addCleanup(unlink, TESTFN)
1164 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 fp.write('The quick brown fox jumps over the lazy dog')
1167 fp.write('.\n')
1168 fp.write('Dear John\n')
1169 fp.write('XXX'*100)
1170 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001171
1172 def test_open(self):
1173 self.write_testfile()
1174 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001175 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001177 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1178 self.assertEqual(fp.readline(4), 'Dear')
1179 self.assertEqual(fp.readline(100), ' John\n')
1180 self.assertEqual(fp.read(300), 'XXX'*100)
1181 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001182
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001183 # embedded null bytes and characters
1184 self.assertRaises(ValueError, open, 'a\x00b')
1185 self.assertRaises(ValueError, open, b'a\x00b')
1186
Victor Stinner91106cd2017-12-13 12:29:09 +01001187 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001188 def test_open_default_encoding(self):
1189 old_environ = dict(os.environ)
1190 try:
1191 # try to get a user preferred encoding different than the current
1192 # locale encoding to check that open() uses the current locale
1193 # encoding and not the user preferred encoding
1194 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1195 if key in os.environ:
1196 del os.environ[key]
1197
1198 self.write_testfile()
1199 current_locale_encoding = locale.getpreferredencoding(False)
1200 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001201 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001202 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001203 finally:
1204 os.environ.clear()
1205 os.environ.update(old_environ)
1206
Victor Stinnerdaf45552013-08-28 00:53:59 +02001207 def test_open_non_inheritable(self):
1208 fileobj = open(__file__)
1209 with fileobj:
1210 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1211
Walter Dörwald919497e2003-01-19 16:23:59 +00001212 def test_ord(self):
1213 self.assertEqual(ord(' '), 32)
1214 self.assertEqual(ord('A'), 65)
1215 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001216 self.assertEqual(ord('\x80'), 128)
1217 self.assertEqual(ord('\xff'), 255)
1218
1219 self.assertEqual(ord(b' '), 32)
1220 self.assertEqual(ord(b'A'), 65)
1221 self.assertEqual(ord(b'a'), 97)
1222 self.assertEqual(ord(b'\x80'), 128)
1223 self.assertEqual(ord(b'\xff'), 255)
1224
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001225 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001226 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001227
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001228 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1229 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1230 self.assertEqual(ord("\U00010000"), 0x00010000)
1231 self.assertEqual(ord("\U00010001"), 0x00010001)
1232 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1233 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1234 self.assertEqual(ord("\U00100000"), 0x00100000)
1235 self.assertEqual(ord("\U00100001"), 0x00100001)
1236 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1237 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1238
Walter Dörwald919497e2003-01-19 16:23:59 +00001239 def test_pow(self):
1240 self.assertEqual(pow(0,0), 1)
1241 self.assertEqual(pow(0,1), 0)
1242 self.assertEqual(pow(1,0), 1)
1243 self.assertEqual(pow(1,1), 1)
1244
1245 self.assertEqual(pow(2,0), 1)
1246 self.assertEqual(pow(2,10), 1024)
1247 self.assertEqual(pow(2,20), 1024*1024)
1248 self.assertEqual(pow(2,30), 1024*1024*1024)
1249
1250 self.assertEqual(pow(-2,0), 1)
1251 self.assertEqual(pow(-2,1), -2)
1252 self.assertEqual(pow(-2,2), 4)
1253 self.assertEqual(pow(-2,3), -8)
1254
Walter Dörwald919497e2003-01-19 16:23:59 +00001255 self.assertAlmostEqual(pow(0.,0), 1.)
1256 self.assertAlmostEqual(pow(0.,1), 0.)
1257 self.assertAlmostEqual(pow(1.,0), 1.)
1258 self.assertAlmostEqual(pow(1.,1), 1.)
1259
1260 self.assertAlmostEqual(pow(2.,0), 1.)
1261 self.assertAlmostEqual(pow(2.,10), 1024.)
1262 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1263 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1264
1265 self.assertAlmostEqual(pow(-2.,0), 1.)
1266 self.assertAlmostEqual(pow(-2.,1), -2.)
1267 self.assertAlmostEqual(pow(-2.,2), 4.)
1268 self.assertAlmostEqual(pow(-2.,3), -8.)
1269
Mark Dickinson5c2db372009-12-05 20:28:34 +00001270 for x in 2, 2.0:
1271 for y in 10, 10.0:
1272 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001273 if isinstance(x, float) or \
1274 isinstance(y, float) or \
1275 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001276 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001277 else:
1278 self.assertAlmostEqual(pow(x, y, z), 24.0)
1279
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001280 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1281 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1282
Mark Dickinsonc5299672019-06-02 10:24:06 +01001283 # See test_pow for additional tests for three-argument pow.
1284 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001285 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001286
1287 self.assertRaises(TypeError, pow)
1288
Ammar Askar87d6cd32019-09-21 00:28:49 -04001289 # Test passing in arguments as keywords.
1290 self.assertEqual(pow(0, exp=0), 1)
1291 self.assertEqual(pow(base=2, exp=4), 16)
1292 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1293 twopow = partial(pow, base=2)
1294 self.assertEqual(twopow(exp=5), 32)
1295 fifth_power = partial(pow, exp=5)
1296 self.assertEqual(fifth_power(2), 32)
1297 mod10 = partial(pow, mod=10)
1298 self.assertEqual(mod10(2, 6), 4)
1299 self.assertEqual(mod10(exp=6, base=2), 4)
1300
Guido van Rossuma88a0332007-02-26 16:59:55 +00001301 def test_input(self):
1302 self.write_testfile()
1303 fp = open(TESTFN, 'r')
1304 savestdin = sys.stdin
1305 savestdout = sys.stdout # Eats the echo
1306 try:
1307 sys.stdin = fp
1308 sys.stdout = BitBucket()
1309 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001310 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1311 self.assertEqual(input('testing\n'), 'Dear John')
1312
1313 # SF 1535165: don't segfault on closed stdin
1314 # sys.stdout must be a regular file for triggering
1315 sys.stdout = savestdout
1316 sys.stdin.close()
1317 self.assertRaises(ValueError, input)
1318
1319 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001320 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001321 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001322 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001323 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001324 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001325 self.assertRaises(EOFError, input)
1326
1327 del sys.stdout
1328 self.assertRaises(RuntimeError, input, 'prompt')
1329 del sys.stdin
1330 self.assertRaises(RuntimeError, input, 'prompt')
1331 finally:
1332 sys.stdin = savestdin
1333 sys.stdout = savestdout
1334 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001335
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001336 # test_int(): see test_int.py for tests of built-in function int().
1337
Walter Dörwald919497e2003-01-19 16:23:59 +00001338 def test_repr(self):
1339 self.assertEqual(repr(''), '\'\'')
1340 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001341 self.assertEqual(repr(()), '()')
1342 self.assertEqual(repr([]), '[]')
1343 self.assertEqual(repr({}), '{}')
1344 a = []
1345 a.append(a)
1346 self.assertEqual(repr(a), '[[...]]')
1347 a = {}
1348 a[0] = a
1349 self.assertEqual(repr(a), '{0: {...}}')
1350
1351 def test_round(self):
1352 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001353 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001354 self.assertEqual(round(1.0), 1.0)
1355 self.assertEqual(round(10.0), 10.0)
1356 self.assertEqual(round(1000000000.0), 1000000000.0)
1357 self.assertEqual(round(1e20), 1e20)
1358
1359 self.assertEqual(round(-1.0), -1.0)
1360 self.assertEqual(round(-10.0), -10.0)
1361 self.assertEqual(round(-1000000000.0), -1000000000.0)
1362 self.assertEqual(round(-1e20), -1e20)
1363
1364 self.assertEqual(round(0.1), 0.0)
1365 self.assertEqual(round(1.1), 1.0)
1366 self.assertEqual(round(10.1), 10.0)
1367 self.assertEqual(round(1000000000.1), 1000000000.0)
1368
1369 self.assertEqual(round(-1.1), -1.0)
1370 self.assertEqual(round(-10.1), -10.0)
1371 self.assertEqual(round(-1000000000.1), -1000000000.0)
1372
1373 self.assertEqual(round(0.9), 1.0)
1374 self.assertEqual(round(9.9), 10.0)
1375 self.assertEqual(round(999999999.9), 1000000000.0)
1376
1377 self.assertEqual(round(-0.9), -1.0)
1378 self.assertEqual(round(-9.9), -10.0)
1379 self.assertEqual(round(-999999999.9), -1000000000.0)
1380
1381 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001382 self.assertEqual(type(round(-8.0, -1)), float)
1383
1384 self.assertEqual(type(round(-8.0, 0)), float)
1385 self.assertEqual(type(round(-8.0, 1)), float)
1386
1387 # Check even / odd rounding behaviour
1388 self.assertEqual(round(5.5), 6)
1389 self.assertEqual(round(6.5), 6)
1390 self.assertEqual(round(-5.5), -6)
1391 self.assertEqual(round(-6.5), -6)
1392
1393 # Check behavior on ints
1394 self.assertEqual(round(0), 0)
1395 self.assertEqual(round(8), 8)
1396 self.assertEqual(round(-8), -8)
1397 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001398 self.assertEqual(type(round(-8, -1)), int)
1399 self.assertEqual(type(round(-8, 0)), int)
1400 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001401
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001402 # test new kwargs
1403 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1404
Walter Dörwald919497e2003-01-19 16:23:59 +00001405 self.assertRaises(TypeError, round)
1406
Alex Martelliae211f92007-08-22 23:21:33 +00001407 # test generic rounding delegation for reals
1408 class TestRound:
1409 def __round__(self):
1410 return 23
1411
1412 class TestNoRound:
1413 pass
1414
1415 self.assertEqual(round(TestRound()), 23)
1416
1417 self.assertRaises(TypeError, round, 1, 2, 3)
1418 self.assertRaises(TypeError, round, TestNoRound())
1419
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001420 t = TestNoRound()
1421 t.__round__ = lambda *args: args
1422 self.assertRaises(TypeError, round, t)
1423 self.assertRaises(TypeError, round, t, 0)
1424
Mark Dickinsonad731b92009-11-09 17:12:30 +00001425 # Some versions of glibc for alpha have a bug that affects
1426 # float -> integer rounding (floor, ceil, rint, round) for
1427 # values in the range [2**52, 2**53). See:
1428 #
1429 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1430 #
1431 # We skip this test on Linux/alpha if it would fail.
1432 linux_alpha = (platform.system().startswith('Linux') and
1433 platform.machine().startswith('alpha'))
1434 system_round_bug = round(5e15+1) != 5e15+1
1435 @unittest.skipIf(linux_alpha and system_round_bug,
1436 "test will fail; failure is probably due to a "
1437 "buggy system round function")
1438 def test_round_large(self):
1439 # Issue #1869: integral floats should remain unchanged
1440 self.assertEqual(round(5e15-1), 5e15-1)
1441 self.assertEqual(round(5e15), 5e15)
1442 self.assertEqual(round(5e15+1), 5e15+1)
1443 self.assertEqual(round(5e15+2), 5e15+2)
1444 self.assertEqual(round(5e15+3), 5e15+3)
1445
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001446 def test_bug_27936(self):
1447 # Verify that ndigits=None means the same as passing in no argument
1448 for x in [1234,
1449 1234.56,
1450 decimal.Decimal('1234.56'),
1451 fractions.Fraction(123456, 100)]:
1452 self.assertEqual(round(x, None), round(x))
1453 self.assertEqual(type(round(x, None)), type(round(x)))
1454
Walter Dörwald919497e2003-01-19 16:23:59 +00001455 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001456 setattr(sys, 'spam', 1)
1457 self.assertEqual(sys.spam, 1)
1458 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1459 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001460
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001461 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001462
Alex Martellia70b1912003-04-22 08:12:33 +00001463 def test_sum(self):
1464 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001465 self.assertEqual(sum(list(range(2,8))), 27)
1466 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001467 self.assertEqual(sum(Squares(10)), 285)
1468 self.assertEqual(sum(iter(Squares(10))), 285)
1469 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1470
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001471 self.assertEqual(sum(range(10), 1000), 1045)
1472 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001473 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1474 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1475
1476 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1477 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1478 2**31+2)
1479 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1480 2**63+2)
1481 self.assertIs(sum([], False), False)
1482
1483 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1484 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1485 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1486 self.assertEqual(sum([0.5, 1]), 1.5)
1487 self.assertEqual(sum([1, 0.5]), 1.5)
1488 self.assertEqual(repr(sum([-0.0])), '0.0')
1489 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1490 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001491
Alex Martellia70b1912003-04-22 08:12:33 +00001492 self.assertRaises(TypeError, sum)
1493 self.assertRaises(TypeError, sum, 42)
1494 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1495 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001496 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1497 values = [bytearray(b'a'), bytearray(b'b')]
1498 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001499 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1500 self.assertRaises(TypeError, sum, [{2:3}])
1501 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001502 self.assertRaises(TypeError, sum, [], '')
1503 self.assertRaises(TypeError, sum, [], b'')
1504 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001505
1506 class BadSeq:
1507 def __getitem__(self, index):
1508 raise ValueError
1509 self.assertRaises(ValueError, sum, BadSeq())
1510
Mark Dickinson3a22b472009-10-17 21:48:16 +00001511 empty = []
1512 sum(([x] for x in range(10)), empty)
1513 self.assertEqual(empty, [])
1514
Walter Dörwald919497e2003-01-19 16:23:59 +00001515 def test_type(self):
1516 self.assertEqual(type(''), type('123'))
1517 self.assertNotEqual(type(''), type(()))
1518
Guido van Rossumfee7b932005-01-16 00:21:28 +00001519 # We don't want self in vars(), so these are static methods
1520
1521 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001522 def get_vars_f0():
1523 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001524
Guido van Rossumfee7b932005-01-16 00:21:28 +00001525 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001526 def get_vars_f2():
1527 BuiltinTest.get_vars_f0()
1528 a = 1
1529 b = 2
1530 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001531
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001532 class C_get_vars(object):
1533 def getDict(self):
1534 return {'a':2}
1535 __dict__ = property(fget=getDict)
1536
Walter Dörwald919497e2003-01-19 16:23:59 +00001537 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001538 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001539 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001540 self.assertEqual(self.get_vars_f0(), {})
1541 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1542 self.assertRaises(TypeError, vars, 42, 42)
1543 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001544 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001545
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001546 def iter_error(self, iterable, error):
1547 """Collect `iterable` into a list, catching an expected `error`."""
1548 items = []
1549 with self.assertRaises(error):
1550 for item in iterable:
1551 items.append(item)
1552 return items
1553
Walter Dörwald919497e2003-01-19 16:23:59 +00001554 def test_zip(self):
1555 a = (1, 2, 3)
1556 b = (4, 5, 6)
1557 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001558 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001559 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001560 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001561 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001562 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001563 class I:
1564 def __getitem__(self, i):
1565 if i < 0 or i > 2: raise IndexError
1566 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001567 self.assertEqual(list(zip(a, I())), t)
1568 self.assertEqual(list(zip()), [])
1569 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001570 self.assertRaises(TypeError, zip, None)
1571 class G:
1572 pass
1573 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001574 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001575
1576 # Make sure zip doesn't try to allocate a billion elements for the
1577 # result list when one of its arguments doesn't say how long it is.
1578 # A MemoryError is the most likely failure mode.
1579 class SequenceWithoutALength:
1580 def __getitem__(self, i):
1581 if i == 5:
1582 raise IndexError
1583 else:
1584 return i
1585 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001586 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001587 list(enumerate(range(5)))
1588 )
1589
1590 class BadSeq:
1591 def __getitem__(self, i):
1592 if i == 5:
1593 raise ValueError
1594 else:
1595 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001596 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001597
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001598 def test_zip_pickle(self):
1599 a = (1, 2, 3)
1600 b = (4, 5, 6)
1601 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001602 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1603 z1 = zip(a, b)
1604 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001605
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001606 def test_zip_pickle_strict(self):
1607 a = (1, 2, 3)
1608 b = (4, 5, 6)
1609 t = [(1, 4), (2, 5), (3, 6)]
1610 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1611 z1 = zip(a, b, strict=True)
1612 self.check_iter_pickle(z1, t, proto)
1613
1614 def test_zip_pickle_strict_fail(self):
1615 a = (1, 2, 3)
1616 b = (4, 5, 6, 7)
1617 t = [(1, 4), (2, 5), (3, 6)]
1618 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1619 z1 = zip(a, b, strict=True)
1620 z2 = pickle.loads(pickle.dumps(z1, proto))
1621 self.assertEqual(self.iter_error(z1, ValueError), t)
1622 self.assertEqual(self.iter_error(z2, ValueError), t)
1623
1624 def test_zip_pickle_stability(self):
1625 # Pickles of zip((1, 2, 3), (4, 5, 6)) dumped from 3.9:
1626 pickles = [
1627 b'citertools\nizip\np0\n(c__builtin__\niter\np1\n((I1\nI2\nI3\ntp2\ntp3\nRp4\nI0\nbg1\n((I4\nI5\nI6\ntp5\ntp6\nRp7\nI0\nbtp8\nRp9\n.',
1628 b'citertools\nizip\nq\x00(c__builtin__\niter\nq\x01((K\x01K\x02K\x03tq\x02tq\x03Rq\x04K\x00bh\x01((K\x04K\x05K\x06tq\x05tq\x06Rq\x07K\x00btq\x08Rq\t.',
1629 b'\x80\x02citertools\nizip\nq\x00c__builtin__\niter\nq\x01K\x01K\x02K\x03\x87q\x02\x85q\x03Rq\x04K\x00bh\x01K\x04K\x05K\x06\x87q\x05\x85q\x06Rq\x07K\x00b\x86q\x08Rq\t.',
1630 b'\x80\x03cbuiltins\nzip\nq\x00cbuiltins\niter\nq\x01K\x01K\x02K\x03\x87q\x02\x85q\x03Rq\x04K\x00bh\x01K\x04K\x05K\x06\x87q\x05\x85q\x06Rq\x07K\x00b\x86q\x08Rq\t.',
1631 b'\x80\x04\x95L\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x03zip\x94\x93\x94\x8c\x08builtins\x94\x8c\x04iter\x94\x93\x94K\x01K\x02K\x03\x87\x94\x85\x94R\x94K\x00bh\x05K\x04K\x05K\x06\x87\x94\x85\x94R\x94K\x00b\x86\x94R\x94.',
1632 b'\x80\x05\x95L\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x03zip\x94\x93\x94\x8c\x08builtins\x94\x8c\x04iter\x94\x93\x94K\x01K\x02K\x03\x87\x94\x85\x94R\x94K\x00bh\x05K\x04K\x05K\x06\x87\x94\x85\x94R\x94K\x00b\x86\x94R\x94.',
1633 ]
1634 for protocol, dump in enumerate(pickles):
1635 z1 = zip((1, 2, 3), (4, 5, 6))
1636 z2 = zip((1, 2, 3), (4, 5, 6), strict=False)
1637 z3 = pickle.loads(dump)
1638 l3 = list(z3)
1639 self.assertEqual(type(z3), zip)
1640 self.assertEqual(pickle.dumps(z1, protocol), dump)
1641 self.assertEqual(pickle.dumps(z2, protocol), dump)
1642 self.assertEqual(list(z1), l3)
1643 self.assertEqual(list(z2), l3)
1644
1645 def test_zip_pickle_strict_stability(self):
1646 # Pickles of zip((1, 2, 3), (4, 5), strict=True) dumped from 3.10:
1647 pickles = [
1648 b'citertools\nizip\np0\n(c__builtin__\niter\np1\n((I1\nI2\nI3\ntp2\ntp3\nRp4\nI0\nbg1\n((I4\nI5\ntp5\ntp6\nRp7\nI0\nbtp8\nRp9\nI01\nb.',
1649 b'citertools\nizip\nq\x00(c__builtin__\niter\nq\x01((K\x01K\x02K\x03tq\x02tq\x03Rq\x04K\x00bh\x01((K\x04K\x05tq\x05tq\x06Rq\x07K\x00btq\x08Rq\tI01\nb.',
1650 b'\x80\x02citertools\nizip\nq\x00c__builtin__\niter\nq\x01K\x01K\x02K\x03\x87q\x02\x85q\x03Rq\x04K\x00bh\x01K\x04K\x05\x86q\x05\x85q\x06Rq\x07K\x00b\x86q\x08Rq\t\x88b.',
1651 b'\x80\x03cbuiltins\nzip\nq\x00cbuiltins\niter\nq\x01K\x01K\x02K\x03\x87q\x02\x85q\x03Rq\x04K\x00bh\x01K\x04K\x05\x86q\x05\x85q\x06Rq\x07K\x00b\x86q\x08Rq\t\x88b.',
1652 b'\x80\x04\x95L\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x03zip\x94\x93\x94\x8c\x08builtins\x94\x8c\x04iter\x94\x93\x94K\x01K\x02K\x03\x87\x94\x85\x94R\x94K\x00bh\x05K\x04K\x05\x86\x94\x85\x94R\x94K\x00b\x86\x94R\x94\x88b.',
1653 b'\x80\x05\x95L\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x03zip\x94\x93\x94\x8c\x08builtins\x94\x8c\x04iter\x94\x93\x94K\x01K\x02K\x03\x87\x94\x85\x94R\x94K\x00bh\x05K\x04K\x05\x86\x94\x85\x94R\x94K\x00b\x86\x94R\x94\x88b.',
1654 ]
1655 a = (1, 2, 3)
1656 b = (4, 5)
1657 t = [(1, 4), (2, 5)]
1658 for protocol, dump in enumerate(pickles):
1659 z1 = zip(a, b, strict=True)
1660 z2 = pickle.loads(dump)
1661 self.assertEqual(pickle.dumps(z1, protocol), dump)
1662 self.assertEqual(type(z2), zip)
1663 self.assertEqual(self.iter_error(z1, ValueError), t)
1664 self.assertEqual(self.iter_error(z2, ValueError), t)
1665
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001666 def test_zip_bad_iterable(self):
1667 exception = TypeError()
1668
1669 class BadIterable:
1670 def __iter__(self):
1671 raise exception
1672
1673 with self.assertRaises(TypeError) as cm:
1674 zip(BadIterable())
1675
1676 self.assertIs(cm.exception, exception)
1677
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001678 def test_zip_strict(self):
1679 self.assertEqual(tuple(zip((1, 2, 3), 'abc', strict=True)),
1680 ((1, 'a'), (2, 'b'), (3, 'c')))
1681 self.assertRaises(ValueError, tuple,
1682 zip((1, 2, 3, 4), 'abc', strict=True))
1683 self.assertRaises(ValueError, tuple,
1684 zip((1, 2), 'abc', strict=True))
1685 self.assertRaises(ValueError, tuple,
1686 zip((1, 2), (1, 2), 'abc', strict=True))
1687
1688 def test_zip_strict_iterators(self):
1689 x = iter(range(5))
1690 y = [0]
1691 z = iter(range(5))
1692 self.assertRaises(ValueError, list,
1693 (zip(x, y, z, strict=True)))
1694 self.assertEqual(next(x), 2)
1695 self.assertEqual(next(z), 1)
1696
1697 def test_zip_strict_error_handling(self):
1698
1699 class Error(Exception):
1700 pass
1701
1702 class Iter:
1703 def __init__(self, size):
1704 self.size = size
1705 def __iter__(self):
1706 return self
1707 def __next__(self):
1708 self.size -= 1
1709 if self.size < 0:
1710 raise Error
1711 return self.size
1712
1713 l1 = self.iter_error(zip("AB", Iter(1), strict=True), Error)
1714 self.assertEqual(l1, [("A", 0)])
1715 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1716 self.assertEqual(l2, [("A", 1, "A")])
1717 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), Error)
1718 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1719 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1720 self.assertEqual(l4, [("A", 2), ("B", 1)])
1721 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), Error)
1722 self.assertEqual(l5, [(0, "A")])
1723 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1724 self.assertEqual(l6, [(1, "A")])
1725 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), Error)
1726 self.assertEqual(l7, [(1, "A"), (0, "B")])
1727 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1728 self.assertEqual(l8, [(2, "A"), (1, "B")])
1729
1730 def test_zip_strict_error_handling_stopiteration(self):
1731
1732 class Iter:
1733 def __init__(self, size):
1734 self.size = size
1735 def __iter__(self):
1736 return self
1737 def __next__(self):
1738 self.size -= 1
1739 if self.size < 0:
1740 raise StopIteration
1741 return self.size
1742
1743 l1 = self.iter_error(zip("AB", Iter(1), strict=True), ValueError)
1744 self.assertEqual(l1, [("A", 0)])
1745 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1746 self.assertEqual(l2, [("A", 1, "A")])
1747 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), ValueError)
1748 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1749 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1750 self.assertEqual(l4, [("A", 2), ("B", 1)])
1751 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), ValueError)
1752 self.assertEqual(l5, [(0, "A")])
1753 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1754 self.assertEqual(l6, [(1, "A")])
1755 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), ValueError)
1756 self.assertEqual(l7, [(1, "A"), (0, "B")])
1757 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1758 self.assertEqual(l8, [(2, "A"), (1, "B")])
1759
Brandt Bucher226a0122020-12-04 19:45:57 -08001760 @support.cpython_only
1761 def test_zip_result_gc(self):
1762 # bpo-42536: zip's tuple-reuse speed trick breaks the GC's assumptions
1763 # about what can be untracked. Make sure we re-track result tuples
1764 # whenever we reuse them.
1765 it = zip([[]])
1766 gc.collect()
1767 # That GC collection probably untracked the recycled internal result
1768 # tuple, which is initialized to (None,). Make sure it's re-tracked when
1769 # it's mutated and returned from __next__:
1770 self.assertTrue(gc.is_tracked(next(it)))
1771
Eric Smithe4d63172010-09-13 20:48:43 +00001772 def test_format(self):
1773 # Test the basic machinery of the format() builtin. Don't test
1774 # the specifics of the various formatters
1775 self.assertEqual(format(3, ''), '3')
1776
1777 # Returns some classes to use for various tests. There's
1778 # an old-style version, and a new-style version
1779 def classes_new():
1780 class A(object):
1781 def __init__(self, x):
1782 self.x = x
1783 def __format__(self, format_spec):
1784 return str(self.x) + format_spec
1785 class DerivedFromA(A):
1786 pass
1787
1788 class Simple(object): pass
1789 class DerivedFromSimple(Simple):
1790 def __init__(self, x):
1791 self.x = x
1792 def __format__(self, format_spec):
1793 return str(self.x) + format_spec
1794 class DerivedFromSimple2(DerivedFromSimple): pass
1795 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1796
1797 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1798 self.assertEqual(format(A(3), 'spec'), '3spec')
1799 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1800 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1801 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1802 '10abcdef')
1803
1804 class_test(*classes_new())
1805
1806 def empty_format_spec(value):
1807 # test that:
1808 # format(x, '') == str(x)
1809 # format(x) == str(x)
1810 self.assertEqual(format(value, ""), str(value))
1811 self.assertEqual(format(value), str(value))
1812
1813 # for builtin types, format(x, "") == str(x)
1814 empty_format_spec(17**13)
1815 empty_format_spec(1.0)
1816 empty_format_spec(3.1415e104)
1817 empty_format_spec(-3.1415e104)
1818 empty_format_spec(3.1415e-104)
1819 empty_format_spec(-3.1415e-104)
1820 empty_format_spec(object)
1821 empty_format_spec(None)
1822
1823 # TypeError because self.__format__ returns the wrong type
1824 class BadFormatResult:
1825 def __format__(self, format_spec):
1826 return 1.0
1827 self.assertRaises(TypeError, format, BadFormatResult(), "")
1828
1829 # TypeError because format_spec is not unicode or str
1830 self.assertRaises(TypeError, format, object(), 4)
1831 self.assertRaises(TypeError, format, object(), object())
1832
1833 # tests for object.__format__ really belong elsewhere, but
1834 # there's no good place to put them
1835 x = object().__format__('')
1836 self.assertTrue(x.startswith('<object object at'))
1837
1838 # first argument to object.__format__ must be string
1839 self.assertRaises(TypeError, object().__format__, 3)
1840 self.assertRaises(TypeError, object().__format__, object())
1841 self.assertRaises(TypeError, object().__format__, None)
1842
1843 # --------------------------------------------------------------------
1844 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001845 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001846 class A:
1847 def __format__(self, fmt_str):
1848 return format('', fmt_str)
1849
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001850 self.assertEqual(format(A()), '')
1851 self.assertEqual(format(A(), ''), '')
1852 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001853
1854 class B:
1855 pass
1856
1857 class C(object):
1858 pass
1859
1860 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001861 obj = cls()
1862 self.assertEqual(format(obj), str(obj))
1863 self.assertEqual(format(obj, ''), str(obj))
1864 with self.assertRaisesRegex(TypeError,
1865 r'\b%s\b' % re.escape(cls.__name__)):
1866 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001867 # --------------------------------------------------------------------
1868
1869 # make sure we can take a subclass of str as a format spec
1870 class DerivedFromStr(str): pass
1871 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1872
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001873 def test_bin(self):
1874 self.assertEqual(bin(0), '0b0')
1875 self.assertEqual(bin(1), '0b1')
1876 self.assertEqual(bin(-1), '-0b1')
1877 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1878 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1879 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1880 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1881
Georg Brandl953152f2009-07-22 12:03:59 +00001882 def test_bytearray_translate(self):
1883 x = bytearray(b"abc")
1884 self.assertRaises(ValueError, x.translate, b"1", 1)
1885 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1886
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001887 def test_bytearray_extend_error(self):
1888 array = bytearray()
1889 bad_iter = map(int, "X")
1890 self.assertRaises(ValueError, array.extend, bad_iter)
1891
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001892 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001893 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001894 tp = type(const)
1895 self.assertIs(tp(), const)
1896 self.assertRaises(TypeError, tp, 1, 2)
1897 self.assertRaises(TypeError, tp, a=1, b=2)
1898
MojoVampire469325c2020-03-03 18:50:17 +00001899 def test_warning_notimplemented(self):
1900 # Issue #35712: NotImplemented is a sentinel value that should never
1901 # be evaluated in a boolean context (virtually all such use cases
1902 # are a result of accidental misuse implementing rich comparison
1903 # operations in terms of one another).
1904 # For the time being, it will continue to evaluate as truthy, but
1905 # issue a deprecation warning (with the eventual intent to make it
1906 # a TypeError).
1907 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1908 with self.assertWarns(DeprecationWarning):
1909 self.assertTrue(NotImplemented)
1910 with self.assertWarns(DeprecationWarning):
1911 self.assertFalse(not NotImplemented)
1912
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001913
1914class TestBreakpoint(unittest.TestCase):
1915 def setUp(self):
1916 # These tests require a clean slate environment. For example, if the
1917 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1918 # will mess up these tests. Similarly for sys.breakpointhook.
1919 # Cleaning the slate here means you can't use breakpoint() to debug
1920 # these tests, but I think that's okay. Just use pdb.set_trace() if
1921 # you must.
1922 self.resources = ExitStack()
1923 self.addCleanup(self.resources.close)
1924 self.env = self.resources.enter_context(EnvironmentVarGuard())
1925 del self.env['PYTHONBREAKPOINT']
1926 self.resources.enter_context(
1927 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1928
1929 def test_breakpoint(self):
1930 with patch('pdb.set_trace') as mock:
1931 breakpoint()
1932 mock.assert_called_once()
1933
1934 def test_breakpoint_with_breakpointhook_set(self):
1935 my_breakpointhook = MagicMock()
1936 sys.breakpointhook = my_breakpointhook
1937 breakpoint()
1938 my_breakpointhook.assert_called_once_with()
1939
1940 def test_breakpoint_with_breakpointhook_reset(self):
1941 my_breakpointhook = MagicMock()
1942 sys.breakpointhook = my_breakpointhook
1943 breakpoint()
1944 my_breakpointhook.assert_called_once_with()
1945 # Reset the hook and it will not be called again.
1946 sys.breakpointhook = sys.__breakpointhook__
1947 with patch('pdb.set_trace') as mock:
1948 breakpoint()
1949 mock.assert_called_once_with()
1950 my_breakpointhook.assert_called_once_with()
1951
1952 def test_breakpoint_with_args_and_keywords(self):
1953 my_breakpointhook = MagicMock()
1954 sys.breakpointhook = my_breakpointhook
1955 breakpoint(1, 2, 3, four=4, five=5)
1956 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1957
1958 def test_breakpoint_with_passthru_error(self):
1959 def my_breakpointhook():
1960 pass
1961 sys.breakpointhook = my_breakpointhook
1962 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1963
1964 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1965 def test_envar_good_path_builtin(self):
1966 self.env['PYTHONBREAKPOINT'] = 'int'
1967 with patch('builtins.int') as mock:
1968 breakpoint('7')
1969 mock.assert_called_once_with('7')
1970
1971 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1972 def test_envar_good_path_other(self):
1973 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1974 with patch('sys.exit') as mock:
1975 breakpoint()
1976 mock.assert_called_once_with()
1977
1978 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1979 def test_envar_good_path_noop_0(self):
1980 self.env['PYTHONBREAKPOINT'] = '0'
1981 with patch('pdb.set_trace') as mock:
1982 breakpoint()
1983 mock.assert_not_called()
1984
1985 def test_envar_good_path_empty_string(self):
1986 # PYTHONBREAKPOINT='' is the same as it not being set.
1987 self.env['PYTHONBREAKPOINT'] = ''
1988 with patch('pdb.set_trace') as mock:
1989 breakpoint()
1990 mock.assert_called_once_with()
1991
1992 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1993 def test_envar_unimportable(self):
1994 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001995 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001996 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001997 'nosuchbuiltin',
1998 'nosuchmodule.nosuchcallable',
1999 ):
2000 with self.subTest(envar=envar):
2001 self.env['PYTHONBREAKPOINT'] = envar
2002 mock = self.resources.enter_context(patch('pdb.set_trace'))
2003 w = self.resources.enter_context(check_warnings(quiet=True))
2004 breakpoint()
2005 self.assertEqual(
2006 str(w.message),
2007 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
2008 self.assertEqual(w.category, RuntimeWarning)
2009 mock.assert_not_called()
2010
2011 def test_envar_ignored_when_hook_is_set(self):
2012 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
2013 with patch('sys.exit') as mock:
2014 sys.breakpointhook = int
2015 breakpoint()
2016 mock.assert_not_called()
2017
2018
Martin Panterc9a6ab52015-10-10 01:25:38 +00002019@unittest.skipUnless(pty, "the pty and signal modules must be available")
2020class PtyTests(unittest.TestCase):
2021 """Tests that use a pseudo terminal to guarantee stdin and stdout are
2022 terminals in the test environment"""
2023
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002024 @staticmethod
2025 def handle_sighup(signum, frame):
2026 # bpo-40140: if the process is the session leader, os.close(fd)
2027 # of "pid, fd = pty.fork()" can raise SIGHUP signal:
2028 # just ignore the signal.
2029 pass
2030
Martin Pantere44dba32015-10-10 05:27:15 +00002031 def run_child(self, child, terminal_input):
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002032 old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
2033 try:
2034 return self._run_child(child, terminal_input)
2035 finally:
2036 signal.signal(signal.SIGHUP, old_sighup)
2037
2038 def _run_child(self, child, terminal_input):
Martin Pantere44dba32015-10-10 05:27:15 +00002039 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00002040 try:
Martin Pantere44dba32015-10-10 05:27:15 +00002041 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00002042 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00002043 os.close(r)
2044 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002045 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00002046 raise
Victor Stinner16d75672020-04-01 00:27:18 +02002047
Martin Panterc9a6ab52015-10-10 01:25:38 +00002048 if pid == 0:
2049 # Child
2050 try:
2051 # Make sure we don't get stuck if there's a problem
2052 signal.alarm(2)
2053 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002054 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00002055 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002056 except:
2057 traceback.print_exc()
2058 finally:
2059 # We don't want to return to unittest...
2060 os._exit(0)
Victor Stinner16d75672020-04-01 00:27:18 +02002061
Martin Panterc9a6ab52015-10-10 01:25:38 +00002062 # Parent
2063 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002064 os.write(fd, terminal_input)
Victor Stinner16d75672020-04-01 00:27:18 +02002065
Martin Panterc9a6ab52015-10-10 01:25:38 +00002066 # Get results from the pipe
2067 with open(r, "r") as rpipe:
2068 lines = []
2069 while True:
2070 line = rpipe.readline().strip()
2071 if line == "":
2072 # The other end was closed => the child exited
2073 break
2074 lines.append(line)
Victor Stinner16d75672020-04-01 00:27:18 +02002075
Martin Panterc9a6ab52015-10-10 01:25:38 +00002076 # Check the result was got and corresponds to the user's terminal input
2077 if len(lines) != 2:
2078 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00002079 # Beware of Linux raising EIO when the slave is closed
2080 child_output = bytearray()
2081 while True:
2082 try:
2083 chunk = os.read(fd, 3000)
2084 except OSError: # Assume EIO
2085 break
2086 if not chunk:
2087 break
2088 child_output.extend(chunk)
2089 os.close(fd)
2090 child_output = child_output.decode("ascii", "ignore")
2091 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
2092 % (len(lines), child_output))
Victor Stinner4baca1b2017-08-09 17:44:19 +02002093
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002094 # bpo-40155: Close the PTY before waiting for the child process
2095 # completion, otherwise the child process hangs on AIX.
Victor Stinner16d75672020-04-01 00:27:18 +02002096 os.close(fd)
2097
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002098 support.wait_process(pid, exitcode=0)
2099
Martin Pantere44dba32015-10-10 05:27:15 +00002100 return lines
2101
2102 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
2103 if not sys.stdin.isatty() or not sys.stdout.isatty():
2104 self.skipTest("stdin and stdout must be ttys")
2105 def child(wpipe):
2106 # Check the error handlers are accounted for
2107 if stdio_encoding:
2108 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
2109 encoding=stdio_encoding,
2110 errors='surrogateescape')
2111 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
2112 encoding=stdio_encoding,
2113 errors='replace')
2114 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
2115 print(ascii(input(prompt)), file=wpipe)
2116 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00002117 # Check we did exercise the GNU readline path
2118 self.assertIn(lines[0], {'tty = True', 'tty = False'})
2119 if lines[0] != 'tty = True':
2120 self.skipTest("standard IO in should have been a tty")
2121 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
2122 if stdio_encoding:
2123 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
2124 else:
2125 expected = terminal_input.decode(sys.stdin.encoding) # what else?
2126 self.assertEqual(input_result, expected)
2127
2128 def test_input_tty(self):
2129 # Test input() functionality when wired to a tty (the code path
2130 # is different and invokes GNU readline if available).
2131 self.check_input_tty("prompt", b"quux")
2132
2133 def test_input_tty_non_ascii(self):
2134 # Check stdin/stdout encoding is used when invoking GNU readline
2135 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
2136
2137 def test_input_tty_non_ascii_unicode_errors(self):
2138 # Check stdin/stdout error handler is used when invoking GNU readline
2139 self.check_input_tty("prompté", b"quux\xe9", "ascii")
2140
2141 def test_input_no_stdout_fileno(self):
2142 # Issue #24402: If stdin is the original terminal but stdout.fileno()
2143 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00002144 def child(wpipe):
2145 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
2146 sys.stdout = io.StringIO() # Does not support fileno()
2147 input("prompt")
2148 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
2149 lines = self.run_child(child, b"quux\r")
2150 expected = (
2151 "stdin.isatty(): True",
2152 "captured: 'prompt'",
2153 )
2154 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002155
Raymond Hettinger64958a12003-12-17 20:43:33 +00002156class TestSorted(unittest.TestCase):
2157
2158 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002159 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002160 copy = data[:]
2161 random.shuffle(copy)
2162 self.assertEqual(data, sorted(copy))
2163 self.assertNotEqual(data, copy)
2164
2165 data.reverse()
2166 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00002167 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2168 self.assertNotEqual(data, copy)
2169 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03002170 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002171 self.assertNotEqual(data, copy)
2172
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02002173 def test_bad_arguments(self):
2174 # Issue #29327: The first argument is positional-only.
2175 sorted([])
2176 with self.assertRaises(TypeError):
2177 sorted(iterable=[])
2178 # Other arguments are keyword-only
2179 sorted([], key=None)
2180 with self.assertRaises(TypeError):
2181 sorted([], None)
2182
Raymond Hettinger64958a12003-12-17 20:43:33 +00002183 def test_inputtypes(self):
2184 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002185 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002186 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002187 self.assertEqual(sorted(s), sorted(T(s)))
2188
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002189 s = ''.join(set(s)) # unique letters only
2190 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002191 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002192 self.assertEqual(sorted(s), sorted(T(s)))
2193
2194 def test_baddecorator(self):
2195 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2196 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2197
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002198
2199class ShutdownTest(unittest.TestCase):
2200
2201 def test_cleanup(self):
2202 # Issue #19255: builtins are still available at shutdown
2203 code = """if 1:
2204 import builtins
2205 import sys
2206
2207 class C:
2208 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002209 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002210 # Check that builtins still exist
2211 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002212 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002213
2214 c = C()
2215 # Make this module survive until builtins and sys are cleaned
2216 builtins.here = sys.modules[__name__]
2217 sys.here = sys.modules[__name__]
2218 # Create a reference loop so that this module needs to go
2219 # through a GC phase.
2220 here = sys.modules[__name__]
2221 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002222 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2223 # otherwise the codec may be unloaded before C.__del__() is called, and
2224 # so print("before") fails because the codec cannot be used to encode
2225 # "before" to sys.stdout.encoding. For example, on Windows,
2226 # sys.stdout.encoding is the OEM code page and these code pages are
2227 # implemented in Python
2228 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002229 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002230 self.assertEqual(["before", "after"], out.decode().splitlines())
2231
2232
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002233class TestType(unittest.TestCase):
2234 def test_new_type(self):
2235 A = type('A', (), {})
2236 self.assertEqual(A.__name__, 'A')
2237 self.assertEqual(A.__qualname__, 'A')
2238 self.assertEqual(A.__module__, __name__)
2239 self.assertEqual(A.__bases__, (object,))
2240 self.assertIs(A.__base__, object)
2241 x = A()
2242 self.assertIs(type(x), A)
2243 self.assertIs(x.__class__, A)
2244
2245 class B:
2246 def ham(self):
2247 return 'ham%d' % self
2248 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2249 self.assertEqual(C.__name__, 'C')
2250 self.assertEqual(C.__qualname__, 'C')
2251 self.assertEqual(C.__module__, __name__)
2252 self.assertEqual(C.__bases__, (B, int))
2253 self.assertIs(C.__base__, int)
2254 self.assertIn('spam', C.__dict__)
2255 self.assertNotIn('ham', C.__dict__)
2256 x = C(42)
2257 self.assertEqual(x, 42)
2258 self.assertIs(type(x), C)
2259 self.assertIs(x.__class__, C)
2260 self.assertEqual(x.ham(), 'ham42')
2261 self.assertEqual(x.spam(), 'spam42')
2262 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2263
Nick Coghland78448e2016-07-30 16:26:03 +10002264 def test_type_nokwargs(self):
2265 with self.assertRaises(TypeError):
2266 type('a', (), {}, x=5)
2267 with self.assertRaises(TypeError):
2268 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002269
2270 def test_type_name(self):
2271 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2272 with self.subTest(name=name):
2273 A = type(name, (), {})
2274 self.assertEqual(A.__name__, name)
2275 self.assertEqual(A.__qualname__, name)
2276 self.assertEqual(A.__module__, __name__)
2277 with self.assertRaises(ValueError):
2278 type('A\x00B', (), {})
2279 with self.assertRaises(ValueError):
2280 type('A\udcdcB', (), {})
2281 with self.assertRaises(TypeError):
2282 type(b'A', (), {})
2283
2284 C = type('C', (), {})
2285 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2286 with self.subTest(name=name):
2287 C.__name__ = name
2288 self.assertEqual(C.__name__, name)
2289 self.assertEqual(C.__qualname__, 'C')
2290 self.assertEqual(C.__module__, __name__)
2291
2292 A = type('C', (), {})
2293 with self.assertRaises(ValueError):
2294 A.__name__ = 'A\x00B'
2295 self.assertEqual(A.__name__, 'C')
2296 with self.assertRaises(ValueError):
2297 A.__name__ = 'A\udcdcB'
2298 self.assertEqual(A.__name__, 'C')
2299 with self.assertRaises(TypeError):
2300 A.__name__ = b'A'
2301 self.assertEqual(A.__name__, 'C')
2302
2303 def test_type_qualname(self):
2304 A = type('A', (), {'__qualname__': 'B.C'})
2305 self.assertEqual(A.__name__, 'A')
2306 self.assertEqual(A.__qualname__, 'B.C')
2307 self.assertEqual(A.__module__, __name__)
2308 with self.assertRaises(TypeError):
2309 type('A', (), {'__qualname__': b'B'})
2310 self.assertEqual(A.__qualname__, 'B.C')
2311
2312 A.__qualname__ = 'D.E'
2313 self.assertEqual(A.__name__, 'A')
2314 self.assertEqual(A.__qualname__, 'D.E')
2315 with self.assertRaises(TypeError):
2316 A.__qualname__ = b'B'
2317 self.assertEqual(A.__qualname__, 'D.E')
2318
2319 def test_type_doc(self):
2320 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2321 A = type('A', (), {'__doc__': doc})
2322 self.assertEqual(A.__doc__, doc)
2323 with self.assertRaises(UnicodeEncodeError):
2324 type('A', (), {'__doc__': 'x\udcdcy'})
2325
2326 A = type('A', (), {})
2327 self.assertEqual(A.__doc__, None)
2328 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2329 A.__doc__ = doc
2330 self.assertEqual(A.__doc__, doc)
2331
2332 def test_bad_args(self):
2333 with self.assertRaises(TypeError):
2334 type()
2335 with self.assertRaises(TypeError):
2336 type('A', ())
2337 with self.assertRaises(TypeError):
2338 type('A', (), {}, ())
2339 with self.assertRaises(TypeError):
2340 type('A', (), dict={})
2341 with self.assertRaises(TypeError):
2342 type('A', [], {})
2343 with self.assertRaises(TypeError):
2344 type('A', (), types.MappingProxyType({}))
2345 with self.assertRaises(TypeError):
2346 type('A', (None,), {})
2347 with self.assertRaises(TypeError):
2348 type('A', (bool,), {})
2349 with self.assertRaises(TypeError):
2350 type('A', (int, str), {})
2351
2352 def test_bad_slots(self):
2353 with self.assertRaises(TypeError):
2354 type('A', (), {'__slots__': b'x'})
2355 with self.assertRaises(TypeError):
2356 type('A', (int,), {'__slots__': 'x'})
2357 with self.assertRaises(TypeError):
2358 type('A', (), {'__slots__': ''})
2359 with self.assertRaises(TypeError):
2360 type('A', (), {'__slots__': '42'})
2361 with self.assertRaises(TypeError):
2362 type('A', (), {'__slots__': 'x\x00y'})
2363 with self.assertRaises(ValueError):
2364 type('A', (), {'__slots__': 'x', 'x': 0})
2365 with self.assertRaises(TypeError):
2366 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2367 with self.assertRaises(TypeError):
2368 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2369
2370 class B:
2371 pass
2372 with self.assertRaises(TypeError):
2373 type('A', (B,), {'__slots__': '__dict__'})
2374 with self.assertRaises(TypeError):
2375 type('A', (B,), {'__slots__': '__weakref__'})
2376
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002377 def test_namespace_order(self):
2378 # bpo-34320: namespace should preserve order
2379 od = collections.OrderedDict([('a', 1), ('b', 2)])
2380 od.move_to_end('a')
2381 expected = list(od.items())
2382
2383 C = type('C', (), od)
2384 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2385
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002386
Zachary Warea4b7a752013-11-24 01:19:09 -06002387def load_tests(loader, tests, pattern):
2388 from doctest import DocTestSuite
2389 tests.addTest(DocTestSuite(builtins))
2390 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002391
2392if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002393 unittest.main()