blob: edb4ec092e3586cbe94ac533f7aee1b37b97fc62 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004import asyncio
Victor Stinnerf86a5e82012-06-05 13:43:22 +02005import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00006import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07007import decimal
8import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00009import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010011import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020013import platform
14import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020015import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020016import sys
17import traceback
18import types
19import unittest
20import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040021from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040022from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070023from inspect import CO_COROUTINE
24from itertools import product
25from textwrap import dedent
26from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020027from operator import neg
Victor Stinner278c1e12020-03-31 20:08:12 +020028from test import support
Hai Shia7f5d932020-08-04 00:41:24 +080029from test.support import (swap_attr, maybe_get_event_loop_policy)
30from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink)
Berker Peksagce643912015-05-06 06:33:17 +030031from test.support.script_helper import assert_python_ok
Hai Shia7f5d932020-08-04 00:41:24 +080032from test.support.warnings_helper import check_warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040033from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010034try:
Antoine Pitrou772add72011-11-06 02:37:42 +010035 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010036except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010037 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Walter Dörwald919497e2003-01-19 16:23:59 +000040class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000041
Walter Dörwald919497e2003-01-19 16:23:59 +000042 def __init__(self, max):
43 self.max = max
44 self.sofar = []
45
46 def __len__(self): return len(self.sofar)
47
48 def __getitem__(self, i):
49 if not 0 <= i < self.max: raise IndexError
50 n = len(self.sofar)
51 while n <= i:
52 self.sofar.append(n*n)
53 n += 1
54 return self.sofar[i]
55
56class StrSquares:
57
58 def __init__(self, max):
59 self.max = max
60 self.sofar = []
61
62 def __len__(self):
63 return len(self.sofar)
64
65 def __getitem__(self, i):
66 if not 0 <= i < self.max:
67 raise IndexError
68 n = len(self.sofar)
69 while n <= i:
70 self.sofar.append(str(n*n))
71 n += 1
72 return self.sofar[i]
73
74class BitBucket:
75 def write(self, line):
76 pass
77
Facundo Batista2336bdd2008-01-19 19:12:01 +000078test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000079 ('0', 0),
80 ('1', 1),
81 ('9', 9),
82 ('10', 10),
83 ('99', 99),
84 ('100', 100),
85 ('314', 314),
86 (' 314', 314),
87 ('314 ', 314),
88 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000089 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000090 (' 1x', ValueError),
91 (' 1 ', 1),
92 (' 1\02 ', ValueError),
93 ('', ValueError),
94 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000095 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040096 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000097 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000098]
99
Facundo Batista2336bdd2008-01-19 19:12:01 +0000100test_conv_sign = [
101 ('0', 0),
102 ('1', 1),
103 ('9', 9),
104 ('10', 10),
105 ('99', 99),
106 ('100', 100),
107 ('314', 314),
108 (' 314', ValueError),
109 ('314 ', 314),
110 (' \t\t 314 \t\t ', ValueError),
111 (repr(sys.maxsize), sys.maxsize),
112 (' 1x', ValueError),
113 (' 1 ', ValueError),
114 (' 1\02 ', ValueError),
115 ('', ValueError),
116 (' ', ValueError),
117 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400118 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000119 (chr(0x200), ValueError),
120]
121
Raymond Hettinger96229b12005-03-11 06:49:40 +0000122class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000123 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000124 raise RuntimeError
125
126class TestFailingIter:
127 def __iter__(self):
128 raise RuntimeError
129
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000130def filter_char(arg):
131 return ord(arg) > ord("d")
132
133def map_char(arg):
134 return chr(ord(arg)+1)
135
Walter Dörwald919497e2003-01-19 16:23:59 +0000136class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000137 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200138 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000139 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200140 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000141 it = pickle.loads(d)
142 self.assertEqual(type(itorg), type(it))
143 self.assertEqual(list(it), seq)
144
145 #test the iterator after dropping one from it
146 it = pickle.loads(d)
147 try:
148 next(it)
149 except StopIteration:
150 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200151 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000152 it = pickle.loads(d)
153 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000154
155 def test_import(self):
156 __import__('sys')
157 __import__('time')
158 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000159 __import__(name='sys')
160 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000161 self.assertRaises(ImportError, __import__, 'spamspam')
162 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000163 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000164 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000165 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100166 with self.assertWarns(ImportWarning):
167 self.assertRaises(ImportError, __import__, '',
168 {'__package__': None, '__spec__': None, '__name__': '__main__'},
169 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300170 # embedded null character
171 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000172
173 def test_abs(self):
174 # int
175 self.assertEqual(abs(0), 0)
176 self.assertEqual(abs(1234), 1234)
177 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 # float
180 self.assertEqual(abs(0.0), 0.0)
181 self.assertEqual(abs(3.14), 3.14)
182 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 # str
184 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000185 # bool
186 self.assertEqual(abs(True), 1)
187 self.assertEqual(abs(False), 0)
188 # other
189 self.assertRaises(TypeError, abs)
190 self.assertRaises(TypeError, abs, None)
191 class AbsClass(object):
192 def __abs__(self):
193 return -5
194 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000195
Raymond Hettinger96229b12005-03-11 06:49:40 +0000196 def test_all(self):
197 self.assertEqual(all([2, 4, 6]), True)
198 self.assertEqual(all([2, None, 6]), False)
199 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
200 self.assertRaises(RuntimeError, all, TestFailingIter())
201 self.assertRaises(TypeError, all, 10) # Non-iterable
202 self.assertRaises(TypeError, all) # No args
203 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
204 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200205 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000206 S = [50, 60]
207 self.assertEqual(all(x > 42 for x in S), True)
208 S = [50, 40, 60]
209 self.assertEqual(all(x > 42 for x in S), False)
210
211 def test_any(self):
212 self.assertEqual(any([None, None, None]), False)
213 self.assertEqual(any([None, 4, None]), True)
214 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500215 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000216 self.assertRaises(TypeError, any, 10) # Non-iterable
217 self.assertRaises(TypeError, any) # No args
218 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
219 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200220 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000221 S = [40, 60, 30]
222 self.assertEqual(any(x > 42 for x in S), True)
223 S = [10, 20, 30]
224 self.assertEqual(any(x > 42 for x in S), False)
225
Georg Brandl559e5d72008-06-11 18:37:52 +0000226 def test_ascii(self):
227 self.assertEqual(ascii(''), '\'\'')
228 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000229 self.assertEqual(ascii(()), '()')
230 self.assertEqual(ascii([]), '[]')
231 self.assertEqual(ascii({}), '{}')
232 a = []
233 a.append(a)
234 self.assertEqual(ascii(a), '[[...]]')
235 a = {}
236 a[0] = a
237 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000238 # Advanced checks for unicode strings
239 def _check_uni(s):
240 self.assertEqual(ascii(s), repr(s))
241 _check_uni("'")
242 _check_uni('"')
243 _check_uni('"\'')
244 _check_uni('\0')
245 _check_uni('\r\n\t .')
246 # Unprintable non-ASCII characters
247 _check_uni('\x85')
248 _check_uni('\u1fff')
249 _check_uni('\U00012fff')
250 # Lone surrogates
251 _check_uni('\ud800')
252 _check_uni('\udfff')
253 # Issue #9804: surrogates should be joined even for printable
254 # wide characters (UCS-2 builds).
255 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
256 # All together
257 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
258 self.assertEqual(ascii(s),
259 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000260
Thomas Wouters89f507f2006-12-13 04:49:30 +0000261 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000262 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000264 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265
Walter Dörwald919497e2003-01-19 16:23:59 +0000266 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000267 self.assertTrue(callable(len))
268 self.assertFalse(callable("a"))
269 self.assertTrue(callable(callable))
270 self.assertTrue(callable(lambda x, y: x + y))
271 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000272 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000273 self.assertTrue(callable(f))
274
275 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000276 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000277 self.assertTrue(callable(C1))
278 c = C1()
279 self.assertTrue(callable(c.meth))
280 self.assertFalse(callable(c))
281
282 # __call__ is looked up on the class, not the instance
283 c.__call__ = None
284 self.assertFalse(callable(c))
285 c.__call__ = lambda self: 0
286 self.assertFalse(callable(c))
287 del c.__call__
288 self.assertFalse(callable(c))
289
290 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000291 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000292 c2 = C2()
293 self.assertTrue(callable(c2))
294 c2.__call__ = None
295 self.assertTrue(callable(c2))
296 class C3(C2): pass
297 c3 = C3()
298 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000299
300 def test_chr(self):
301 self.assertEqual(chr(32), ' ')
302 self.assertEqual(chr(65), 'A')
303 self.assertEqual(chr(97), 'a')
304 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000305 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000306 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300307 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000308 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000309 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
310 self.assertEqual(chr(0x00010000), "\U00010000")
311 self.assertEqual(chr(0x00010001), "\U00010001")
312 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
313 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
314 self.assertEqual(chr(0x00100000), "\U00100000")
315 self.assertEqual(chr(0x00100001), "\U00100001")
316 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
317 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
318 self.assertRaises(ValueError, chr, -1)
319 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000320 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000321
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000322 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000323 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000324
Walter Dörwald919497e2003-01-19 16:23:59 +0000325 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000326 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000327 bom = b'\xef\xbb\xbf'
328 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000329 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300330 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
331 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000332 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000333 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
335 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300336 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
338 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000339 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300340 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000341 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 # test the optimize argument
344
345 codestr = '''def f():
346 """doc"""
diana543386b2017-10-03 10:46:56 -0600347 debug_enabled = False
348 if __debug__:
349 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000350 try:
351 assert False
352 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200353 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000354 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200355 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000356 '''
357 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200358 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
359 (0, True, 'doc', True, True),
360 (1, False, 'doc', False, False),
361 (2, False, None, False, False)]
362 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000363 # test both direct compilation and compilation via AST
364 codeobjs = []
365 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
366 tree = ast.parse(codestr)
367 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
368 for code in codeobjs:
369 ns = {}
370 exec(code, ns)
371 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200372 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000373
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700374 def test_compile_top_level_await_no_coro(self):
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100375 """Make sure top level non-await codes get the correct coroutine flags"""
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700376 modes = ('single', 'exec')
377 code_samples = [
378 '''def f():pass\n''',
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100379 '''[x for x in l]''',
380 '''{x for x in l}''',
381 '''(x for x in l)''',
382 '''{x:x for x in l}''',
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700383 ]
384 for mode, code_sample in product(modes, code_samples):
385 source = dedent(code_sample)
386 co = compile(source,
387 '?',
388 mode,
389 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
390
391 self.assertNotEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
392 msg=f"source={source} mode={mode}")
393
394
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700395 def test_compile_top_level_await(self):
396 """Test whether code some top level await can be compiled.
397
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400398 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
399 set, and make sure the generated code object has the CO_COROUTINE flag
400 set in order to execute it with `await eval(.....)` instead of exec,
401 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402 """
403
404 # helper function just to check we can run top=level async-for
405 async def arange(n):
406 for i in range(n):
407 yield i
408
409 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400410 code_samples = [
411 '''a = await asyncio.sleep(0, result=1)''',
412 '''async for i in arange(1):
413 a = 1''',
414 '''async with asyncio.Lock() as l:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300415 a = 1''',
416 '''a = [x async for x in arange(2)][1]''',
417 '''a = 1 in {x async for x in arange(2)}''',
418 '''a = {x:1 async for x in arange(1)}[0]''',
419 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
420 '''a = [x async for x in (x async for x in arange(5))][1]''',
421 '''a, = [1 for x in {x async for x in arange(1)}]''',
422 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400423 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700424 policy = maybe_get_event_loop_policy()
425 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400426 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700427 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400428 with self.assertRaises(
429 SyntaxError, msg=f"source={source} mode={mode}"):
430 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700431
432 co = compile(source,
433 '?',
434 mode,
435 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
436
437 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400438 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700439
440 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400441 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700442 async_f = FunctionType(co, globals_)
443 asyncio.run(async_f())
444 self.assertEqual(globals_['a'], 1)
445
446 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400447 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700448 asyncio.run(eval(co, globals_))
449 self.assertEqual(globals_['a'], 1)
450 finally:
451 asyncio.set_event_loop_policy(policy)
452
Pablo Galindo90235812020-03-15 04:29:22 +0000453 def test_compile_top_level_await_invalid_cases(self):
454 # helper function just to check we can run top=level async-for
455 async def arange(n):
456 for i in range(n):
457 yield i
458
459 modes = ('single', 'exec')
460 code_samples = [
461 '''def f(): await arange(10)\n''',
462 '''def f(): [x async for x in arange(10)]\n''',
463 '''def f(): [await x async for x in arange(10)]\n''',
464 '''def f():
465 async for i in arange(1):
466 a = 1
467 ''',
468 '''def f():
469 async with asyncio.Lock() as l:
470 a = 1
471 '''
472 ]
473 policy = maybe_get_event_loop_policy()
474 try:
475 for mode, code_sample in product(modes, code_samples):
476 source = dedent(code_sample)
477 with self.assertRaises(
478 SyntaxError, msg=f"source={source} mode={mode}"):
479 compile(source, '?', mode)
480
481 with self.assertRaises(
482 SyntaxError, msg=f"source={source} mode={mode}"):
483 co = compile(source,
484 '?',
485 mode,
486 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
487 finally:
488 asyncio.set_event_loop_policy(policy)
489
490
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700491 def test_compile_async_generator(self):
492 """
493 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400494 make sure AsyncGenerators are still properly not marked with the
495 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700496 """
497 code = dedent("""async def ticker():
498 for i in range(10):
499 yield i
500 await asyncio.sleep(0)""")
501
502 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
503 glob = {}
504 exec(co, glob)
505 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
506
Walter Dörwald919497e2003-01-19 16:23:59 +0000507 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 sys.spam = 1
509 delattr(sys, 'spam')
510 self.assertRaises(TypeError, delattr)
511
512 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000513 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000514 self.assertRaises(TypeError, dir, 42, 42)
515
Georg Brandle32b4222007-03-10 22:13:27 +0000516 # dir() - local scope
517 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000518 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000519
520 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000521 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000522
523 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000524 class Foo(types.ModuleType):
525 __dict__ = 8
526 f = Foo("foo")
527 self.assertRaises(TypeError, dir, f)
528
529 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000530 self.assertIn("strip", dir(str))
531 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000532
533 # dir(obj)
534 class Foo(object):
535 def __init__(self):
536 self.x = 7
537 self.y = 8
538 self.z = 9
539 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000540 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000541
542 # dir(obj_no__dict__)
543 class Foo(object):
544 __slots__ = []
545 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000546 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000547
548 # dir(obj_no__class__with__dict__)
549 # (an ugly trick to cause getattr(f, "__class__") to fail)
550 class Foo(object):
551 __slots__ = ["__class__", "__dict__"]
552 def __init__(self):
553 self.bar = "wow"
554 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000555 self.assertNotIn("__repr__", dir(f))
556 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000557
558 # dir(obj_using __dir__)
559 class Foo(object):
560 def __dir__(self):
561 return ["kan", "ga", "roo"]
562 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000563 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000564
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500565 # dir(obj__dir__tuple)
566 class Foo(object):
567 def __dir__(self):
568 return ("b", "c", "a")
569 res = dir(Foo())
570 self.assertIsInstance(res, list)
571 self.assertTrue(res == ["a", "b", "c"])
572
573 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000574 class Foo(object):
575 def __dir__(self):
576 return 7
577 f = Foo()
578 self.assertRaises(TypeError, dir, f)
579
Collin Winter3eed7652007-08-14 17:53:54 +0000580 # dir(traceback)
581 try:
582 raise IndexError
583 except:
584 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
585
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500586 # test that object has a __dir__()
587 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000588
Walter Dörwald919497e2003-01-19 16:23:59 +0000589 def test_divmod(self):
590 self.assertEqual(divmod(12, 7), (1, 5))
591 self.assertEqual(divmod(-12, 7), (-2, 2))
592 self.assertEqual(divmod(12, -7), (-2, -2))
593 self.assertEqual(divmod(-12, -7), (1, -5))
594
Mark Dickinson5c2db372009-12-05 20:28:34 +0000595 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000596
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000597 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
598 (-3.25, 1.0, (-4.0, 0.75)),
599 (3.25, -1.0, (-4.0, -0.75)),
600 (-3.25, -1.0, (3.0, -0.25))]:
601 result = divmod(num, denom)
602 self.assertAlmostEqual(result[0], exp_result[0])
603 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000604
605 self.assertRaises(TypeError, divmod)
606
607 def test_eval(self):
608 self.assertEqual(eval('1+1'), 2)
609 self.assertEqual(eval(' 1+1\n'), 2)
610 globals = {'a': 1, 'b': 2}
611 locals = {'b': 200, 'c': 300}
612 self.assertEqual(eval('a', globals) , 1)
613 self.assertEqual(eval('a', globals, locals), 1)
614 self.assertEqual(eval('b', globals, locals), 200)
615 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000616 globals = {'a': 1, 'b': 2}
617 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000618 bom = b'\xef\xbb\xbf'
619 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000620 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000621 self.assertRaises(TypeError, eval)
622 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000623 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000624
Benjamin Peterson92722792012-12-15 12:51:05 -0500625 class X:
626 def __getitem__(self, key):
627 raise ValueError
628 self.assertRaises(ValueError, eval, "foo", {}, X())
629
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000630 def test_general_eval(self):
631 # Tests that general mappings can be used for the locals argument
632
633 class M:
634 "Test mapping interface versus possible calls from eval()."
635 def __getitem__(self, key):
636 if key == 'a':
637 return 12
638 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000639 def keys(self):
640 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000641
642 m = M()
643 g = globals()
644 self.assertEqual(eval('a', g, m), 12)
645 self.assertRaises(NameError, eval, 'b', g, m)
646 self.assertEqual(eval('dir()', g, m), list('xyz'))
647 self.assertEqual(eval('globals()', g, m), g)
648 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000649 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000650 class A:
651 "Non-mapping"
652 pass
653 m = A()
654 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000655
656 # Verify that dict subclasses work as well
657 class D(dict):
658 def __getitem__(self, key):
659 if key == 'a':
660 return 12
661 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000662 def keys(self):
663 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000664
665 d = D()
666 self.assertEqual(eval('a', g, d), 12)
667 self.assertRaises(NameError, eval, 'b', g, d)
668 self.assertEqual(eval('dir()', g, d), list('xyz'))
669 self.assertEqual(eval('globals()', g, d), g)
670 self.assertEqual(eval('locals()', g, d), d)
671
672 # Verify locals stores (used by list comps)
673 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000674 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000675
676 class SpreadSheet:
677 "Sample application showing nested, calculated lookups."
678 _cells = {}
679 def __setitem__(self, key, formula):
680 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000681 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000682 return eval(self._cells[key], globals(), self)
683
684 ss = SpreadSheet()
685 ss['a1'] = '5'
686 ss['a2'] = 'a1*6'
687 ss['a3'] = 'a2*7'
688 self.assertEqual(ss['a3'], 210)
689
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000690 # Verify that dir() catches a non-list returned by eval
691 # SF bug #1004669
692 class C:
693 def __getitem__(self, item):
694 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000695 def keys(self):
696 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000697 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
698
Georg Brandl7cae87c2006-09-06 06:51:57 +0000699 def test_exec(self):
700 g = {}
701 exec('z = 1', g)
702 if '__builtins__' in g:
703 del g['__builtins__']
704 self.assertEqual(g, {'z': 1})
705
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000706 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000707 if '__builtins__' in g:
708 del g['__builtins__']
709 self.assertEqual(g, {'z': 2})
710 g = {}
711 l = {}
712
Brett Cannon77628992010-03-20 20:59:33 +0000713 with check_warnings():
714 warnings.filterwarnings("ignore", "global statement",
715 module="<string>")
716 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000717 if '__builtins__' in g:
718 del g['__builtins__']
719 if '__builtins__' in l:
720 del l['__builtins__']
721 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
722
Victor Stinnerb0b22422012-04-19 00:57:45 +0200723 def test_exec_globals(self):
724 code = compile("print('Hello World!')", "", "exec")
725 # no builtin function
726 self.assertRaisesRegex(NameError, "name 'print' is not defined",
727 exec, code, {'__builtins__': {}})
728 # __builtins__ must be a mapping type
729 self.assertRaises(TypeError,
730 exec, code, {'__builtins__': 123})
731
732 # no __build_class__ function
733 code = compile("class A: pass", "", "exec")
734 self.assertRaisesRegex(NameError, "__build_class__ not found",
735 exec, code, {'__builtins__': {}})
736
737 class frozendict_error(Exception):
738 pass
739
740 class frozendict(dict):
741 def __setitem__(self, key, value):
742 raise frozendict_error("frozendict is readonly")
743
744 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400745 if isinstance(__builtins__, types.ModuleType):
746 frozen_builtins = frozendict(__builtins__.__dict__)
747 else:
748 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200749 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
750 self.assertRaises(frozendict_error,
751 exec, code, {'__builtins__': frozen_builtins})
752
753 # read-only globals
754 namespace = frozendict({})
755 code = compile("x=1", "test", "exec")
756 self.assertRaises(frozendict_error,
757 exec, code, namespace)
758
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000759 def test_exec_redirected(self):
760 savestdout = sys.stdout
761 sys.stdout = None # Whatever that cannot flush()
762 try:
763 # Used to raise SystemError('error return without exception set')
764 exec('a')
765 except NameError:
766 pass
767 finally:
768 sys.stdout = savestdout
769
Walter Dörwald919497e2003-01-19 16:23:59 +0000770 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000771 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
772 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
773 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
774 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
775 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000776 def identity(item):
777 return 1
778 filter(identity, Squares(5))
779 self.assertRaises(TypeError, filter)
780 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000781 def __getitem__(self, index):
782 if index<4:
783 return 42
784 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000785 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000786 def badfunc():
787 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000788 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000789
Walter Dörwaldbf517072003-01-27 15:57:14 +0000790 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000791 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
792 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
793 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000794
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000795 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200796 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
797 f1 = filter(filter_char, "abcdeabcde")
798 f2 = filter(filter_char, "abcdeabcde")
799 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000800
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000802 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000803 self.assertRaises(TypeError, getattr, sys, 1)
804 self.assertRaises(TypeError, getattr, sys, 1, "foo")
805 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000806 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000807 # unicode surrogates are not encodable to the default encoding (utf8)
808 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000809
810 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000811 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000812 self.assertRaises(TypeError, hasattr, sys, 1)
813 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000814 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000815
Benjamin Peterson17689992010-08-24 03:26:23 +0000816 # Check that hasattr propagates all exceptions outside of
817 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000818 class A:
819 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000820 raise SystemExit
821 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000822 class B:
823 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000824 raise ValueError
825 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000826
Walter Dörwald919497e2003-01-19 16:23:59 +0000827 def test_hash(self):
828 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000829 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000830 self.assertEqual(hash(1), hash(1.0))
831 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000832 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 hash((0,1,2,3))
834 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000835 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000836 self.assertRaises(TypeError, hash, [])
837 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000838 # Bug 1536021: Allow hash to return long objects
839 class X:
840 def __hash__(self):
841 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000842 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000843 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000844 def __hash__(self):
845 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000846 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000847
848 def test_hex(self):
849 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000850 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000851 self.assertRaises(TypeError, hex, {})
852
853 def test_id(self):
854 id(None)
855 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000856 id(1.0)
857 id('spam')
858 id((0,1,2,3))
859 id([0,1,2,3])
860 id({'spam': 1, 'eggs': 2, 'ham': 3})
861
Guido van Rossuma88a0332007-02-26 16:59:55 +0000862 # Test input() later, alphabetized as if it were raw_input
863
Walter Dörwald919497e2003-01-19 16:23:59 +0000864 def test_iter(self):
865 self.assertRaises(TypeError, iter)
866 self.assertRaises(TypeError, iter, 42, 42)
867 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000868 for l in lists:
869 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000870 self.assertEqual(next(i), '1')
871 self.assertEqual(next(i), '2')
872 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
874 def test_isinstance(self):
875 class C:
876 pass
877 class D(C):
878 pass
879 class E:
880 pass
881 c = C()
882 d = D()
883 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000884 self.assertTrue(isinstance(c, C))
885 self.assertTrue(isinstance(d, C))
886 self.assertTrue(not isinstance(e, C))
887 self.assertTrue(not isinstance(c, D))
888 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000889 self.assertRaises(TypeError, isinstance, E, 'foo')
890 self.assertRaises(TypeError, isinstance)
891
892 def test_issubclass(self):
893 class C:
894 pass
895 class D(C):
896 pass
897 class E:
898 pass
899 c = C()
900 d = D()
901 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000902 self.assertTrue(issubclass(D, C))
903 self.assertTrue(issubclass(C, C))
904 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000905 self.assertRaises(TypeError, issubclass, 'foo', E)
906 self.assertRaises(TypeError, issubclass, E, 'foo')
907 self.assertRaises(TypeError, issubclass)
908
909 def test_len(self):
910 self.assertEqual(len('123'), 3)
911 self.assertEqual(len(()), 0)
912 self.assertEqual(len((1, 2, 3, 4)), 4)
913 self.assertEqual(len([1, 2, 3, 4]), 4)
914 self.assertEqual(len({}), 0)
915 self.assertEqual(len({'a':1, 'b': 2}), 2)
916 class BadSeq:
917 def __len__(self):
918 raise ValueError
919 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000920 class InvalidLen:
921 def __len__(self):
922 return None
923 self.assertRaises(TypeError, len, InvalidLen())
924 class FloatLen:
925 def __len__(self):
926 return 4.5
927 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300928 class NegativeLen:
929 def __len__(self):
930 return -10
931 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000932 class HugeLen:
933 def __len__(self):
934 return sys.maxsize + 1
935 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300936 class HugeNegativeLen:
937 def __len__(self):
938 return -sys.maxsize-10
939 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000940 class NoLenMethod(object): pass
941 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000942
Walter Dörwald919497e2003-01-19 16:23:59 +0000943 def test_map(self):
944 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000945 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000946 [1, 4, 9]
947 )
948 try:
949 from math import sqrt
950 except ImportError:
951 def sqrt(x):
952 return pow(x, 0.5)
953 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000954 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000955 [[4.0, 2.0], [9.0, 3.0]]
956 )
957 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000958 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000959 [10, 4, 6]
960 )
961
962 def plus(*v):
963 accu = 0
964 for i in v: accu = accu + i
965 return accu
966 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000967 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000968 [1, 3, 7]
969 )
970 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000971 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000972 [1+4, 3+9, 7+2]
973 )
974 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000975 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000976 [1+4+1, 3+9+1, 7+2+0]
977 )
978 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000979 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000980 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
981 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000982 def Max(a, b):
983 if a is None:
984 return b
985 if b is None:
986 return a
987 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000988 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000989 list(map(Max, Squares(3), Squares(2))),
990 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000991 )
992 self.assertRaises(TypeError, map)
993 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000995 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000997 yield None
998 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000999 def badfunc(x):
1000 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001001 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001002
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001003 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +02001004 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1005 m1 = map(map_char, "Is this the real life?")
1006 m2 = map(map_char, "Is this the real life?")
1007 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001008
Walter Dörwald919497e2003-01-19 16:23:59 +00001009 def test_max(self):
1010 self.assertEqual(max('123123'), '3')
1011 self.assertEqual(max(1, 2, 3), 3)
1012 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1013 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1014
Guido van Rossume2a383d2007-01-15 16:59:06 +00001015 self.assertEqual(max(1, 2, 3.0), 3.0)
1016 self.assertEqual(max(1, 2.0, 3), 3)
1017 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001018
Dong-hee Naabdc6342020-01-11 01:31:43 +09001019 with self.assertRaisesRegex(
1020 TypeError,
1021 'max expected at least 1 argument, got 0'
1022 ):
1023 max()
1024
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001025 self.assertRaises(TypeError, max, 42)
1026 self.assertRaises(ValueError, max, ())
1027 class BadSeq:
1028 def __getitem__(self, index):
1029 raise ValueError
1030 self.assertRaises(ValueError, max, BadSeq())
1031
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001032 for stmt in (
1033 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001034 "max(default=None)",
1035 "max(1, 2, default=None)", # require container for default
1036 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001037 "max(1, key=int)", # single arg not iterable
1038 "max(1, 2, keystone=int)", # wrong keyword
1039 "max(1, 2, key=int, abc=int)", # two many keywords
1040 "max(1, 2, key=1)", # keyfunc is not callable
1041 ):
Tim Peters7f061872004-12-07 21:17:46 +00001042 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001043 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001044 except TypeError:
1045 pass
1046 else:
1047 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001048
1049 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1050 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1051 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1052
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001053 self.assertEqual(max((), default=None), None) # zero elem iterable
1054 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1055 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1056
1057 self.assertEqual(max((), default=1, key=neg), 1)
1058 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1059
Alexander Marshalove22072f2018-07-24 10:58:21 +07001060 self.assertEqual(max((1, 2), key=None), 2)
1061
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001062 data = [random.randrange(200) for i in range(100)]
1063 keys = dict((elem, random.randrange(50)) for elem in data)
1064 f = keys.__getitem__
1065 self.assertEqual(max(data, key=f),
1066 sorted(reversed(data), key=f)[-1])
1067
Walter Dörwald919497e2003-01-19 16:23:59 +00001068 def test_min(self):
1069 self.assertEqual(min('123123'), '1')
1070 self.assertEqual(min(1, 2, 3), 1)
1071 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1072 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1073
Guido van Rossume2a383d2007-01-15 16:59:06 +00001074 self.assertEqual(min(1, 2, 3.0), 1)
1075 self.assertEqual(min(1, 2.0, 3), 1)
1076 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001077
Dong-hee Naabdc6342020-01-11 01:31:43 +09001078 with self.assertRaisesRegex(
1079 TypeError,
1080 'min expected at least 1 argument, got 0'
1081 ):
1082 min()
1083
Walter Dörwald919497e2003-01-19 16:23:59 +00001084 self.assertRaises(TypeError, min, 42)
1085 self.assertRaises(ValueError, min, ())
1086 class BadSeq:
1087 def __getitem__(self, index):
1088 raise ValueError
1089 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001090
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001091 for stmt in (
1092 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001093 "min(default=None)",
1094 "min(1, 2, default=None)", # require container for default
1095 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001096 "min(1, key=int)", # single arg not iterable
1097 "min(1, 2, keystone=int)", # wrong keyword
1098 "min(1, 2, key=int, abc=int)", # two many keywords
1099 "min(1, 2, key=1)", # keyfunc is not callable
1100 ):
Tim Peters7f061872004-12-07 21:17:46 +00001101 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001102 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001103 except TypeError:
1104 pass
1105 else:
1106 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001107
1108 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1109 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1110 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1111
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001112 self.assertEqual(min((), default=None), None) # zero elem iterable
1113 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1114 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1115
1116 self.assertEqual(min((), default=1, key=neg), 1)
1117 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1118
Alexander Marshalove22072f2018-07-24 10:58:21 +07001119 self.assertEqual(min((1, 2), key=None), 1)
1120
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001121 data = [random.randrange(200) for i in range(100)]
1122 keys = dict((elem, random.randrange(50)) for elem in data)
1123 f = keys.__getitem__
1124 self.assertEqual(min(data, key=f),
1125 sorted(data, key=f)[0])
1126
Georg Brandla18af4e2007-04-21 15:47:16 +00001127 def test_next(self):
1128 it = iter(range(2))
1129 self.assertEqual(next(it), 0)
1130 self.assertEqual(next(it), 1)
1131 self.assertRaises(StopIteration, next, it)
1132 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001133 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001134
1135 class Iter(object):
1136 def __iter__(self):
1137 return self
1138 def __next__(self):
1139 raise StopIteration
1140
1141 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001142 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001143 self.assertRaises(StopIteration, next, it)
1144
1145 def gen():
1146 yield 1
1147 return
1148
1149 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001150 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001151 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001152 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001153
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001155 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001156 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 self.assertRaises(TypeError, oct, ())
1158
1159 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001160 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001161 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001162 self.addCleanup(unlink, TESTFN)
1163 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001164 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 fp.write('The quick brown fox jumps over the lazy dog')
1166 fp.write('.\n')
1167 fp.write('Dear John\n')
1168 fp.write('XXX'*100)
1169 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001170
1171 def test_open(self):
1172 self.write_testfile()
1173 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001174 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1177 self.assertEqual(fp.readline(4), 'Dear')
1178 self.assertEqual(fp.readline(100), ' John\n')
1179 self.assertEqual(fp.read(300), 'XXX'*100)
1180 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001181
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001182 # embedded null bytes and characters
1183 self.assertRaises(ValueError, open, 'a\x00b')
1184 self.assertRaises(ValueError, open, b'a\x00b')
1185
Victor Stinner91106cd2017-12-13 12:29:09 +01001186 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001187 def test_open_default_encoding(self):
1188 old_environ = dict(os.environ)
1189 try:
1190 # try to get a user preferred encoding different than the current
1191 # locale encoding to check that open() uses the current locale
1192 # encoding and not the user preferred encoding
1193 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1194 if key in os.environ:
1195 del os.environ[key]
1196
1197 self.write_testfile()
1198 current_locale_encoding = locale.getpreferredencoding(False)
1199 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001200 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001201 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001202 finally:
1203 os.environ.clear()
1204 os.environ.update(old_environ)
1205
Victor Stinnerdaf45552013-08-28 00:53:59 +02001206 def test_open_non_inheritable(self):
1207 fileobj = open(__file__)
1208 with fileobj:
1209 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1210
Walter Dörwald919497e2003-01-19 16:23:59 +00001211 def test_ord(self):
1212 self.assertEqual(ord(' '), 32)
1213 self.assertEqual(ord('A'), 65)
1214 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001215 self.assertEqual(ord('\x80'), 128)
1216 self.assertEqual(ord('\xff'), 255)
1217
1218 self.assertEqual(ord(b' '), 32)
1219 self.assertEqual(ord(b'A'), 65)
1220 self.assertEqual(ord(b'a'), 97)
1221 self.assertEqual(ord(b'\x80'), 128)
1222 self.assertEqual(ord(b'\xff'), 255)
1223
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001224 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001225 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001226
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001227 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1228 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1229 self.assertEqual(ord("\U00010000"), 0x00010000)
1230 self.assertEqual(ord("\U00010001"), 0x00010001)
1231 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1232 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1233 self.assertEqual(ord("\U00100000"), 0x00100000)
1234 self.assertEqual(ord("\U00100001"), 0x00100001)
1235 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1236 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1237
Walter Dörwald919497e2003-01-19 16:23:59 +00001238 def test_pow(self):
1239 self.assertEqual(pow(0,0), 1)
1240 self.assertEqual(pow(0,1), 0)
1241 self.assertEqual(pow(1,0), 1)
1242 self.assertEqual(pow(1,1), 1)
1243
1244 self.assertEqual(pow(2,0), 1)
1245 self.assertEqual(pow(2,10), 1024)
1246 self.assertEqual(pow(2,20), 1024*1024)
1247 self.assertEqual(pow(2,30), 1024*1024*1024)
1248
1249 self.assertEqual(pow(-2,0), 1)
1250 self.assertEqual(pow(-2,1), -2)
1251 self.assertEqual(pow(-2,2), 4)
1252 self.assertEqual(pow(-2,3), -8)
1253
Walter Dörwald919497e2003-01-19 16:23:59 +00001254 self.assertAlmostEqual(pow(0.,0), 1.)
1255 self.assertAlmostEqual(pow(0.,1), 0.)
1256 self.assertAlmostEqual(pow(1.,0), 1.)
1257 self.assertAlmostEqual(pow(1.,1), 1.)
1258
1259 self.assertAlmostEqual(pow(2.,0), 1.)
1260 self.assertAlmostEqual(pow(2.,10), 1024.)
1261 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1262 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1263
1264 self.assertAlmostEqual(pow(-2.,0), 1.)
1265 self.assertAlmostEqual(pow(-2.,1), -2.)
1266 self.assertAlmostEqual(pow(-2.,2), 4.)
1267 self.assertAlmostEqual(pow(-2.,3), -8.)
1268
Mark Dickinson5c2db372009-12-05 20:28:34 +00001269 for x in 2, 2.0:
1270 for y in 10, 10.0:
1271 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001272 if isinstance(x, float) or \
1273 isinstance(y, float) or \
1274 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001275 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001276 else:
1277 self.assertAlmostEqual(pow(x, y, z), 24.0)
1278
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001279 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1280 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1281
Mark Dickinsonc5299672019-06-02 10:24:06 +01001282 # See test_pow for additional tests for three-argument pow.
1283 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001284 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001285
1286 self.assertRaises(TypeError, pow)
1287
Ammar Askar87d6cd32019-09-21 00:28:49 -04001288 # Test passing in arguments as keywords.
1289 self.assertEqual(pow(0, exp=0), 1)
1290 self.assertEqual(pow(base=2, exp=4), 16)
1291 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1292 twopow = partial(pow, base=2)
1293 self.assertEqual(twopow(exp=5), 32)
1294 fifth_power = partial(pow, exp=5)
1295 self.assertEqual(fifth_power(2), 32)
1296 mod10 = partial(pow, mod=10)
1297 self.assertEqual(mod10(2, 6), 4)
1298 self.assertEqual(mod10(exp=6, base=2), 4)
1299
Guido van Rossuma88a0332007-02-26 16:59:55 +00001300 def test_input(self):
1301 self.write_testfile()
1302 fp = open(TESTFN, 'r')
1303 savestdin = sys.stdin
1304 savestdout = sys.stdout # Eats the echo
1305 try:
1306 sys.stdin = fp
1307 sys.stdout = BitBucket()
1308 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001309 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1310 self.assertEqual(input('testing\n'), 'Dear John')
1311
1312 # SF 1535165: don't segfault on closed stdin
1313 # sys.stdout must be a regular file for triggering
1314 sys.stdout = savestdout
1315 sys.stdin.close()
1316 self.assertRaises(ValueError, input)
1317
1318 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001319 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001320 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001321 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001322 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001323 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001324 self.assertRaises(EOFError, input)
1325
1326 del sys.stdout
1327 self.assertRaises(RuntimeError, input, 'prompt')
1328 del sys.stdin
1329 self.assertRaises(RuntimeError, input, 'prompt')
1330 finally:
1331 sys.stdin = savestdin
1332 sys.stdout = savestdout
1333 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001334
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001335 # test_int(): see test_int.py for tests of built-in function int().
1336
Walter Dörwald919497e2003-01-19 16:23:59 +00001337 def test_repr(self):
1338 self.assertEqual(repr(''), '\'\'')
1339 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001340 self.assertEqual(repr(()), '()')
1341 self.assertEqual(repr([]), '[]')
1342 self.assertEqual(repr({}), '{}')
1343 a = []
1344 a.append(a)
1345 self.assertEqual(repr(a), '[[...]]')
1346 a = {}
1347 a[0] = a
1348 self.assertEqual(repr(a), '{0: {...}}')
1349
1350 def test_round(self):
1351 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001352 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001353 self.assertEqual(round(1.0), 1.0)
1354 self.assertEqual(round(10.0), 10.0)
1355 self.assertEqual(round(1000000000.0), 1000000000.0)
1356 self.assertEqual(round(1e20), 1e20)
1357
1358 self.assertEqual(round(-1.0), -1.0)
1359 self.assertEqual(round(-10.0), -10.0)
1360 self.assertEqual(round(-1000000000.0), -1000000000.0)
1361 self.assertEqual(round(-1e20), -1e20)
1362
1363 self.assertEqual(round(0.1), 0.0)
1364 self.assertEqual(round(1.1), 1.0)
1365 self.assertEqual(round(10.1), 10.0)
1366 self.assertEqual(round(1000000000.1), 1000000000.0)
1367
1368 self.assertEqual(round(-1.1), -1.0)
1369 self.assertEqual(round(-10.1), -10.0)
1370 self.assertEqual(round(-1000000000.1), -1000000000.0)
1371
1372 self.assertEqual(round(0.9), 1.0)
1373 self.assertEqual(round(9.9), 10.0)
1374 self.assertEqual(round(999999999.9), 1000000000.0)
1375
1376 self.assertEqual(round(-0.9), -1.0)
1377 self.assertEqual(round(-9.9), -10.0)
1378 self.assertEqual(round(-999999999.9), -1000000000.0)
1379
1380 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001381 self.assertEqual(type(round(-8.0, -1)), float)
1382
1383 self.assertEqual(type(round(-8.0, 0)), float)
1384 self.assertEqual(type(round(-8.0, 1)), float)
1385
1386 # Check even / odd rounding behaviour
1387 self.assertEqual(round(5.5), 6)
1388 self.assertEqual(round(6.5), 6)
1389 self.assertEqual(round(-5.5), -6)
1390 self.assertEqual(round(-6.5), -6)
1391
1392 # Check behavior on ints
1393 self.assertEqual(round(0), 0)
1394 self.assertEqual(round(8), 8)
1395 self.assertEqual(round(-8), -8)
1396 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001397 self.assertEqual(type(round(-8, -1)), int)
1398 self.assertEqual(type(round(-8, 0)), int)
1399 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001400
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001401 # test new kwargs
1402 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1403
Walter Dörwald919497e2003-01-19 16:23:59 +00001404 self.assertRaises(TypeError, round)
1405
Alex Martelliae211f92007-08-22 23:21:33 +00001406 # test generic rounding delegation for reals
1407 class TestRound:
1408 def __round__(self):
1409 return 23
1410
1411 class TestNoRound:
1412 pass
1413
1414 self.assertEqual(round(TestRound()), 23)
1415
1416 self.assertRaises(TypeError, round, 1, 2, 3)
1417 self.assertRaises(TypeError, round, TestNoRound())
1418
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001419 t = TestNoRound()
1420 t.__round__ = lambda *args: args
1421 self.assertRaises(TypeError, round, t)
1422 self.assertRaises(TypeError, round, t, 0)
1423
Mark Dickinsonad731b92009-11-09 17:12:30 +00001424 # Some versions of glibc for alpha have a bug that affects
1425 # float -> integer rounding (floor, ceil, rint, round) for
1426 # values in the range [2**52, 2**53). See:
1427 #
1428 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1429 #
1430 # We skip this test on Linux/alpha if it would fail.
1431 linux_alpha = (platform.system().startswith('Linux') and
1432 platform.machine().startswith('alpha'))
1433 system_round_bug = round(5e15+1) != 5e15+1
1434 @unittest.skipIf(linux_alpha and system_round_bug,
1435 "test will fail; failure is probably due to a "
1436 "buggy system round function")
1437 def test_round_large(self):
1438 # Issue #1869: integral floats should remain unchanged
1439 self.assertEqual(round(5e15-1), 5e15-1)
1440 self.assertEqual(round(5e15), 5e15)
1441 self.assertEqual(round(5e15+1), 5e15+1)
1442 self.assertEqual(round(5e15+2), 5e15+2)
1443 self.assertEqual(round(5e15+3), 5e15+3)
1444
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001445 def test_bug_27936(self):
1446 # Verify that ndigits=None means the same as passing in no argument
1447 for x in [1234,
1448 1234.56,
1449 decimal.Decimal('1234.56'),
1450 fractions.Fraction(123456, 100)]:
1451 self.assertEqual(round(x, None), round(x))
1452 self.assertEqual(type(round(x, None)), type(round(x)))
1453
Walter Dörwald919497e2003-01-19 16:23:59 +00001454 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001455 setattr(sys, 'spam', 1)
1456 self.assertEqual(sys.spam, 1)
1457 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1458 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001459
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001460 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001461
Alex Martellia70b1912003-04-22 08:12:33 +00001462 def test_sum(self):
1463 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001464 self.assertEqual(sum(list(range(2,8))), 27)
1465 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001466 self.assertEqual(sum(Squares(10)), 285)
1467 self.assertEqual(sum(iter(Squares(10))), 285)
1468 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1469
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001470 self.assertEqual(sum(range(10), 1000), 1045)
1471 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001472 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1473 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1474
1475 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1476 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1477 2**31+2)
1478 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1479 2**63+2)
1480 self.assertIs(sum([], False), False)
1481
1482 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1483 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1484 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1485 self.assertEqual(sum([0.5, 1]), 1.5)
1486 self.assertEqual(sum([1, 0.5]), 1.5)
1487 self.assertEqual(repr(sum([-0.0])), '0.0')
1488 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1489 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001490
Alex Martellia70b1912003-04-22 08:12:33 +00001491 self.assertRaises(TypeError, sum)
1492 self.assertRaises(TypeError, sum, 42)
1493 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1494 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001495 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1496 values = [bytearray(b'a'), bytearray(b'b')]
1497 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001498 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1499 self.assertRaises(TypeError, sum, [{2:3}])
1500 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001501 self.assertRaises(TypeError, sum, [], '')
1502 self.assertRaises(TypeError, sum, [], b'')
1503 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001504
1505 class BadSeq:
1506 def __getitem__(self, index):
1507 raise ValueError
1508 self.assertRaises(ValueError, sum, BadSeq())
1509
Mark Dickinson3a22b472009-10-17 21:48:16 +00001510 empty = []
1511 sum(([x] for x in range(10)), empty)
1512 self.assertEqual(empty, [])
1513
Walter Dörwald919497e2003-01-19 16:23:59 +00001514 def test_type(self):
1515 self.assertEqual(type(''), type('123'))
1516 self.assertNotEqual(type(''), type(()))
1517
Guido van Rossumfee7b932005-01-16 00:21:28 +00001518 # We don't want self in vars(), so these are static methods
1519
1520 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001521 def get_vars_f0():
1522 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001523
Guido van Rossumfee7b932005-01-16 00:21:28 +00001524 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001525 def get_vars_f2():
1526 BuiltinTest.get_vars_f0()
1527 a = 1
1528 b = 2
1529 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001530
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001531 class C_get_vars(object):
1532 def getDict(self):
1533 return {'a':2}
1534 __dict__ = property(fget=getDict)
1535
Walter Dörwald919497e2003-01-19 16:23:59 +00001536 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001537 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001538 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001539 self.assertEqual(self.get_vars_f0(), {})
1540 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1541 self.assertRaises(TypeError, vars, 42, 42)
1542 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001543 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001544
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001545 def iter_error(self, iterable, error):
1546 """Collect `iterable` into a list, catching an expected `error`."""
1547 items = []
1548 with self.assertRaises(error):
1549 for item in iterable:
1550 items.append(item)
1551 return items
1552
Walter Dörwald919497e2003-01-19 16:23:59 +00001553 def test_zip(self):
1554 a = (1, 2, 3)
1555 b = (4, 5, 6)
1556 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001557 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001558 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001559 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001560 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001561 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001562 class I:
1563 def __getitem__(self, i):
1564 if i < 0 or i > 2: raise IndexError
1565 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001566 self.assertEqual(list(zip(a, I())), t)
1567 self.assertEqual(list(zip()), [])
1568 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001569 self.assertRaises(TypeError, zip, None)
1570 class G:
1571 pass
1572 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001573 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001574
1575 # Make sure zip doesn't try to allocate a billion elements for the
1576 # result list when one of its arguments doesn't say how long it is.
1577 # A MemoryError is the most likely failure mode.
1578 class SequenceWithoutALength:
1579 def __getitem__(self, i):
1580 if i == 5:
1581 raise IndexError
1582 else:
1583 return i
1584 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001585 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001586 list(enumerate(range(5)))
1587 )
1588
1589 class BadSeq:
1590 def __getitem__(self, i):
1591 if i == 5:
1592 raise ValueError
1593 else:
1594 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001595 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001596
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001597 def test_zip_pickle(self):
1598 a = (1, 2, 3)
1599 b = (4, 5, 6)
1600 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001601 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1602 z1 = zip(a, b)
1603 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001604
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001605 def test_zip_pickle_strict(self):
1606 a = (1, 2, 3)
1607 b = (4, 5, 6)
1608 t = [(1, 4), (2, 5), (3, 6)]
1609 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1610 z1 = zip(a, b, strict=True)
1611 self.check_iter_pickle(z1, t, proto)
1612
1613 def test_zip_pickle_strict_fail(self):
1614 a = (1, 2, 3)
1615 b = (4, 5, 6, 7)
1616 t = [(1, 4), (2, 5), (3, 6)]
1617 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1618 z1 = zip(a, b, strict=True)
1619 z2 = pickle.loads(pickle.dumps(z1, proto))
1620 self.assertEqual(self.iter_error(z1, ValueError), t)
1621 self.assertEqual(self.iter_error(z2, ValueError), t)
1622
1623 def test_zip_pickle_stability(self):
1624 # Pickles of zip((1, 2, 3), (4, 5, 6)) dumped from 3.9:
1625 pickles = [
1626 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.',
1627 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.',
1628 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.',
1629 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.',
1630 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.',
1631 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.',
1632 ]
1633 for protocol, dump in enumerate(pickles):
1634 z1 = zip((1, 2, 3), (4, 5, 6))
1635 z2 = zip((1, 2, 3), (4, 5, 6), strict=False)
1636 z3 = pickle.loads(dump)
1637 l3 = list(z3)
1638 self.assertEqual(type(z3), zip)
1639 self.assertEqual(pickle.dumps(z1, protocol), dump)
1640 self.assertEqual(pickle.dumps(z2, protocol), dump)
1641 self.assertEqual(list(z1), l3)
1642 self.assertEqual(list(z2), l3)
1643
1644 def test_zip_pickle_strict_stability(self):
1645 # Pickles of zip((1, 2, 3), (4, 5), strict=True) dumped from 3.10:
1646 pickles = [
1647 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.',
1648 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.',
1649 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.',
1650 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.',
1651 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.',
1652 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.',
1653 ]
1654 a = (1, 2, 3)
1655 b = (4, 5)
1656 t = [(1, 4), (2, 5)]
1657 for protocol, dump in enumerate(pickles):
1658 z1 = zip(a, b, strict=True)
1659 z2 = pickle.loads(dump)
1660 self.assertEqual(pickle.dumps(z1, protocol), dump)
1661 self.assertEqual(type(z2), zip)
1662 self.assertEqual(self.iter_error(z1, ValueError), t)
1663 self.assertEqual(self.iter_error(z2, ValueError), t)
1664
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001665 def test_zip_bad_iterable(self):
1666 exception = TypeError()
1667
1668 class BadIterable:
1669 def __iter__(self):
1670 raise exception
1671
1672 with self.assertRaises(TypeError) as cm:
1673 zip(BadIterable())
1674
1675 self.assertIs(cm.exception, exception)
1676
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001677 def test_zip_strict(self):
1678 self.assertEqual(tuple(zip((1, 2, 3), 'abc', strict=True)),
1679 ((1, 'a'), (2, 'b'), (3, 'c')))
1680 self.assertRaises(ValueError, tuple,
1681 zip((1, 2, 3, 4), 'abc', strict=True))
1682 self.assertRaises(ValueError, tuple,
1683 zip((1, 2), 'abc', strict=True))
1684 self.assertRaises(ValueError, tuple,
1685 zip((1, 2), (1, 2), 'abc', strict=True))
1686
1687 def test_zip_strict_iterators(self):
1688 x = iter(range(5))
1689 y = [0]
1690 z = iter(range(5))
1691 self.assertRaises(ValueError, list,
1692 (zip(x, y, z, strict=True)))
1693 self.assertEqual(next(x), 2)
1694 self.assertEqual(next(z), 1)
1695
1696 def test_zip_strict_error_handling(self):
1697
1698 class Error(Exception):
1699 pass
1700
1701 class Iter:
1702 def __init__(self, size):
1703 self.size = size
1704 def __iter__(self):
1705 return self
1706 def __next__(self):
1707 self.size -= 1
1708 if self.size < 0:
1709 raise Error
1710 return self.size
1711
1712 l1 = self.iter_error(zip("AB", Iter(1), strict=True), Error)
1713 self.assertEqual(l1, [("A", 0)])
1714 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1715 self.assertEqual(l2, [("A", 1, "A")])
1716 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), Error)
1717 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1718 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1719 self.assertEqual(l4, [("A", 2), ("B", 1)])
1720 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), Error)
1721 self.assertEqual(l5, [(0, "A")])
1722 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1723 self.assertEqual(l6, [(1, "A")])
1724 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), Error)
1725 self.assertEqual(l7, [(1, "A"), (0, "B")])
1726 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1727 self.assertEqual(l8, [(2, "A"), (1, "B")])
1728
1729 def test_zip_strict_error_handling_stopiteration(self):
1730
1731 class Iter:
1732 def __init__(self, size):
1733 self.size = size
1734 def __iter__(self):
1735 return self
1736 def __next__(self):
1737 self.size -= 1
1738 if self.size < 0:
1739 raise StopIteration
1740 return self.size
1741
1742 l1 = self.iter_error(zip("AB", Iter(1), strict=True), ValueError)
1743 self.assertEqual(l1, [("A", 0)])
1744 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1745 self.assertEqual(l2, [("A", 1, "A")])
1746 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), ValueError)
1747 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1748 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1749 self.assertEqual(l4, [("A", 2), ("B", 1)])
1750 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), ValueError)
1751 self.assertEqual(l5, [(0, "A")])
1752 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1753 self.assertEqual(l6, [(1, "A")])
1754 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), ValueError)
1755 self.assertEqual(l7, [(1, "A"), (0, "B")])
1756 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1757 self.assertEqual(l8, [(2, "A"), (1, "B")])
1758
Eric Smithe4d63172010-09-13 20:48:43 +00001759 def test_format(self):
1760 # Test the basic machinery of the format() builtin. Don't test
1761 # the specifics of the various formatters
1762 self.assertEqual(format(3, ''), '3')
1763
1764 # Returns some classes to use for various tests. There's
1765 # an old-style version, and a new-style version
1766 def classes_new():
1767 class A(object):
1768 def __init__(self, x):
1769 self.x = x
1770 def __format__(self, format_spec):
1771 return str(self.x) + format_spec
1772 class DerivedFromA(A):
1773 pass
1774
1775 class Simple(object): pass
1776 class DerivedFromSimple(Simple):
1777 def __init__(self, x):
1778 self.x = x
1779 def __format__(self, format_spec):
1780 return str(self.x) + format_spec
1781 class DerivedFromSimple2(DerivedFromSimple): pass
1782 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1783
1784 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1785 self.assertEqual(format(A(3), 'spec'), '3spec')
1786 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1787 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1788 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1789 '10abcdef')
1790
1791 class_test(*classes_new())
1792
1793 def empty_format_spec(value):
1794 # test that:
1795 # format(x, '') == str(x)
1796 # format(x) == str(x)
1797 self.assertEqual(format(value, ""), str(value))
1798 self.assertEqual(format(value), str(value))
1799
1800 # for builtin types, format(x, "") == str(x)
1801 empty_format_spec(17**13)
1802 empty_format_spec(1.0)
1803 empty_format_spec(3.1415e104)
1804 empty_format_spec(-3.1415e104)
1805 empty_format_spec(3.1415e-104)
1806 empty_format_spec(-3.1415e-104)
1807 empty_format_spec(object)
1808 empty_format_spec(None)
1809
1810 # TypeError because self.__format__ returns the wrong type
1811 class BadFormatResult:
1812 def __format__(self, format_spec):
1813 return 1.0
1814 self.assertRaises(TypeError, format, BadFormatResult(), "")
1815
1816 # TypeError because format_spec is not unicode or str
1817 self.assertRaises(TypeError, format, object(), 4)
1818 self.assertRaises(TypeError, format, object(), object())
1819
1820 # tests for object.__format__ really belong elsewhere, but
1821 # there's no good place to put them
1822 x = object().__format__('')
1823 self.assertTrue(x.startswith('<object object at'))
1824
1825 # first argument to object.__format__ must be string
1826 self.assertRaises(TypeError, object().__format__, 3)
1827 self.assertRaises(TypeError, object().__format__, object())
1828 self.assertRaises(TypeError, object().__format__, None)
1829
1830 # --------------------------------------------------------------------
1831 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001832 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001833 class A:
1834 def __format__(self, fmt_str):
1835 return format('', fmt_str)
1836
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001837 self.assertEqual(format(A()), '')
1838 self.assertEqual(format(A(), ''), '')
1839 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001840
1841 class B:
1842 pass
1843
1844 class C(object):
1845 pass
1846
1847 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001848 obj = cls()
1849 self.assertEqual(format(obj), str(obj))
1850 self.assertEqual(format(obj, ''), str(obj))
1851 with self.assertRaisesRegex(TypeError,
1852 r'\b%s\b' % re.escape(cls.__name__)):
1853 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001854 # --------------------------------------------------------------------
1855
1856 # make sure we can take a subclass of str as a format spec
1857 class DerivedFromStr(str): pass
1858 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1859
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001860 def test_bin(self):
1861 self.assertEqual(bin(0), '0b0')
1862 self.assertEqual(bin(1), '0b1')
1863 self.assertEqual(bin(-1), '-0b1')
1864 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1865 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1866 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1867 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1868
Georg Brandl953152f2009-07-22 12:03:59 +00001869 def test_bytearray_translate(self):
1870 x = bytearray(b"abc")
1871 self.assertRaises(ValueError, x.translate, b"1", 1)
1872 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1873
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001874 def test_bytearray_extend_error(self):
1875 array = bytearray()
1876 bad_iter = map(int, "X")
1877 self.assertRaises(ValueError, array.extend, bad_iter)
1878
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001879 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001880 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001881 tp = type(const)
1882 self.assertIs(tp(), const)
1883 self.assertRaises(TypeError, tp, 1, 2)
1884 self.assertRaises(TypeError, tp, a=1, b=2)
1885
MojoVampire469325c2020-03-03 18:50:17 +00001886 def test_warning_notimplemented(self):
1887 # Issue #35712: NotImplemented is a sentinel value that should never
1888 # be evaluated in a boolean context (virtually all such use cases
1889 # are a result of accidental misuse implementing rich comparison
1890 # operations in terms of one another).
1891 # For the time being, it will continue to evaluate as truthy, but
1892 # issue a deprecation warning (with the eventual intent to make it
1893 # a TypeError).
1894 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1895 with self.assertWarns(DeprecationWarning):
1896 self.assertTrue(NotImplemented)
1897 with self.assertWarns(DeprecationWarning):
1898 self.assertFalse(not NotImplemented)
1899
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001900
1901class TestBreakpoint(unittest.TestCase):
1902 def setUp(self):
1903 # These tests require a clean slate environment. For example, if the
1904 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1905 # will mess up these tests. Similarly for sys.breakpointhook.
1906 # Cleaning the slate here means you can't use breakpoint() to debug
1907 # these tests, but I think that's okay. Just use pdb.set_trace() if
1908 # you must.
1909 self.resources = ExitStack()
1910 self.addCleanup(self.resources.close)
1911 self.env = self.resources.enter_context(EnvironmentVarGuard())
1912 del self.env['PYTHONBREAKPOINT']
1913 self.resources.enter_context(
1914 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1915
1916 def test_breakpoint(self):
1917 with patch('pdb.set_trace') as mock:
1918 breakpoint()
1919 mock.assert_called_once()
1920
1921 def test_breakpoint_with_breakpointhook_set(self):
1922 my_breakpointhook = MagicMock()
1923 sys.breakpointhook = my_breakpointhook
1924 breakpoint()
1925 my_breakpointhook.assert_called_once_with()
1926
1927 def test_breakpoint_with_breakpointhook_reset(self):
1928 my_breakpointhook = MagicMock()
1929 sys.breakpointhook = my_breakpointhook
1930 breakpoint()
1931 my_breakpointhook.assert_called_once_with()
1932 # Reset the hook and it will not be called again.
1933 sys.breakpointhook = sys.__breakpointhook__
1934 with patch('pdb.set_trace') as mock:
1935 breakpoint()
1936 mock.assert_called_once_with()
1937 my_breakpointhook.assert_called_once_with()
1938
1939 def test_breakpoint_with_args_and_keywords(self):
1940 my_breakpointhook = MagicMock()
1941 sys.breakpointhook = my_breakpointhook
1942 breakpoint(1, 2, 3, four=4, five=5)
1943 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1944
1945 def test_breakpoint_with_passthru_error(self):
1946 def my_breakpointhook():
1947 pass
1948 sys.breakpointhook = my_breakpointhook
1949 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1950
1951 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1952 def test_envar_good_path_builtin(self):
1953 self.env['PYTHONBREAKPOINT'] = 'int'
1954 with patch('builtins.int') as mock:
1955 breakpoint('7')
1956 mock.assert_called_once_with('7')
1957
1958 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1959 def test_envar_good_path_other(self):
1960 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1961 with patch('sys.exit') as mock:
1962 breakpoint()
1963 mock.assert_called_once_with()
1964
1965 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1966 def test_envar_good_path_noop_0(self):
1967 self.env['PYTHONBREAKPOINT'] = '0'
1968 with patch('pdb.set_trace') as mock:
1969 breakpoint()
1970 mock.assert_not_called()
1971
1972 def test_envar_good_path_empty_string(self):
1973 # PYTHONBREAKPOINT='' is the same as it not being set.
1974 self.env['PYTHONBREAKPOINT'] = ''
1975 with patch('pdb.set_trace') as mock:
1976 breakpoint()
1977 mock.assert_called_once_with()
1978
1979 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1980 def test_envar_unimportable(self):
1981 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001982 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001983 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001984 'nosuchbuiltin',
1985 'nosuchmodule.nosuchcallable',
1986 ):
1987 with self.subTest(envar=envar):
1988 self.env['PYTHONBREAKPOINT'] = envar
1989 mock = self.resources.enter_context(patch('pdb.set_trace'))
1990 w = self.resources.enter_context(check_warnings(quiet=True))
1991 breakpoint()
1992 self.assertEqual(
1993 str(w.message),
1994 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1995 self.assertEqual(w.category, RuntimeWarning)
1996 mock.assert_not_called()
1997
1998 def test_envar_ignored_when_hook_is_set(self):
1999 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
2000 with patch('sys.exit') as mock:
2001 sys.breakpointhook = int
2002 breakpoint()
2003 mock.assert_not_called()
2004
2005
Martin Panterc9a6ab52015-10-10 01:25:38 +00002006@unittest.skipUnless(pty, "the pty and signal modules must be available")
2007class PtyTests(unittest.TestCase):
2008 """Tests that use a pseudo terminal to guarantee stdin and stdout are
2009 terminals in the test environment"""
2010
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002011 @staticmethod
2012 def handle_sighup(signum, frame):
2013 # bpo-40140: if the process is the session leader, os.close(fd)
2014 # of "pid, fd = pty.fork()" can raise SIGHUP signal:
2015 # just ignore the signal.
2016 pass
2017
Martin Pantere44dba32015-10-10 05:27:15 +00002018 def run_child(self, child, terminal_input):
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002019 old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
2020 try:
2021 return self._run_child(child, terminal_input)
2022 finally:
2023 signal.signal(signal.SIGHUP, old_sighup)
2024
2025 def _run_child(self, child, terminal_input):
Martin Pantere44dba32015-10-10 05:27:15 +00002026 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00002027 try:
Martin Pantere44dba32015-10-10 05:27:15 +00002028 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00002029 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00002030 os.close(r)
2031 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002032 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00002033 raise
Victor Stinner16d75672020-04-01 00:27:18 +02002034
Martin Panterc9a6ab52015-10-10 01:25:38 +00002035 if pid == 0:
2036 # Child
2037 try:
2038 # Make sure we don't get stuck if there's a problem
2039 signal.alarm(2)
2040 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002041 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00002042 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002043 except:
2044 traceback.print_exc()
2045 finally:
2046 # We don't want to return to unittest...
2047 os._exit(0)
Victor Stinner16d75672020-04-01 00:27:18 +02002048
Martin Panterc9a6ab52015-10-10 01:25:38 +00002049 # Parent
2050 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002051 os.write(fd, terminal_input)
Victor Stinner16d75672020-04-01 00:27:18 +02002052
Martin Panterc9a6ab52015-10-10 01:25:38 +00002053 # Get results from the pipe
2054 with open(r, "r") as rpipe:
2055 lines = []
2056 while True:
2057 line = rpipe.readline().strip()
2058 if line == "":
2059 # The other end was closed => the child exited
2060 break
2061 lines.append(line)
Victor Stinner16d75672020-04-01 00:27:18 +02002062
Martin Panterc9a6ab52015-10-10 01:25:38 +00002063 # Check the result was got and corresponds to the user's terminal input
2064 if len(lines) != 2:
2065 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00002066 # Beware of Linux raising EIO when the slave is closed
2067 child_output = bytearray()
2068 while True:
2069 try:
2070 chunk = os.read(fd, 3000)
2071 except OSError: # Assume EIO
2072 break
2073 if not chunk:
2074 break
2075 child_output.extend(chunk)
2076 os.close(fd)
2077 child_output = child_output.decode("ascii", "ignore")
2078 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
2079 % (len(lines), child_output))
Victor Stinner4baca1b2017-08-09 17:44:19 +02002080
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002081 # bpo-40155: Close the PTY before waiting for the child process
2082 # completion, otherwise the child process hangs on AIX.
Victor Stinner16d75672020-04-01 00:27:18 +02002083 os.close(fd)
2084
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002085 support.wait_process(pid, exitcode=0)
2086
Martin Pantere44dba32015-10-10 05:27:15 +00002087 return lines
2088
2089 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
2090 if not sys.stdin.isatty() or not sys.stdout.isatty():
2091 self.skipTest("stdin and stdout must be ttys")
2092 def child(wpipe):
2093 # Check the error handlers are accounted for
2094 if stdio_encoding:
2095 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
2096 encoding=stdio_encoding,
2097 errors='surrogateescape')
2098 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
2099 encoding=stdio_encoding,
2100 errors='replace')
2101 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
2102 print(ascii(input(prompt)), file=wpipe)
2103 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00002104 # Check we did exercise the GNU readline path
2105 self.assertIn(lines[0], {'tty = True', 'tty = False'})
2106 if lines[0] != 'tty = True':
2107 self.skipTest("standard IO in should have been a tty")
2108 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
2109 if stdio_encoding:
2110 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
2111 else:
2112 expected = terminal_input.decode(sys.stdin.encoding) # what else?
2113 self.assertEqual(input_result, expected)
2114
2115 def test_input_tty(self):
2116 # Test input() functionality when wired to a tty (the code path
2117 # is different and invokes GNU readline if available).
2118 self.check_input_tty("prompt", b"quux")
2119
2120 def test_input_tty_non_ascii(self):
2121 # Check stdin/stdout encoding is used when invoking GNU readline
2122 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
2123
2124 def test_input_tty_non_ascii_unicode_errors(self):
2125 # Check stdin/stdout error handler is used when invoking GNU readline
2126 self.check_input_tty("prompté", b"quux\xe9", "ascii")
2127
2128 def test_input_no_stdout_fileno(self):
2129 # Issue #24402: If stdin is the original terminal but stdout.fileno()
2130 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00002131 def child(wpipe):
2132 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
2133 sys.stdout = io.StringIO() # Does not support fileno()
2134 input("prompt")
2135 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
2136 lines = self.run_child(child, b"quux\r")
2137 expected = (
2138 "stdin.isatty(): True",
2139 "captured: 'prompt'",
2140 )
2141 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002142
Raymond Hettinger64958a12003-12-17 20:43:33 +00002143class TestSorted(unittest.TestCase):
2144
2145 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002146 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002147 copy = data[:]
2148 random.shuffle(copy)
2149 self.assertEqual(data, sorted(copy))
2150 self.assertNotEqual(data, copy)
2151
2152 data.reverse()
2153 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00002154 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2155 self.assertNotEqual(data, copy)
2156 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03002157 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002158 self.assertNotEqual(data, copy)
2159
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02002160 def test_bad_arguments(self):
2161 # Issue #29327: The first argument is positional-only.
2162 sorted([])
2163 with self.assertRaises(TypeError):
2164 sorted(iterable=[])
2165 # Other arguments are keyword-only
2166 sorted([], key=None)
2167 with self.assertRaises(TypeError):
2168 sorted([], None)
2169
Raymond Hettinger64958a12003-12-17 20:43:33 +00002170 def test_inputtypes(self):
2171 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002172 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002173 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002174 self.assertEqual(sorted(s), sorted(T(s)))
2175
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002176 s = ''.join(set(s)) # unique letters only
2177 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002178 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002179 self.assertEqual(sorted(s), sorted(T(s)))
2180
2181 def test_baddecorator(self):
2182 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2183 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2184
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002185
2186class ShutdownTest(unittest.TestCase):
2187
2188 def test_cleanup(self):
2189 # Issue #19255: builtins are still available at shutdown
2190 code = """if 1:
2191 import builtins
2192 import sys
2193
2194 class C:
2195 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002196 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002197 # Check that builtins still exist
2198 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002199 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002200
2201 c = C()
2202 # Make this module survive until builtins and sys are cleaned
2203 builtins.here = sys.modules[__name__]
2204 sys.here = sys.modules[__name__]
2205 # Create a reference loop so that this module needs to go
2206 # through a GC phase.
2207 here = sys.modules[__name__]
2208 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002209 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2210 # otherwise the codec may be unloaded before C.__del__() is called, and
2211 # so print("before") fails because the codec cannot be used to encode
2212 # "before" to sys.stdout.encoding. For example, on Windows,
2213 # sys.stdout.encoding is the OEM code page and these code pages are
2214 # implemented in Python
2215 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002216 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002217 self.assertEqual(["before", "after"], out.decode().splitlines())
2218
2219
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002220class TestType(unittest.TestCase):
2221 def test_new_type(self):
2222 A = type('A', (), {})
2223 self.assertEqual(A.__name__, 'A')
2224 self.assertEqual(A.__qualname__, 'A')
2225 self.assertEqual(A.__module__, __name__)
2226 self.assertEqual(A.__bases__, (object,))
2227 self.assertIs(A.__base__, object)
2228 x = A()
2229 self.assertIs(type(x), A)
2230 self.assertIs(x.__class__, A)
2231
2232 class B:
2233 def ham(self):
2234 return 'ham%d' % self
2235 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2236 self.assertEqual(C.__name__, 'C')
2237 self.assertEqual(C.__qualname__, 'C')
2238 self.assertEqual(C.__module__, __name__)
2239 self.assertEqual(C.__bases__, (B, int))
2240 self.assertIs(C.__base__, int)
2241 self.assertIn('spam', C.__dict__)
2242 self.assertNotIn('ham', C.__dict__)
2243 x = C(42)
2244 self.assertEqual(x, 42)
2245 self.assertIs(type(x), C)
2246 self.assertIs(x.__class__, C)
2247 self.assertEqual(x.ham(), 'ham42')
2248 self.assertEqual(x.spam(), 'spam42')
2249 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2250
Nick Coghland78448e2016-07-30 16:26:03 +10002251 def test_type_nokwargs(self):
2252 with self.assertRaises(TypeError):
2253 type('a', (), {}, x=5)
2254 with self.assertRaises(TypeError):
2255 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002256
2257 def test_type_name(self):
2258 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2259 with self.subTest(name=name):
2260 A = type(name, (), {})
2261 self.assertEqual(A.__name__, name)
2262 self.assertEqual(A.__qualname__, name)
2263 self.assertEqual(A.__module__, __name__)
2264 with self.assertRaises(ValueError):
2265 type('A\x00B', (), {})
2266 with self.assertRaises(ValueError):
2267 type('A\udcdcB', (), {})
2268 with self.assertRaises(TypeError):
2269 type(b'A', (), {})
2270
2271 C = type('C', (), {})
2272 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2273 with self.subTest(name=name):
2274 C.__name__ = name
2275 self.assertEqual(C.__name__, name)
2276 self.assertEqual(C.__qualname__, 'C')
2277 self.assertEqual(C.__module__, __name__)
2278
2279 A = type('C', (), {})
2280 with self.assertRaises(ValueError):
2281 A.__name__ = 'A\x00B'
2282 self.assertEqual(A.__name__, 'C')
2283 with self.assertRaises(ValueError):
2284 A.__name__ = 'A\udcdcB'
2285 self.assertEqual(A.__name__, 'C')
2286 with self.assertRaises(TypeError):
2287 A.__name__ = b'A'
2288 self.assertEqual(A.__name__, 'C')
2289
2290 def test_type_qualname(self):
2291 A = type('A', (), {'__qualname__': 'B.C'})
2292 self.assertEqual(A.__name__, 'A')
2293 self.assertEqual(A.__qualname__, 'B.C')
2294 self.assertEqual(A.__module__, __name__)
2295 with self.assertRaises(TypeError):
2296 type('A', (), {'__qualname__': b'B'})
2297 self.assertEqual(A.__qualname__, 'B.C')
2298
2299 A.__qualname__ = 'D.E'
2300 self.assertEqual(A.__name__, 'A')
2301 self.assertEqual(A.__qualname__, 'D.E')
2302 with self.assertRaises(TypeError):
2303 A.__qualname__ = b'B'
2304 self.assertEqual(A.__qualname__, 'D.E')
2305
2306 def test_type_doc(self):
2307 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2308 A = type('A', (), {'__doc__': doc})
2309 self.assertEqual(A.__doc__, doc)
2310 with self.assertRaises(UnicodeEncodeError):
2311 type('A', (), {'__doc__': 'x\udcdcy'})
2312
2313 A = type('A', (), {})
2314 self.assertEqual(A.__doc__, None)
2315 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2316 A.__doc__ = doc
2317 self.assertEqual(A.__doc__, doc)
2318
2319 def test_bad_args(self):
2320 with self.assertRaises(TypeError):
2321 type()
2322 with self.assertRaises(TypeError):
2323 type('A', ())
2324 with self.assertRaises(TypeError):
2325 type('A', (), {}, ())
2326 with self.assertRaises(TypeError):
2327 type('A', (), dict={})
2328 with self.assertRaises(TypeError):
2329 type('A', [], {})
2330 with self.assertRaises(TypeError):
2331 type('A', (), types.MappingProxyType({}))
2332 with self.assertRaises(TypeError):
2333 type('A', (None,), {})
2334 with self.assertRaises(TypeError):
2335 type('A', (bool,), {})
2336 with self.assertRaises(TypeError):
2337 type('A', (int, str), {})
2338
2339 def test_bad_slots(self):
2340 with self.assertRaises(TypeError):
2341 type('A', (), {'__slots__': b'x'})
2342 with self.assertRaises(TypeError):
2343 type('A', (int,), {'__slots__': 'x'})
2344 with self.assertRaises(TypeError):
2345 type('A', (), {'__slots__': ''})
2346 with self.assertRaises(TypeError):
2347 type('A', (), {'__slots__': '42'})
2348 with self.assertRaises(TypeError):
2349 type('A', (), {'__slots__': 'x\x00y'})
2350 with self.assertRaises(ValueError):
2351 type('A', (), {'__slots__': 'x', 'x': 0})
2352 with self.assertRaises(TypeError):
2353 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2354 with self.assertRaises(TypeError):
2355 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2356
2357 class B:
2358 pass
2359 with self.assertRaises(TypeError):
2360 type('A', (B,), {'__slots__': '__dict__'})
2361 with self.assertRaises(TypeError):
2362 type('A', (B,), {'__slots__': '__weakref__'})
2363
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002364 def test_namespace_order(self):
2365 # bpo-34320: namespace should preserve order
2366 od = collections.OrderedDict([('a', 1), ('b', 2)])
2367 od.move_to_end('a')
2368 expected = list(od.items())
2369
2370 C = type('C', (), od)
2371 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2372
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002373
Zachary Warea4b7a752013-11-24 01:19:09 -06002374def load_tests(loader, tests, pattern):
2375 from doctest import DocTestSuite
2376 tests.addTest(DocTestSuite(builtins))
2377 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002378
2379if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002380 unittest.main()