blob: 3dcdf8d903059b691fd47ea8405bef896211a682 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004import asyncio
Victor Stinnerf86a5e82012-06-05 13:43:22 +02005import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00006import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07007import decimal
8import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00009import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010011import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020013import platform
14import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020015import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020016import sys
17import traceback
18import types
19import unittest
20import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040021from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040022from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070023from inspect import CO_COROUTINE
24from itertools import product
25from textwrap import dedent
26from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020027from operator import neg
Victor Stinner278c1e12020-03-31 20:08:12 +020028from test import support
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040029from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070030 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
31 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030032from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040033from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010034try:
Antoine Pitrou772add72011-11-06 02:37:42 +010035 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010036except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010037 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Walter Dörwald919497e2003-01-19 16:23:59 +000040class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000041
Walter Dörwald919497e2003-01-19 16:23:59 +000042 def __init__(self, max):
43 self.max = max
44 self.sofar = []
45
46 def __len__(self): return len(self.sofar)
47
48 def __getitem__(self, i):
49 if not 0 <= i < self.max: raise IndexError
50 n = len(self.sofar)
51 while n <= i:
52 self.sofar.append(n*n)
53 n += 1
54 return self.sofar[i]
55
56class StrSquares:
57
58 def __init__(self, max):
59 self.max = max
60 self.sofar = []
61
62 def __len__(self):
63 return len(self.sofar)
64
65 def __getitem__(self, i):
66 if not 0 <= i < self.max:
67 raise IndexError
68 n = len(self.sofar)
69 while n <= i:
70 self.sofar.append(str(n*n))
71 n += 1
72 return self.sofar[i]
73
74class BitBucket:
75 def write(self, line):
76 pass
77
Facundo Batista2336bdd2008-01-19 19:12:01 +000078test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000079 ('0', 0),
80 ('1', 1),
81 ('9', 9),
82 ('10', 10),
83 ('99', 99),
84 ('100', 100),
85 ('314', 314),
86 (' 314', 314),
87 ('314 ', 314),
88 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000089 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000090 (' 1x', ValueError),
91 (' 1 ', 1),
92 (' 1\02 ', ValueError),
93 ('', ValueError),
94 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000095 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040096 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000097 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000098]
99
Facundo Batista2336bdd2008-01-19 19:12:01 +0000100test_conv_sign = [
101 ('0', 0),
102 ('1', 1),
103 ('9', 9),
104 ('10', 10),
105 ('99', 99),
106 ('100', 100),
107 ('314', 314),
108 (' 314', ValueError),
109 ('314 ', 314),
110 (' \t\t 314 \t\t ', ValueError),
111 (repr(sys.maxsize), sys.maxsize),
112 (' 1x', ValueError),
113 (' 1 ', ValueError),
114 (' 1\02 ', ValueError),
115 ('', ValueError),
116 (' ', ValueError),
117 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400118 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000119 (chr(0x200), ValueError),
120]
121
Raymond Hettinger96229b12005-03-11 06:49:40 +0000122class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000123 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000124 raise RuntimeError
125
126class TestFailingIter:
127 def __iter__(self):
128 raise RuntimeError
129
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000130def filter_char(arg):
131 return ord(arg) > ord("d")
132
133def map_char(arg):
134 return chr(ord(arg)+1)
135
Walter Dörwald919497e2003-01-19 16:23:59 +0000136class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000137 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200138 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000139 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200140 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000141 it = pickle.loads(d)
142 self.assertEqual(type(itorg), type(it))
143 self.assertEqual(list(it), seq)
144
145 #test the iterator after dropping one from it
146 it = pickle.loads(d)
147 try:
148 next(it)
149 except StopIteration:
150 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200151 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000152 it = pickle.loads(d)
153 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000154
155 def test_import(self):
156 __import__('sys')
157 __import__('time')
158 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000159 __import__(name='sys')
160 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000161 self.assertRaises(ImportError, __import__, 'spamspam')
162 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000163 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000164 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000165 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100166 with self.assertWarns(ImportWarning):
167 self.assertRaises(ImportError, __import__, '',
168 {'__package__': None, '__spec__': None, '__name__': '__main__'},
169 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300170 # embedded null character
171 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000172
173 def test_abs(self):
174 # int
175 self.assertEqual(abs(0), 0)
176 self.assertEqual(abs(1234), 1234)
177 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 # float
180 self.assertEqual(abs(0.0), 0.0)
181 self.assertEqual(abs(3.14), 3.14)
182 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 # str
184 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000185 # bool
186 self.assertEqual(abs(True), 1)
187 self.assertEqual(abs(False), 0)
188 # other
189 self.assertRaises(TypeError, abs)
190 self.assertRaises(TypeError, abs, None)
191 class AbsClass(object):
192 def __abs__(self):
193 return -5
194 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000195
Raymond Hettinger96229b12005-03-11 06:49:40 +0000196 def test_all(self):
197 self.assertEqual(all([2, 4, 6]), True)
198 self.assertEqual(all([2, None, 6]), False)
199 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
200 self.assertRaises(RuntimeError, all, TestFailingIter())
201 self.assertRaises(TypeError, all, 10) # Non-iterable
202 self.assertRaises(TypeError, all) # No args
203 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
204 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200205 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000206 S = [50, 60]
207 self.assertEqual(all(x > 42 for x in S), True)
208 S = [50, 40, 60]
209 self.assertEqual(all(x > 42 for x in S), False)
210
211 def test_any(self):
212 self.assertEqual(any([None, None, None]), False)
213 self.assertEqual(any([None, 4, None]), True)
214 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500215 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000216 self.assertRaises(TypeError, any, 10) # Non-iterable
217 self.assertRaises(TypeError, any) # No args
218 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
219 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200220 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000221 S = [40, 60, 30]
222 self.assertEqual(any(x > 42 for x in S), True)
223 S = [10, 20, 30]
224 self.assertEqual(any(x > 42 for x in S), False)
225
Georg Brandl559e5d72008-06-11 18:37:52 +0000226 def test_ascii(self):
227 self.assertEqual(ascii(''), '\'\'')
228 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000229 self.assertEqual(ascii(()), '()')
230 self.assertEqual(ascii([]), '[]')
231 self.assertEqual(ascii({}), '{}')
232 a = []
233 a.append(a)
234 self.assertEqual(ascii(a), '[[...]]')
235 a = {}
236 a[0] = a
237 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000238 # Advanced checks for unicode strings
239 def _check_uni(s):
240 self.assertEqual(ascii(s), repr(s))
241 _check_uni("'")
242 _check_uni('"')
243 _check_uni('"\'')
244 _check_uni('\0')
245 _check_uni('\r\n\t .')
246 # Unprintable non-ASCII characters
247 _check_uni('\x85')
248 _check_uni('\u1fff')
249 _check_uni('\U00012fff')
250 # Lone surrogates
251 _check_uni('\ud800')
252 _check_uni('\udfff')
253 # Issue #9804: surrogates should be joined even for printable
254 # wide characters (UCS-2 builds).
255 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
256 # All together
257 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
258 self.assertEqual(ascii(s),
259 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000260
Thomas Wouters89f507f2006-12-13 04:49:30 +0000261 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000262 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000264 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265
Walter Dörwald919497e2003-01-19 16:23:59 +0000266 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000267 self.assertTrue(callable(len))
268 self.assertFalse(callable("a"))
269 self.assertTrue(callable(callable))
270 self.assertTrue(callable(lambda x, y: x + y))
271 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000272 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000273 self.assertTrue(callable(f))
274
275 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000276 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000277 self.assertTrue(callable(C1))
278 c = C1()
279 self.assertTrue(callable(c.meth))
280 self.assertFalse(callable(c))
281
282 # __call__ is looked up on the class, not the instance
283 c.__call__ = None
284 self.assertFalse(callable(c))
285 c.__call__ = lambda self: 0
286 self.assertFalse(callable(c))
287 del c.__call__
288 self.assertFalse(callable(c))
289
290 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000291 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000292 c2 = C2()
293 self.assertTrue(callable(c2))
294 c2.__call__ = None
295 self.assertTrue(callable(c2))
296 class C3(C2): pass
297 c3 = C3()
298 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000299
300 def test_chr(self):
301 self.assertEqual(chr(32), ' ')
302 self.assertEqual(chr(65), 'A')
303 self.assertEqual(chr(97), 'a')
304 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000305 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000306 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300307 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000308 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000309 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
310 self.assertEqual(chr(0x00010000), "\U00010000")
311 self.assertEqual(chr(0x00010001), "\U00010001")
312 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
313 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
314 self.assertEqual(chr(0x00100000), "\U00100000")
315 self.assertEqual(chr(0x00100001), "\U00100001")
316 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
317 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
318 self.assertRaises(ValueError, chr, -1)
319 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000320 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000321
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000322 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000323 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000324
Walter Dörwald919497e2003-01-19 16:23:59 +0000325 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000326 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000327 bom = b'\xef\xbb\xbf'
328 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000329 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300330 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
331 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000332 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000333 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
335 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300336 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
338 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000339 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300340 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000341 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 # test the optimize argument
344
345 codestr = '''def f():
346 """doc"""
diana543386b2017-10-03 10:46:56 -0600347 debug_enabled = False
348 if __debug__:
349 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000350 try:
351 assert False
352 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200353 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000354 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200355 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000356 '''
357 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200358 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
359 (0, True, 'doc', True, True),
360 (1, False, 'doc', False, False),
361 (2, False, None, False, False)]
362 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000363 # test both direct compilation and compilation via AST
364 codeobjs = []
365 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
366 tree = ast.parse(codestr)
367 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
368 for code in codeobjs:
369 ns = {}
370 exec(code, ns)
371 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200372 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000373
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700374 def test_compile_top_level_await_no_coro(self):
375 """Make sure top level non-await codes get the correct coroutine flags.
376 """
377 modes = ('single', 'exec')
378 code_samples = [
379 '''def f():pass\n''',
380 '''[x for x in l]'''
381 ]
382 for mode, code_sample in product(modes, code_samples):
383 source = dedent(code_sample)
384 co = compile(source,
385 '?',
386 mode,
387 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
388
389 self.assertNotEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
390 msg=f"source={source} mode={mode}")
391
392
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700393 def test_compile_top_level_await(self):
394 """Test whether code some top level await can be compiled.
395
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400396 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
397 set, and make sure the generated code object has the CO_COROUTINE flag
398 set in order to execute it with `await eval(.....)` instead of exec,
399 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700400 """
401
402 # helper function just to check we can run top=level async-for
403 async def arange(n):
404 for i in range(n):
405 yield i
406
407 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400408 code_samples = [
409 '''a = await asyncio.sleep(0, result=1)''',
410 '''async for i in arange(1):
411 a = 1''',
412 '''async with asyncio.Lock() as l:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300413 a = 1''',
414 '''a = [x async for x in arange(2)][1]''',
415 '''a = 1 in {x async for x in arange(2)}''',
416 '''a = {x:1 async for x in arange(1)}[0]''',
417 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
418 '''a = [x async for x in (x async for x in arange(5))][1]''',
419 '''a, = [1 for x in {x async for x in arange(1)}]''',
420 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400421 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700422 policy = maybe_get_event_loop_policy()
423 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400424 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700425 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400426 with self.assertRaises(
427 SyntaxError, msg=f"source={source} mode={mode}"):
428 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700429
430 co = compile(source,
431 '?',
432 mode,
433 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
434
435 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400436 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700437
438 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400439 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700440 async_f = FunctionType(co, globals_)
441 asyncio.run(async_f())
442 self.assertEqual(globals_['a'], 1)
443
444 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400445 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700446 asyncio.run(eval(co, globals_))
447 self.assertEqual(globals_['a'], 1)
448 finally:
449 asyncio.set_event_loop_policy(policy)
450
Pablo Galindo90235812020-03-15 04:29:22 +0000451 def test_compile_top_level_await_invalid_cases(self):
452 # helper function just to check we can run top=level async-for
453 async def arange(n):
454 for i in range(n):
455 yield i
456
457 modes = ('single', 'exec')
458 code_samples = [
459 '''def f(): await arange(10)\n''',
460 '''def f(): [x async for x in arange(10)]\n''',
461 '''def f(): [await x async for x in arange(10)]\n''',
462 '''def f():
463 async for i in arange(1):
464 a = 1
465 ''',
466 '''def f():
467 async with asyncio.Lock() as l:
468 a = 1
469 '''
470 ]
471 policy = maybe_get_event_loop_policy()
472 try:
473 for mode, code_sample in product(modes, code_samples):
474 source = dedent(code_sample)
475 with self.assertRaises(
476 SyntaxError, msg=f"source={source} mode={mode}"):
477 compile(source, '?', mode)
478
479 with self.assertRaises(
480 SyntaxError, msg=f"source={source} mode={mode}"):
481 co = compile(source,
482 '?',
483 mode,
484 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
485 finally:
486 asyncio.set_event_loop_policy(policy)
487
488
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700489 def test_compile_async_generator(self):
490 """
491 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400492 make sure AsyncGenerators are still properly not marked with the
493 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700494 """
495 code = dedent("""async def ticker():
496 for i in range(10):
497 yield i
498 await asyncio.sleep(0)""")
499
500 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
501 glob = {}
502 exec(co, glob)
503 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
504
Walter Dörwald919497e2003-01-19 16:23:59 +0000505 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000506 sys.spam = 1
507 delattr(sys, 'spam')
508 self.assertRaises(TypeError, delattr)
509
510 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000511 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000512 self.assertRaises(TypeError, dir, 42, 42)
513
Georg Brandle32b4222007-03-10 22:13:27 +0000514 # dir() - local scope
515 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000516 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000517
518 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000519 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000520
521 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000522 class Foo(types.ModuleType):
523 __dict__ = 8
524 f = Foo("foo")
525 self.assertRaises(TypeError, dir, f)
526
527 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000528 self.assertIn("strip", dir(str))
529 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000530
531 # dir(obj)
532 class Foo(object):
533 def __init__(self):
534 self.x = 7
535 self.y = 8
536 self.z = 9
537 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000538 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000539
540 # dir(obj_no__dict__)
541 class Foo(object):
542 __slots__ = []
543 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000544 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000545
546 # dir(obj_no__class__with__dict__)
547 # (an ugly trick to cause getattr(f, "__class__") to fail)
548 class Foo(object):
549 __slots__ = ["__class__", "__dict__"]
550 def __init__(self):
551 self.bar = "wow"
552 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000553 self.assertNotIn("__repr__", dir(f))
554 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000555
556 # dir(obj_using __dir__)
557 class Foo(object):
558 def __dir__(self):
559 return ["kan", "ga", "roo"]
560 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000561 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000562
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500563 # dir(obj__dir__tuple)
564 class Foo(object):
565 def __dir__(self):
566 return ("b", "c", "a")
567 res = dir(Foo())
568 self.assertIsInstance(res, list)
569 self.assertTrue(res == ["a", "b", "c"])
570
571 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000572 class Foo(object):
573 def __dir__(self):
574 return 7
575 f = Foo()
576 self.assertRaises(TypeError, dir, f)
577
Collin Winter3eed7652007-08-14 17:53:54 +0000578 # dir(traceback)
579 try:
580 raise IndexError
581 except:
582 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
583
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500584 # test that object has a __dir__()
585 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000586
Walter Dörwald919497e2003-01-19 16:23:59 +0000587 def test_divmod(self):
588 self.assertEqual(divmod(12, 7), (1, 5))
589 self.assertEqual(divmod(-12, 7), (-2, 2))
590 self.assertEqual(divmod(12, -7), (-2, -2))
591 self.assertEqual(divmod(-12, -7), (1, -5))
592
Mark Dickinson5c2db372009-12-05 20:28:34 +0000593 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000594
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000595 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
596 (-3.25, 1.0, (-4.0, 0.75)),
597 (3.25, -1.0, (-4.0, -0.75)),
598 (-3.25, -1.0, (3.0, -0.25))]:
599 result = divmod(num, denom)
600 self.assertAlmostEqual(result[0], exp_result[0])
601 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000602
603 self.assertRaises(TypeError, divmod)
604
605 def test_eval(self):
606 self.assertEqual(eval('1+1'), 2)
607 self.assertEqual(eval(' 1+1\n'), 2)
608 globals = {'a': 1, 'b': 2}
609 locals = {'b': 200, 'c': 300}
610 self.assertEqual(eval('a', globals) , 1)
611 self.assertEqual(eval('a', globals, locals), 1)
612 self.assertEqual(eval('b', globals, locals), 200)
613 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000614 globals = {'a': 1, 'b': 2}
615 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000616 bom = b'\xef\xbb\xbf'
617 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000618 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000619 self.assertRaises(TypeError, eval)
620 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000621 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000622
Benjamin Peterson92722792012-12-15 12:51:05 -0500623 class X:
624 def __getitem__(self, key):
625 raise ValueError
626 self.assertRaises(ValueError, eval, "foo", {}, X())
627
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000628 def test_general_eval(self):
629 # Tests that general mappings can be used for the locals argument
630
631 class M:
632 "Test mapping interface versus possible calls from eval()."
633 def __getitem__(self, key):
634 if key == 'a':
635 return 12
636 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000637 def keys(self):
638 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000639
640 m = M()
641 g = globals()
642 self.assertEqual(eval('a', g, m), 12)
643 self.assertRaises(NameError, eval, 'b', g, m)
644 self.assertEqual(eval('dir()', g, m), list('xyz'))
645 self.assertEqual(eval('globals()', g, m), g)
646 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000647 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000648 class A:
649 "Non-mapping"
650 pass
651 m = A()
652 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000653
654 # Verify that dict subclasses work as well
655 class D(dict):
656 def __getitem__(self, key):
657 if key == 'a':
658 return 12
659 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000660 def keys(self):
661 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000662
663 d = D()
664 self.assertEqual(eval('a', g, d), 12)
665 self.assertRaises(NameError, eval, 'b', g, d)
666 self.assertEqual(eval('dir()', g, d), list('xyz'))
667 self.assertEqual(eval('globals()', g, d), g)
668 self.assertEqual(eval('locals()', g, d), d)
669
670 # Verify locals stores (used by list comps)
671 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000672 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000673
674 class SpreadSheet:
675 "Sample application showing nested, calculated lookups."
676 _cells = {}
677 def __setitem__(self, key, formula):
678 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000679 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000680 return eval(self._cells[key], globals(), self)
681
682 ss = SpreadSheet()
683 ss['a1'] = '5'
684 ss['a2'] = 'a1*6'
685 ss['a3'] = 'a2*7'
686 self.assertEqual(ss['a3'], 210)
687
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000688 # Verify that dir() catches a non-list returned by eval
689 # SF bug #1004669
690 class C:
691 def __getitem__(self, item):
692 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000693 def keys(self):
694 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000695 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
696
Georg Brandl7cae87c2006-09-06 06:51:57 +0000697 def test_exec(self):
698 g = {}
699 exec('z = 1', g)
700 if '__builtins__' in g:
701 del g['__builtins__']
702 self.assertEqual(g, {'z': 1})
703
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000704 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000705 if '__builtins__' in g:
706 del g['__builtins__']
707 self.assertEqual(g, {'z': 2})
708 g = {}
709 l = {}
710
Brett Cannon77628992010-03-20 20:59:33 +0000711 with check_warnings():
712 warnings.filterwarnings("ignore", "global statement",
713 module="<string>")
714 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000715 if '__builtins__' in g:
716 del g['__builtins__']
717 if '__builtins__' in l:
718 del l['__builtins__']
719 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
720
Victor Stinnerb0b22422012-04-19 00:57:45 +0200721 def test_exec_globals(self):
722 code = compile("print('Hello World!')", "", "exec")
723 # no builtin function
724 self.assertRaisesRegex(NameError, "name 'print' is not defined",
725 exec, code, {'__builtins__': {}})
726 # __builtins__ must be a mapping type
727 self.assertRaises(TypeError,
728 exec, code, {'__builtins__': 123})
729
730 # no __build_class__ function
731 code = compile("class A: pass", "", "exec")
732 self.assertRaisesRegex(NameError, "__build_class__ not found",
733 exec, code, {'__builtins__': {}})
734
735 class frozendict_error(Exception):
736 pass
737
738 class frozendict(dict):
739 def __setitem__(self, key, value):
740 raise frozendict_error("frozendict is readonly")
741
742 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400743 if isinstance(__builtins__, types.ModuleType):
744 frozen_builtins = frozendict(__builtins__.__dict__)
745 else:
746 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200747 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
748 self.assertRaises(frozendict_error,
749 exec, code, {'__builtins__': frozen_builtins})
750
751 # read-only globals
752 namespace = frozendict({})
753 code = compile("x=1", "test", "exec")
754 self.assertRaises(frozendict_error,
755 exec, code, namespace)
756
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000757 def test_exec_redirected(self):
758 savestdout = sys.stdout
759 sys.stdout = None # Whatever that cannot flush()
760 try:
761 # Used to raise SystemError('error return without exception set')
762 exec('a')
763 except NameError:
764 pass
765 finally:
766 sys.stdout = savestdout
767
Walter Dörwald919497e2003-01-19 16:23:59 +0000768 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000769 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
770 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
771 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
772 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
773 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000774 def identity(item):
775 return 1
776 filter(identity, Squares(5))
777 self.assertRaises(TypeError, filter)
778 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000779 def __getitem__(self, index):
780 if index<4:
781 return 42
782 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000783 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000784 def badfunc():
785 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000786 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000787
Walter Dörwaldbf517072003-01-27 15:57:14 +0000788 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
790 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
791 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000792
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000793 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200794 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
795 f1 = filter(filter_char, "abcdeabcde")
796 f2 = filter(filter_char, "abcdeabcde")
797 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000798
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000800 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 self.assertRaises(TypeError, getattr, sys, 1)
802 self.assertRaises(TypeError, getattr, sys, 1, "foo")
803 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000804 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000805 # unicode surrogates are not encodable to the default encoding (utf8)
806 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000807
808 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000809 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000810 self.assertRaises(TypeError, hasattr, sys, 1)
811 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000812 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000813
Benjamin Peterson17689992010-08-24 03:26:23 +0000814 # Check that hasattr propagates all exceptions outside of
815 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000816 class A:
817 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000818 raise SystemExit
819 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000820 class B:
821 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000822 raise ValueError
823 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000824
Walter Dörwald919497e2003-01-19 16:23:59 +0000825 def test_hash(self):
826 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000827 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 self.assertEqual(hash(1), hash(1.0))
829 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000830 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000831 hash((0,1,2,3))
832 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000833 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 self.assertRaises(TypeError, hash, [])
835 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000836 # Bug 1536021: Allow hash to return long objects
837 class X:
838 def __hash__(self):
839 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000840 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000841 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000842 def __hash__(self):
843 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000844 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000845
846 def test_hex(self):
847 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000848 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000849 self.assertRaises(TypeError, hex, {})
850
851 def test_id(self):
852 id(None)
853 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000854 id(1.0)
855 id('spam')
856 id((0,1,2,3))
857 id([0,1,2,3])
858 id({'spam': 1, 'eggs': 2, 'ham': 3})
859
Guido van Rossuma88a0332007-02-26 16:59:55 +0000860 # Test input() later, alphabetized as if it were raw_input
861
Walter Dörwald919497e2003-01-19 16:23:59 +0000862 def test_iter(self):
863 self.assertRaises(TypeError, iter)
864 self.assertRaises(TypeError, iter, 42, 42)
865 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000866 for l in lists:
867 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000868 self.assertEqual(next(i), '1')
869 self.assertEqual(next(i), '2')
870 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000871
872 def test_isinstance(self):
873 class C:
874 pass
875 class D(C):
876 pass
877 class E:
878 pass
879 c = C()
880 d = D()
881 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000882 self.assertTrue(isinstance(c, C))
883 self.assertTrue(isinstance(d, C))
884 self.assertTrue(not isinstance(e, C))
885 self.assertTrue(not isinstance(c, D))
886 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000887 self.assertRaises(TypeError, isinstance, E, 'foo')
888 self.assertRaises(TypeError, isinstance)
889
890 def test_issubclass(self):
891 class C:
892 pass
893 class D(C):
894 pass
895 class E:
896 pass
897 c = C()
898 d = D()
899 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000900 self.assertTrue(issubclass(D, C))
901 self.assertTrue(issubclass(C, C))
902 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000903 self.assertRaises(TypeError, issubclass, 'foo', E)
904 self.assertRaises(TypeError, issubclass, E, 'foo')
905 self.assertRaises(TypeError, issubclass)
906
907 def test_len(self):
908 self.assertEqual(len('123'), 3)
909 self.assertEqual(len(()), 0)
910 self.assertEqual(len((1, 2, 3, 4)), 4)
911 self.assertEqual(len([1, 2, 3, 4]), 4)
912 self.assertEqual(len({}), 0)
913 self.assertEqual(len({'a':1, 'b': 2}), 2)
914 class BadSeq:
915 def __len__(self):
916 raise ValueError
917 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000918 class InvalidLen:
919 def __len__(self):
920 return None
921 self.assertRaises(TypeError, len, InvalidLen())
922 class FloatLen:
923 def __len__(self):
924 return 4.5
925 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300926 class NegativeLen:
927 def __len__(self):
928 return -10
929 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000930 class HugeLen:
931 def __len__(self):
932 return sys.maxsize + 1
933 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300934 class HugeNegativeLen:
935 def __len__(self):
936 return -sys.maxsize-10
937 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000938 class NoLenMethod(object): pass
939 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000940
Walter Dörwald919497e2003-01-19 16:23:59 +0000941 def test_map(self):
942 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000943 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000944 [1, 4, 9]
945 )
946 try:
947 from math import sqrt
948 except ImportError:
949 def sqrt(x):
950 return pow(x, 0.5)
951 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000952 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000953 [[4.0, 2.0], [9.0, 3.0]]
954 )
955 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000956 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000957 [10, 4, 6]
958 )
959
960 def plus(*v):
961 accu = 0
962 for i in v: accu = accu + i
963 return accu
964 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000965 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000966 [1, 3, 7]
967 )
968 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000969 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000970 [1+4, 3+9, 7+2]
971 )
972 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000973 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000974 [1+4+1, 3+9+1, 7+2+0]
975 )
976 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000977 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
979 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000980 def Max(a, b):
981 if a is None:
982 return b
983 if b is None:
984 return a
985 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000986 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000987 list(map(Max, Squares(3), Squares(2))),
988 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 )
990 self.assertRaises(TypeError, map)
991 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000993 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000995 yield None
996 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000997 def badfunc(x):
998 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000999 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001000
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001001 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +02001002 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1003 m1 = map(map_char, "Is this the real life?")
1004 m2 = map(map_char, "Is this the real life?")
1005 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001006
Walter Dörwald919497e2003-01-19 16:23:59 +00001007 def test_max(self):
1008 self.assertEqual(max('123123'), '3')
1009 self.assertEqual(max(1, 2, 3), 3)
1010 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1011 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1012
Guido van Rossume2a383d2007-01-15 16:59:06 +00001013 self.assertEqual(max(1, 2, 3.0), 3.0)
1014 self.assertEqual(max(1, 2.0, 3), 3)
1015 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001016
Dong-hee Naabdc6342020-01-11 01:31:43 +09001017 with self.assertRaisesRegex(
1018 TypeError,
1019 'max expected at least 1 argument, got 0'
1020 ):
1021 max()
1022
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001023 self.assertRaises(TypeError, max, 42)
1024 self.assertRaises(ValueError, max, ())
1025 class BadSeq:
1026 def __getitem__(self, index):
1027 raise ValueError
1028 self.assertRaises(ValueError, max, BadSeq())
1029
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001030 for stmt in (
1031 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001032 "max(default=None)",
1033 "max(1, 2, default=None)", # require container for default
1034 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001035 "max(1, key=int)", # single arg not iterable
1036 "max(1, 2, keystone=int)", # wrong keyword
1037 "max(1, 2, key=int, abc=int)", # two many keywords
1038 "max(1, 2, key=1)", # keyfunc is not callable
1039 ):
Tim Peters7f061872004-12-07 21:17:46 +00001040 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001041 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001042 except TypeError:
1043 pass
1044 else:
1045 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001046
1047 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1048 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1049 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1050
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001051 self.assertEqual(max((), default=None), None) # zero elem iterable
1052 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1053 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1054
1055 self.assertEqual(max((), default=1, key=neg), 1)
1056 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1057
Alexander Marshalove22072f2018-07-24 10:58:21 +07001058 self.assertEqual(max((1, 2), key=None), 2)
1059
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001060 data = [random.randrange(200) for i in range(100)]
1061 keys = dict((elem, random.randrange(50)) for elem in data)
1062 f = keys.__getitem__
1063 self.assertEqual(max(data, key=f),
1064 sorted(reversed(data), key=f)[-1])
1065
Walter Dörwald919497e2003-01-19 16:23:59 +00001066 def test_min(self):
1067 self.assertEqual(min('123123'), '1')
1068 self.assertEqual(min(1, 2, 3), 1)
1069 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1070 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1071
Guido van Rossume2a383d2007-01-15 16:59:06 +00001072 self.assertEqual(min(1, 2, 3.0), 1)
1073 self.assertEqual(min(1, 2.0, 3), 1)
1074 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001075
Dong-hee Naabdc6342020-01-11 01:31:43 +09001076 with self.assertRaisesRegex(
1077 TypeError,
1078 'min expected at least 1 argument, got 0'
1079 ):
1080 min()
1081
Walter Dörwald919497e2003-01-19 16:23:59 +00001082 self.assertRaises(TypeError, min, 42)
1083 self.assertRaises(ValueError, min, ())
1084 class BadSeq:
1085 def __getitem__(self, index):
1086 raise ValueError
1087 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001088
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001089 for stmt in (
1090 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001091 "min(default=None)",
1092 "min(1, 2, default=None)", # require container for default
1093 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001094 "min(1, key=int)", # single arg not iterable
1095 "min(1, 2, keystone=int)", # wrong keyword
1096 "min(1, 2, key=int, abc=int)", # two many keywords
1097 "min(1, 2, key=1)", # keyfunc is not callable
1098 ):
Tim Peters7f061872004-12-07 21:17:46 +00001099 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001100 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001101 except TypeError:
1102 pass
1103 else:
1104 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001105
1106 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1107 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1108 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1109
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001110 self.assertEqual(min((), default=None), None) # zero elem iterable
1111 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1112 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1113
1114 self.assertEqual(min((), default=1, key=neg), 1)
1115 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1116
Alexander Marshalove22072f2018-07-24 10:58:21 +07001117 self.assertEqual(min((1, 2), key=None), 1)
1118
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001119 data = [random.randrange(200) for i in range(100)]
1120 keys = dict((elem, random.randrange(50)) for elem in data)
1121 f = keys.__getitem__
1122 self.assertEqual(min(data, key=f),
1123 sorted(data, key=f)[0])
1124
Georg Brandla18af4e2007-04-21 15:47:16 +00001125 def test_next(self):
1126 it = iter(range(2))
1127 self.assertEqual(next(it), 0)
1128 self.assertEqual(next(it), 1)
1129 self.assertRaises(StopIteration, next, it)
1130 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001131 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001132
1133 class Iter(object):
1134 def __iter__(self):
1135 return self
1136 def __next__(self):
1137 raise StopIteration
1138
1139 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001140 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001141 self.assertRaises(StopIteration, next, it)
1142
1143 def gen():
1144 yield 1
1145 return
1146
1147 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001148 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001149 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001150 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001151
Walter Dörwald919497e2003-01-19 16:23:59 +00001152 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001153 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001154 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 self.assertRaises(TypeError, oct, ())
1156
1157 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001158 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001160 self.addCleanup(unlink, TESTFN)
1161 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001162 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001163 fp.write('The quick brown fox jumps over the lazy dog')
1164 fp.write('.\n')
1165 fp.write('Dear John\n')
1166 fp.write('XXX'*100)
1167 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001168
1169 def test_open(self):
1170 self.write_testfile()
1171 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001172 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001173 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001174 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1175 self.assertEqual(fp.readline(4), 'Dear')
1176 self.assertEqual(fp.readline(100), ' John\n')
1177 self.assertEqual(fp.read(300), 'XXX'*100)
1178 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001179
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001180 # embedded null bytes and characters
1181 self.assertRaises(ValueError, open, 'a\x00b')
1182 self.assertRaises(ValueError, open, b'a\x00b')
1183
Victor Stinner91106cd2017-12-13 12:29:09 +01001184 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001185 def test_open_default_encoding(self):
1186 old_environ = dict(os.environ)
1187 try:
1188 # try to get a user preferred encoding different than the current
1189 # locale encoding to check that open() uses the current locale
1190 # encoding and not the user preferred encoding
1191 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1192 if key in os.environ:
1193 del os.environ[key]
1194
1195 self.write_testfile()
1196 current_locale_encoding = locale.getpreferredencoding(False)
1197 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001198 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001199 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001200 finally:
1201 os.environ.clear()
1202 os.environ.update(old_environ)
1203
Victor Stinnerdaf45552013-08-28 00:53:59 +02001204 def test_open_non_inheritable(self):
1205 fileobj = open(__file__)
1206 with fileobj:
1207 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1208
Walter Dörwald919497e2003-01-19 16:23:59 +00001209 def test_ord(self):
1210 self.assertEqual(ord(' '), 32)
1211 self.assertEqual(ord('A'), 65)
1212 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001213 self.assertEqual(ord('\x80'), 128)
1214 self.assertEqual(ord('\xff'), 255)
1215
1216 self.assertEqual(ord(b' '), 32)
1217 self.assertEqual(ord(b'A'), 65)
1218 self.assertEqual(ord(b'a'), 97)
1219 self.assertEqual(ord(b'\x80'), 128)
1220 self.assertEqual(ord(b'\xff'), 255)
1221
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001222 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001223 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001224
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001225 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1226 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1227 self.assertEqual(ord("\U00010000"), 0x00010000)
1228 self.assertEqual(ord("\U00010001"), 0x00010001)
1229 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1230 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1231 self.assertEqual(ord("\U00100000"), 0x00100000)
1232 self.assertEqual(ord("\U00100001"), 0x00100001)
1233 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1234 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1235
Walter Dörwald919497e2003-01-19 16:23:59 +00001236 def test_pow(self):
1237 self.assertEqual(pow(0,0), 1)
1238 self.assertEqual(pow(0,1), 0)
1239 self.assertEqual(pow(1,0), 1)
1240 self.assertEqual(pow(1,1), 1)
1241
1242 self.assertEqual(pow(2,0), 1)
1243 self.assertEqual(pow(2,10), 1024)
1244 self.assertEqual(pow(2,20), 1024*1024)
1245 self.assertEqual(pow(2,30), 1024*1024*1024)
1246
1247 self.assertEqual(pow(-2,0), 1)
1248 self.assertEqual(pow(-2,1), -2)
1249 self.assertEqual(pow(-2,2), 4)
1250 self.assertEqual(pow(-2,3), -8)
1251
Walter Dörwald919497e2003-01-19 16:23:59 +00001252 self.assertAlmostEqual(pow(0.,0), 1.)
1253 self.assertAlmostEqual(pow(0.,1), 0.)
1254 self.assertAlmostEqual(pow(1.,0), 1.)
1255 self.assertAlmostEqual(pow(1.,1), 1.)
1256
1257 self.assertAlmostEqual(pow(2.,0), 1.)
1258 self.assertAlmostEqual(pow(2.,10), 1024.)
1259 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1260 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1261
1262 self.assertAlmostEqual(pow(-2.,0), 1.)
1263 self.assertAlmostEqual(pow(-2.,1), -2.)
1264 self.assertAlmostEqual(pow(-2.,2), 4.)
1265 self.assertAlmostEqual(pow(-2.,3), -8.)
1266
Mark Dickinson5c2db372009-12-05 20:28:34 +00001267 for x in 2, 2.0:
1268 for y in 10, 10.0:
1269 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001270 if isinstance(x, float) or \
1271 isinstance(y, float) or \
1272 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001273 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001274 else:
1275 self.assertAlmostEqual(pow(x, y, z), 24.0)
1276
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001277 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1278 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1279
Mark Dickinsonc5299672019-06-02 10:24:06 +01001280 # See test_pow for additional tests for three-argument pow.
1281 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001282 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001283
1284 self.assertRaises(TypeError, pow)
1285
Ammar Askar87d6cd32019-09-21 00:28:49 -04001286 # Test passing in arguments as keywords.
1287 self.assertEqual(pow(0, exp=0), 1)
1288 self.assertEqual(pow(base=2, exp=4), 16)
1289 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1290 twopow = partial(pow, base=2)
1291 self.assertEqual(twopow(exp=5), 32)
1292 fifth_power = partial(pow, exp=5)
1293 self.assertEqual(fifth_power(2), 32)
1294 mod10 = partial(pow, mod=10)
1295 self.assertEqual(mod10(2, 6), 4)
1296 self.assertEqual(mod10(exp=6, base=2), 4)
1297
Guido van Rossuma88a0332007-02-26 16:59:55 +00001298 def test_input(self):
1299 self.write_testfile()
1300 fp = open(TESTFN, 'r')
1301 savestdin = sys.stdin
1302 savestdout = sys.stdout # Eats the echo
1303 try:
1304 sys.stdin = fp
1305 sys.stdout = BitBucket()
1306 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001307 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1308 self.assertEqual(input('testing\n'), 'Dear John')
1309
1310 # SF 1535165: don't segfault on closed stdin
1311 # sys.stdout must be a regular file for triggering
1312 sys.stdout = savestdout
1313 sys.stdin.close()
1314 self.assertRaises(ValueError, input)
1315
1316 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001317 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001318 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001319 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001320 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001321 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001322 self.assertRaises(EOFError, input)
1323
1324 del sys.stdout
1325 self.assertRaises(RuntimeError, input, 'prompt')
1326 del sys.stdin
1327 self.assertRaises(RuntimeError, input, 'prompt')
1328 finally:
1329 sys.stdin = savestdin
1330 sys.stdout = savestdout
1331 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001332
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001333 # test_int(): see test_int.py for tests of built-in function int().
1334
Walter Dörwald919497e2003-01-19 16:23:59 +00001335 def test_repr(self):
1336 self.assertEqual(repr(''), '\'\'')
1337 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001338 self.assertEqual(repr(()), '()')
1339 self.assertEqual(repr([]), '[]')
1340 self.assertEqual(repr({}), '{}')
1341 a = []
1342 a.append(a)
1343 self.assertEqual(repr(a), '[[...]]')
1344 a = {}
1345 a[0] = a
1346 self.assertEqual(repr(a), '{0: {...}}')
1347
1348 def test_round(self):
1349 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001350 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 self.assertEqual(round(1.0), 1.0)
1352 self.assertEqual(round(10.0), 10.0)
1353 self.assertEqual(round(1000000000.0), 1000000000.0)
1354 self.assertEqual(round(1e20), 1e20)
1355
1356 self.assertEqual(round(-1.0), -1.0)
1357 self.assertEqual(round(-10.0), -10.0)
1358 self.assertEqual(round(-1000000000.0), -1000000000.0)
1359 self.assertEqual(round(-1e20), -1e20)
1360
1361 self.assertEqual(round(0.1), 0.0)
1362 self.assertEqual(round(1.1), 1.0)
1363 self.assertEqual(round(10.1), 10.0)
1364 self.assertEqual(round(1000000000.1), 1000000000.0)
1365
1366 self.assertEqual(round(-1.1), -1.0)
1367 self.assertEqual(round(-10.1), -10.0)
1368 self.assertEqual(round(-1000000000.1), -1000000000.0)
1369
1370 self.assertEqual(round(0.9), 1.0)
1371 self.assertEqual(round(9.9), 10.0)
1372 self.assertEqual(round(999999999.9), 1000000000.0)
1373
1374 self.assertEqual(round(-0.9), -1.0)
1375 self.assertEqual(round(-9.9), -10.0)
1376 self.assertEqual(round(-999999999.9), -1000000000.0)
1377
1378 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001379 self.assertEqual(type(round(-8.0, -1)), float)
1380
1381 self.assertEqual(type(round(-8.0, 0)), float)
1382 self.assertEqual(type(round(-8.0, 1)), float)
1383
1384 # Check even / odd rounding behaviour
1385 self.assertEqual(round(5.5), 6)
1386 self.assertEqual(round(6.5), 6)
1387 self.assertEqual(round(-5.5), -6)
1388 self.assertEqual(round(-6.5), -6)
1389
1390 # Check behavior on ints
1391 self.assertEqual(round(0), 0)
1392 self.assertEqual(round(8), 8)
1393 self.assertEqual(round(-8), -8)
1394 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001395 self.assertEqual(type(round(-8, -1)), int)
1396 self.assertEqual(type(round(-8, 0)), int)
1397 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001398
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001399 # test new kwargs
1400 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1401
Walter Dörwald919497e2003-01-19 16:23:59 +00001402 self.assertRaises(TypeError, round)
1403
Alex Martelliae211f92007-08-22 23:21:33 +00001404 # test generic rounding delegation for reals
1405 class TestRound:
1406 def __round__(self):
1407 return 23
1408
1409 class TestNoRound:
1410 pass
1411
1412 self.assertEqual(round(TestRound()), 23)
1413
1414 self.assertRaises(TypeError, round, 1, 2, 3)
1415 self.assertRaises(TypeError, round, TestNoRound())
1416
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001417 t = TestNoRound()
1418 t.__round__ = lambda *args: args
1419 self.assertRaises(TypeError, round, t)
1420 self.assertRaises(TypeError, round, t, 0)
1421
Mark Dickinsonad731b92009-11-09 17:12:30 +00001422 # Some versions of glibc for alpha have a bug that affects
1423 # float -> integer rounding (floor, ceil, rint, round) for
1424 # values in the range [2**52, 2**53). See:
1425 #
1426 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1427 #
1428 # We skip this test on Linux/alpha if it would fail.
1429 linux_alpha = (platform.system().startswith('Linux') and
1430 platform.machine().startswith('alpha'))
1431 system_round_bug = round(5e15+1) != 5e15+1
1432 @unittest.skipIf(linux_alpha and system_round_bug,
1433 "test will fail; failure is probably due to a "
1434 "buggy system round function")
1435 def test_round_large(self):
1436 # Issue #1869: integral floats should remain unchanged
1437 self.assertEqual(round(5e15-1), 5e15-1)
1438 self.assertEqual(round(5e15), 5e15)
1439 self.assertEqual(round(5e15+1), 5e15+1)
1440 self.assertEqual(round(5e15+2), 5e15+2)
1441 self.assertEqual(round(5e15+3), 5e15+3)
1442
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001443 def test_bug_27936(self):
1444 # Verify that ndigits=None means the same as passing in no argument
1445 for x in [1234,
1446 1234.56,
1447 decimal.Decimal('1234.56'),
1448 fractions.Fraction(123456, 100)]:
1449 self.assertEqual(round(x, None), round(x))
1450 self.assertEqual(type(round(x, None)), type(round(x)))
1451
Walter Dörwald919497e2003-01-19 16:23:59 +00001452 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001453 setattr(sys, 'spam', 1)
1454 self.assertEqual(sys.spam, 1)
1455 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1456 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001457
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001458 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001459
Alex Martellia70b1912003-04-22 08:12:33 +00001460 def test_sum(self):
1461 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001462 self.assertEqual(sum(list(range(2,8))), 27)
1463 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001464 self.assertEqual(sum(Squares(10)), 285)
1465 self.assertEqual(sum(iter(Squares(10))), 285)
1466 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1467
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001468 self.assertEqual(sum(range(10), 1000), 1045)
1469 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001470 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1471 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1472
1473 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1474 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1475 2**31+2)
1476 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1477 2**63+2)
1478 self.assertIs(sum([], False), False)
1479
1480 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1481 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1482 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1483 self.assertEqual(sum([0.5, 1]), 1.5)
1484 self.assertEqual(sum([1, 0.5]), 1.5)
1485 self.assertEqual(repr(sum([-0.0])), '0.0')
1486 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1487 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001488
Alex Martellia70b1912003-04-22 08:12:33 +00001489 self.assertRaises(TypeError, sum)
1490 self.assertRaises(TypeError, sum, 42)
1491 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1492 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001493 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1494 values = [bytearray(b'a'), bytearray(b'b')]
1495 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001496 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1497 self.assertRaises(TypeError, sum, [{2:3}])
1498 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001499 self.assertRaises(TypeError, sum, [], '')
1500 self.assertRaises(TypeError, sum, [], b'')
1501 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001502
1503 class BadSeq:
1504 def __getitem__(self, index):
1505 raise ValueError
1506 self.assertRaises(ValueError, sum, BadSeq())
1507
Mark Dickinson3a22b472009-10-17 21:48:16 +00001508 empty = []
1509 sum(([x] for x in range(10)), empty)
1510 self.assertEqual(empty, [])
1511
Walter Dörwald919497e2003-01-19 16:23:59 +00001512 def test_type(self):
1513 self.assertEqual(type(''), type('123'))
1514 self.assertNotEqual(type(''), type(()))
1515
Guido van Rossumfee7b932005-01-16 00:21:28 +00001516 # We don't want self in vars(), so these are static methods
1517
1518 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001519 def get_vars_f0():
1520 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001521
Guido van Rossumfee7b932005-01-16 00:21:28 +00001522 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001523 def get_vars_f2():
1524 BuiltinTest.get_vars_f0()
1525 a = 1
1526 b = 2
1527 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001528
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001529 class C_get_vars(object):
1530 def getDict(self):
1531 return {'a':2}
1532 __dict__ = property(fget=getDict)
1533
Walter Dörwald919497e2003-01-19 16:23:59 +00001534 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001535 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001536 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001537 self.assertEqual(self.get_vars_f0(), {})
1538 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1539 self.assertRaises(TypeError, vars, 42, 42)
1540 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001541 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001542
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001543 def iter_error(self, iterable, error):
1544 """Collect `iterable` into a list, catching an expected `error`."""
1545 items = []
1546 with self.assertRaises(error):
1547 for item in iterable:
1548 items.append(item)
1549 return items
1550
Walter Dörwald919497e2003-01-19 16:23:59 +00001551 def test_zip(self):
1552 a = (1, 2, 3)
1553 b = (4, 5, 6)
1554 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001555 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001556 b = [4, 5, 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, 7)
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 class I:
1561 def __getitem__(self, i):
1562 if i < 0 or i > 2: raise IndexError
1563 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001564 self.assertEqual(list(zip(a, I())), t)
1565 self.assertEqual(list(zip()), [])
1566 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001567 self.assertRaises(TypeError, zip, None)
1568 class G:
1569 pass
1570 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001571 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001572
1573 # Make sure zip doesn't try to allocate a billion elements for the
1574 # result list when one of its arguments doesn't say how long it is.
1575 # A MemoryError is the most likely failure mode.
1576 class SequenceWithoutALength:
1577 def __getitem__(self, i):
1578 if i == 5:
1579 raise IndexError
1580 else:
1581 return i
1582 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001583 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001584 list(enumerate(range(5)))
1585 )
1586
1587 class BadSeq:
1588 def __getitem__(self, i):
1589 if i == 5:
1590 raise ValueError
1591 else:
1592 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001593 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001594
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001595 def test_zip_pickle(self):
1596 a = (1, 2, 3)
1597 b = (4, 5, 6)
1598 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001599 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1600 z1 = zip(a, b)
1601 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001602
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001603 def test_zip_pickle_strict(self):
1604 a = (1, 2, 3)
1605 b = (4, 5, 6)
1606 t = [(1, 4), (2, 5), (3, 6)]
1607 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1608 z1 = zip(a, b, strict=True)
1609 self.check_iter_pickle(z1, t, proto)
1610
1611 def test_zip_pickle_strict_fail(self):
1612 a = (1, 2, 3)
1613 b = (4, 5, 6, 7)
1614 t = [(1, 4), (2, 5), (3, 6)]
1615 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1616 z1 = zip(a, b, strict=True)
1617 z2 = pickle.loads(pickle.dumps(z1, proto))
1618 self.assertEqual(self.iter_error(z1, ValueError), t)
1619 self.assertEqual(self.iter_error(z2, ValueError), t)
1620
1621 def test_zip_pickle_stability(self):
1622 # Pickles of zip((1, 2, 3), (4, 5, 6)) dumped from 3.9:
1623 pickles = [
1624 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.',
1625 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.',
1626 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.',
1627 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.',
1628 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.',
1629 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.',
1630 ]
1631 for protocol, dump in enumerate(pickles):
1632 z1 = zip((1, 2, 3), (4, 5, 6))
1633 z2 = zip((1, 2, 3), (4, 5, 6), strict=False)
1634 z3 = pickle.loads(dump)
1635 l3 = list(z3)
1636 self.assertEqual(type(z3), zip)
1637 self.assertEqual(pickle.dumps(z1, protocol), dump)
1638 self.assertEqual(pickle.dumps(z2, protocol), dump)
1639 self.assertEqual(list(z1), l3)
1640 self.assertEqual(list(z2), l3)
1641
1642 def test_zip_pickle_strict_stability(self):
1643 # Pickles of zip((1, 2, 3), (4, 5), strict=True) dumped from 3.10:
1644 pickles = [
1645 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.',
1646 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.',
1647 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.',
1648 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.',
1649 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.',
1650 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.',
1651 ]
1652 a = (1, 2, 3)
1653 b = (4, 5)
1654 t = [(1, 4), (2, 5)]
1655 for protocol, dump in enumerate(pickles):
1656 z1 = zip(a, b, strict=True)
1657 z2 = pickle.loads(dump)
1658 self.assertEqual(pickle.dumps(z1, protocol), dump)
1659 self.assertEqual(type(z2), zip)
1660 self.assertEqual(self.iter_error(z1, ValueError), t)
1661 self.assertEqual(self.iter_error(z2, ValueError), t)
1662
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001663 def test_zip_bad_iterable(self):
1664 exception = TypeError()
1665
1666 class BadIterable:
1667 def __iter__(self):
1668 raise exception
1669
1670 with self.assertRaises(TypeError) as cm:
1671 zip(BadIterable())
1672
1673 self.assertIs(cm.exception, exception)
1674
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001675 def test_zip_strict(self):
1676 self.assertEqual(tuple(zip((1, 2, 3), 'abc', strict=True)),
1677 ((1, 'a'), (2, 'b'), (3, 'c')))
1678 self.assertRaises(ValueError, tuple,
1679 zip((1, 2, 3, 4), 'abc', strict=True))
1680 self.assertRaises(ValueError, tuple,
1681 zip((1, 2), 'abc', strict=True))
1682 self.assertRaises(ValueError, tuple,
1683 zip((1, 2), (1, 2), 'abc', strict=True))
1684
1685 def test_zip_strict_iterators(self):
1686 x = iter(range(5))
1687 y = [0]
1688 z = iter(range(5))
1689 self.assertRaises(ValueError, list,
1690 (zip(x, y, z, strict=True)))
1691 self.assertEqual(next(x), 2)
1692 self.assertEqual(next(z), 1)
1693
1694 def test_zip_strict_error_handling(self):
1695
1696 class Error(Exception):
1697 pass
1698
1699 class Iter:
1700 def __init__(self, size):
1701 self.size = size
1702 def __iter__(self):
1703 return self
1704 def __next__(self):
1705 self.size -= 1
1706 if self.size < 0:
1707 raise Error
1708 return self.size
1709
1710 l1 = self.iter_error(zip("AB", Iter(1), strict=True), Error)
1711 self.assertEqual(l1, [("A", 0)])
1712 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1713 self.assertEqual(l2, [("A", 1, "A")])
1714 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), Error)
1715 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1716 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1717 self.assertEqual(l4, [("A", 2), ("B", 1)])
1718 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), Error)
1719 self.assertEqual(l5, [(0, "A")])
1720 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1721 self.assertEqual(l6, [(1, "A")])
1722 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), Error)
1723 self.assertEqual(l7, [(1, "A"), (0, "B")])
1724 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1725 self.assertEqual(l8, [(2, "A"), (1, "B")])
1726
1727 def test_zip_strict_error_handling_stopiteration(self):
1728
1729 class Iter:
1730 def __init__(self, size):
1731 self.size = size
1732 def __iter__(self):
1733 return self
1734 def __next__(self):
1735 self.size -= 1
1736 if self.size < 0:
1737 raise StopIteration
1738 return self.size
1739
1740 l1 = self.iter_error(zip("AB", Iter(1), strict=True), ValueError)
1741 self.assertEqual(l1, [("A", 0)])
1742 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1743 self.assertEqual(l2, [("A", 1, "A")])
1744 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), ValueError)
1745 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1746 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1747 self.assertEqual(l4, [("A", 2), ("B", 1)])
1748 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), ValueError)
1749 self.assertEqual(l5, [(0, "A")])
1750 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1751 self.assertEqual(l6, [(1, "A")])
1752 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), ValueError)
1753 self.assertEqual(l7, [(1, "A"), (0, "B")])
1754 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1755 self.assertEqual(l8, [(2, "A"), (1, "B")])
1756
Eric Smithe4d63172010-09-13 20:48:43 +00001757 def test_format(self):
1758 # Test the basic machinery of the format() builtin. Don't test
1759 # the specifics of the various formatters
1760 self.assertEqual(format(3, ''), '3')
1761
1762 # Returns some classes to use for various tests. There's
1763 # an old-style version, and a new-style version
1764 def classes_new():
1765 class A(object):
1766 def __init__(self, x):
1767 self.x = x
1768 def __format__(self, format_spec):
1769 return str(self.x) + format_spec
1770 class DerivedFromA(A):
1771 pass
1772
1773 class Simple(object): pass
1774 class DerivedFromSimple(Simple):
1775 def __init__(self, x):
1776 self.x = x
1777 def __format__(self, format_spec):
1778 return str(self.x) + format_spec
1779 class DerivedFromSimple2(DerivedFromSimple): pass
1780 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1781
1782 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1783 self.assertEqual(format(A(3), 'spec'), '3spec')
1784 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1785 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1786 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1787 '10abcdef')
1788
1789 class_test(*classes_new())
1790
1791 def empty_format_spec(value):
1792 # test that:
1793 # format(x, '') == str(x)
1794 # format(x) == str(x)
1795 self.assertEqual(format(value, ""), str(value))
1796 self.assertEqual(format(value), str(value))
1797
1798 # for builtin types, format(x, "") == str(x)
1799 empty_format_spec(17**13)
1800 empty_format_spec(1.0)
1801 empty_format_spec(3.1415e104)
1802 empty_format_spec(-3.1415e104)
1803 empty_format_spec(3.1415e-104)
1804 empty_format_spec(-3.1415e-104)
1805 empty_format_spec(object)
1806 empty_format_spec(None)
1807
1808 # TypeError because self.__format__ returns the wrong type
1809 class BadFormatResult:
1810 def __format__(self, format_spec):
1811 return 1.0
1812 self.assertRaises(TypeError, format, BadFormatResult(), "")
1813
1814 # TypeError because format_spec is not unicode or str
1815 self.assertRaises(TypeError, format, object(), 4)
1816 self.assertRaises(TypeError, format, object(), object())
1817
1818 # tests for object.__format__ really belong elsewhere, but
1819 # there's no good place to put them
1820 x = object().__format__('')
1821 self.assertTrue(x.startswith('<object object at'))
1822
1823 # first argument to object.__format__ must be string
1824 self.assertRaises(TypeError, object().__format__, 3)
1825 self.assertRaises(TypeError, object().__format__, object())
1826 self.assertRaises(TypeError, object().__format__, None)
1827
1828 # --------------------------------------------------------------------
1829 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001830 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001831 class A:
1832 def __format__(self, fmt_str):
1833 return format('', fmt_str)
1834
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001835 self.assertEqual(format(A()), '')
1836 self.assertEqual(format(A(), ''), '')
1837 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001838
1839 class B:
1840 pass
1841
1842 class C(object):
1843 pass
1844
1845 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001846 obj = cls()
1847 self.assertEqual(format(obj), str(obj))
1848 self.assertEqual(format(obj, ''), str(obj))
1849 with self.assertRaisesRegex(TypeError,
1850 r'\b%s\b' % re.escape(cls.__name__)):
1851 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001852 # --------------------------------------------------------------------
1853
1854 # make sure we can take a subclass of str as a format spec
1855 class DerivedFromStr(str): pass
1856 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1857
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001858 def test_bin(self):
1859 self.assertEqual(bin(0), '0b0')
1860 self.assertEqual(bin(1), '0b1')
1861 self.assertEqual(bin(-1), '-0b1')
1862 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1863 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1864 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1865 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1866
Georg Brandl953152f2009-07-22 12:03:59 +00001867 def test_bytearray_translate(self):
1868 x = bytearray(b"abc")
1869 self.assertRaises(ValueError, x.translate, b"1", 1)
1870 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1871
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001872 def test_bytearray_extend_error(self):
1873 array = bytearray()
1874 bad_iter = map(int, "X")
1875 self.assertRaises(ValueError, array.extend, bad_iter)
1876
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001877 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001878 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001879 tp = type(const)
1880 self.assertIs(tp(), const)
1881 self.assertRaises(TypeError, tp, 1, 2)
1882 self.assertRaises(TypeError, tp, a=1, b=2)
1883
MojoVampire469325c2020-03-03 18:50:17 +00001884 def test_warning_notimplemented(self):
1885 # Issue #35712: NotImplemented is a sentinel value that should never
1886 # be evaluated in a boolean context (virtually all such use cases
1887 # are a result of accidental misuse implementing rich comparison
1888 # operations in terms of one another).
1889 # For the time being, it will continue to evaluate as truthy, but
1890 # issue a deprecation warning (with the eventual intent to make it
1891 # a TypeError).
1892 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1893 with self.assertWarns(DeprecationWarning):
1894 self.assertTrue(NotImplemented)
1895 with self.assertWarns(DeprecationWarning):
1896 self.assertFalse(not NotImplemented)
1897
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001898
1899class TestBreakpoint(unittest.TestCase):
1900 def setUp(self):
1901 # These tests require a clean slate environment. For example, if the
1902 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1903 # will mess up these tests. Similarly for sys.breakpointhook.
1904 # Cleaning the slate here means you can't use breakpoint() to debug
1905 # these tests, but I think that's okay. Just use pdb.set_trace() if
1906 # you must.
1907 self.resources = ExitStack()
1908 self.addCleanup(self.resources.close)
1909 self.env = self.resources.enter_context(EnvironmentVarGuard())
1910 del self.env['PYTHONBREAKPOINT']
1911 self.resources.enter_context(
1912 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1913
1914 def test_breakpoint(self):
1915 with patch('pdb.set_trace') as mock:
1916 breakpoint()
1917 mock.assert_called_once()
1918
1919 def test_breakpoint_with_breakpointhook_set(self):
1920 my_breakpointhook = MagicMock()
1921 sys.breakpointhook = my_breakpointhook
1922 breakpoint()
1923 my_breakpointhook.assert_called_once_with()
1924
1925 def test_breakpoint_with_breakpointhook_reset(self):
1926 my_breakpointhook = MagicMock()
1927 sys.breakpointhook = my_breakpointhook
1928 breakpoint()
1929 my_breakpointhook.assert_called_once_with()
1930 # Reset the hook and it will not be called again.
1931 sys.breakpointhook = sys.__breakpointhook__
1932 with patch('pdb.set_trace') as mock:
1933 breakpoint()
1934 mock.assert_called_once_with()
1935 my_breakpointhook.assert_called_once_with()
1936
1937 def test_breakpoint_with_args_and_keywords(self):
1938 my_breakpointhook = MagicMock()
1939 sys.breakpointhook = my_breakpointhook
1940 breakpoint(1, 2, 3, four=4, five=5)
1941 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1942
1943 def test_breakpoint_with_passthru_error(self):
1944 def my_breakpointhook():
1945 pass
1946 sys.breakpointhook = my_breakpointhook
1947 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1948
1949 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1950 def test_envar_good_path_builtin(self):
1951 self.env['PYTHONBREAKPOINT'] = 'int'
1952 with patch('builtins.int') as mock:
1953 breakpoint('7')
1954 mock.assert_called_once_with('7')
1955
1956 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1957 def test_envar_good_path_other(self):
1958 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1959 with patch('sys.exit') as mock:
1960 breakpoint()
1961 mock.assert_called_once_with()
1962
1963 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1964 def test_envar_good_path_noop_0(self):
1965 self.env['PYTHONBREAKPOINT'] = '0'
1966 with patch('pdb.set_trace') as mock:
1967 breakpoint()
1968 mock.assert_not_called()
1969
1970 def test_envar_good_path_empty_string(self):
1971 # PYTHONBREAKPOINT='' is the same as it not being set.
1972 self.env['PYTHONBREAKPOINT'] = ''
1973 with patch('pdb.set_trace') as mock:
1974 breakpoint()
1975 mock.assert_called_once_with()
1976
1977 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1978 def test_envar_unimportable(self):
1979 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001980 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001981 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001982 'nosuchbuiltin',
1983 'nosuchmodule.nosuchcallable',
1984 ):
1985 with self.subTest(envar=envar):
1986 self.env['PYTHONBREAKPOINT'] = envar
1987 mock = self.resources.enter_context(patch('pdb.set_trace'))
1988 w = self.resources.enter_context(check_warnings(quiet=True))
1989 breakpoint()
1990 self.assertEqual(
1991 str(w.message),
1992 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1993 self.assertEqual(w.category, RuntimeWarning)
1994 mock.assert_not_called()
1995
1996 def test_envar_ignored_when_hook_is_set(self):
1997 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1998 with patch('sys.exit') as mock:
1999 sys.breakpointhook = int
2000 breakpoint()
2001 mock.assert_not_called()
2002
2003
Martin Panterc9a6ab52015-10-10 01:25:38 +00002004@unittest.skipUnless(pty, "the pty and signal modules must be available")
2005class PtyTests(unittest.TestCase):
2006 """Tests that use a pseudo terminal to guarantee stdin and stdout are
2007 terminals in the test environment"""
2008
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002009 @staticmethod
2010 def handle_sighup(signum, frame):
2011 # bpo-40140: if the process is the session leader, os.close(fd)
2012 # of "pid, fd = pty.fork()" can raise SIGHUP signal:
2013 # just ignore the signal.
2014 pass
2015
Martin Pantere44dba32015-10-10 05:27:15 +00002016 def run_child(self, child, terminal_input):
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002017 old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
2018 try:
2019 return self._run_child(child, terminal_input)
2020 finally:
2021 signal.signal(signal.SIGHUP, old_sighup)
2022
2023 def _run_child(self, child, terminal_input):
Martin Pantere44dba32015-10-10 05:27:15 +00002024 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00002025 try:
Martin Pantere44dba32015-10-10 05:27:15 +00002026 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00002027 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00002028 os.close(r)
2029 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002030 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00002031 raise
Victor Stinner16d75672020-04-01 00:27:18 +02002032
Martin Panterc9a6ab52015-10-10 01:25:38 +00002033 if pid == 0:
2034 # Child
2035 try:
2036 # Make sure we don't get stuck if there's a problem
2037 signal.alarm(2)
2038 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002039 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00002040 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002041 except:
2042 traceback.print_exc()
2043 finally:
2044 # We don't want to return to unittest...
2045 os._exit(0)
Victor Stinner16d75672020-04-01 00:27:18 +02002046
Martin Panterc9a6ab52015-10-10 01:25:38 +00002047 # Parent
2048 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002049 os.write(fd, terminal_input)
Victor Stinner16d75672020-04-01 00:27:18 +02002050
Martin Panterc9a6ab52015-10-10 01:25:38 +00002051 # Get results from the pipe
2052 with open(r, "r") as rpipe:
2053 lines = []
2054 while True:
2055 line = rpipe.readline().strip()
2056 if line == "":
2057 # The other end was closed => the child exited
2058 break
2059 lines.append(line)
Victor Stinner16d75672020-04-01 00:27:18 +02002060
Martin Panterc9a6ab52015-10-10 01:25:38 +00002061 # Check the result was got and corresponds to the user's terminal input
2062 if len(lines) != 2:
2063 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00002064 # Beware of Linux raising EIO when the slave is closed
2065 child_output = bytearray()
2066 while True:
2067 try:
2068 chunk = os.read(fd, 3000)
2069 except OSError: # Assume EIO
2070 break
2071 if not chunk:
2072 break
2073 child_output.extend(chunk)
2074 os.close(fd)
2075 child_output = child_output.decode("ascii", "ignore")
2076 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
2077 % (len(lines), child_output))
Victor Stinner4baca1b2017-08-09 17:44:19 +02002078
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002079 # bpo-40155: Close the PTY before waiting for the child process
2080 # completion, otherwise the child process hangs on AIX.
Victor Stinner16d75672020-04-01 00:27:18 +02002081 os.close(fd)
2082
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002083 support.wait_process(pid, exitcode=0)
2084
Martin Pantere44dba32015-10-10 05:27:15 +00002085 return lines
2086
2087 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
2088 if not sys.stdin.isatty() or not sys.stdout.isatty():
2089 self.skipTest("stdin and stdout must be ttys")
2090 def child(wpipe):
2091 # Check the error handlers are accounted for
2092 if stdio_encoding:
2093 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
2094 encoding=stdio_encoding,
2095 errors='surrogateescape')
2096 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
2097 encoding=stdio_encoding,
2098 errors='replace')
2099 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
2100 print(ascii(input(prompt)), file=wpipe)
2101 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00002102 # Check we did exercise the GNU readline path
2103 self.assertIn(lines[0], {'tty = True', 'tty = False'})
2104 if lines[0] != 'tty = True':
2105 self.skipTest("standard IO in should have been a tty")
2106 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
2107 if stdio_encoding:
2108 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
2109 else:
2110 expected = terminal_input.decode(sys.stdin.encoding) # what else?
2111 self.assertEqual(input_result, expected)
2112
2113 def test_input_tty(self):
2114 # Test input() functionality when wired to a tty (the code path
2115 # is different and invokes GNU readline if available).
2116 self.check_input_tty("prompt", b"quux")
2117
2118 def test_input_tty_non_ascii(self):
2119 # Check stdin/stdout encoding is used when invoking GNU readline
2120 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
2121
2122 def test_input_tty_non_ascii_unicode_errors(self):
2123 # Check stdin/stdout error handler is used when invoking GNU readline
2124 self.check_input_tty("prompté", b"quux\xe9", "ascii")
2125
2126 def test_input_no_stdout_fileno(self):
2127 # Issue #24402: If stdin is the original terminal but stdout.fileno()
2128 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00002129 def child(wpipe):
2130 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
2131 sys.stdout = io.StringIO() # Does not support fileno()
2132 input("prompt")
2133 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
2134 lines = self.run_child(child, b"quux\r")
2135 expected = (
2136 "stdin.isatty(): True",
2137 "captured: 'prompt'",
2138 )
2139 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002140
Raymond Hettinger64958a12003-12-17 20:43:33 +00002141class TestSorted(unittest.TestCase):
2142
2143 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002144 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002145 copy = data[:]
2146 random.shuffle(copy)
2147 self.assertEqual(data, sorted(copy))
2148 self.assertNotEqual(data, copy)
2149
2150 data.reverse()
2151 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00002152 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2153 self.assertNotEqual(data, copy)
2154 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03002155 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002156 self.assertNotEqual(data, copy)
2157
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02002158 def test_bad_arguments(self):
2159 # Issue #29327: The first argument is positional-only.
2160 sorted([])
2161 with self.assertRaises(TypeError):
2162 sorted(iterable=[])
2163 # Other arguments are keyword-only
2164 sorted([], key=None)
2165 with self.assertRaises(TypeError):
2166 sorted([], None)
2167
Raymond Hettinger64958a12003-12-17 20:43:33 +00002168 def test_inputtypes(self):
2169 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002170 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002171 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002172 self.assertEqual(sorted(s), sorted(T(s)))
2173
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002174 s = ''.join(set(s)) # unique letters only
2175 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002176 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002177 self.assertEqual(sorted(s), sorted(T(s)))
2178
2179 def test_baddecorator(self):
2180 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2181 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2182
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002183
2184class ShutdownTest(unittest.TestCase):
2185
2186 def test_cleanup(self):
2187 # Issue #19255: builtins are still available at shutdown
2188 code = """if 1:
2189 import builtins
2190 import sys
2191
2192 class C:
2193 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002194 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002195 # Check that builtins still exist
2196 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002197 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002198
2199 c = C()
2200 # Make this module survive until builtins and sys are cleaned
2201 builtins.here = sys.modules[__name__]
2202 sys.here = sys.modules[__name__]
2203 # Create a reference loop so that this module needs to go
2204 # through a GC phase.
2205 here = sys.modules[__name__]
2206 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002207 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2208 # otherwise the codec may be unloaded before C.__del__() is called, and
2209 # so print("before") fails because the codec cannot be used to encode
2210 # "before" to sys.stdout.encoding. For example, on Windows,
2211 # sys.stdout.encoding is the OEM code page and these code pages are
2212 # implemented in Python
2213 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002214 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002215 self.assertEqual(["before", "after"], out.decode().splitlines())
2216
2217
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002218class TestType(unittest.TestCase):
2219 def test_new_type(self):
2220 A = type('A', (), {})
2221 self.assertEqual(A.__name__, 'A')
2222 self.assertEqual(A.__qualname__, 'A')
2223 self.assertEqual(A.__module__, __name__)
2224 self.assertEqual(A.__bases__, (object,))
2225 self.assertIs(A.__base__, object)
2226 x = A()
2227 self.assertIs(type(x), A)
2228 self.assertIs(x.__class__, A)
2229
2230 class B:
2231 def ham(self):
2232 return 'ham%d' % self
2233 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2234 self.assertEqual(C.__name__, 'C')
2235 self.assertEqual(C.__qualname__, 'C')
2236 self.assertEqual(C.__module__, __name__)
2237 self.assertEqual(C.__bases__, (B, int))
2238 self.assertIs(C.__base__, int)
2239 self.assertIn('spam', C.__dict__)
2240 self.assertNotIn('ham', C.__dict__)
2241 x = C(42)
2242 self.assertEqual(x, 42)
2243 self.assertIs(type(x), C)
2244 self.assertIs(x.__class__, C)
2245 self.assertEqual(x.ham(), 'ham42')
2246 self.assertEqual(x.spam(), 'spam42')
2247 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2248
Nick Coghland78448e2016-07-30 16:26:03 +10002249 def test_type_nokwargs(self):
2250 with self.assertRaises(TypeError):
2251 type('a', (), {}, x=5)
2252 with self.assertRaises(TypeError):
2253 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002254
2255 def test_type_name(self):
2256 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2257 with self.subTest(name=name):
2258 A = type(name, (), {})
2259 self.assertEqual(A.__name__, name)
2260 self.assertEqual(A.__qualname__, name)
2261 self.assertEqual(A.__module__, __name__)
2262 with self.assertRaises(ValueError):
2263 type('A\x00B', (), {})
2264 with self.assertRaises(ValueError):
2265 type('A\udcdcB', (), {})
2266 with self.assertRaises(TypeError):
2267 type(b'A', (), {})
2268
2269 C = type('C', (), {})
2270 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2271 with self.subTest(name=name):
2272 C.__name__ = name
2273 self.assertEqual(C.__name__, name)
2274 self.assertEqual(C.__qualname__, 'C')
2275 self.assertEqual(C.__module__, __name__)
2276
2277 A = type('C', (), {})
2278 with self.assertRaises(ValueError):
2279 A.__name__ = 'A\x00B'
2280 self.assertEqual(A.__name__, 'C')
2281 with self.assertRaises(ValueError):
2282 A.__name__ = 'A\udcdcB'
2283 self.assertEqual(A.__name__, 'C')
2284 with self.assertRaises(TypeError):
2285 A.__name__ = b'A'
2286 self.assertEqual(A.__name__, 'C')
2287
2288 def test_type_qualname(self):
2289 A = type('A', (), {'__qualname__': 'B.C'})
2290 self.assertEqual(A.__name__, 'A')
2291 self.assertEqual(A.__qualname__, 'B.C')
2292 self.assertEqual(A.__module__, __name__)
2293 with self.assertRaises(TypeError):
2294 type('A', (), {'__qualname__': b'B'})
2295 self.assertEqual(A.__qualname__, 'B.C')
2296
2297 A.__qualname__ = 'D.E'
2298 self.assertEqual(A.__name__, 'A')
2299 self.assertEqual(A.__qualname__, 'D.E')
2300 with self.assertRaises(TypeError):
2301 A.__qualname__ = b'B'
2302 self.assertEqual(A.__qualname__, 'D.E')
2303
2304 def test_type_doc(self):
2305 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2306 A = type('A', (), {'__doc__': doc})
2307 self.assertEqual(A.__doc__, doc)
2308 with self.assertRaises(UnicodeEncodeError):
2309 type('A', (), {'__doc__': 'x\udcdcy'})
2310
2311 A = type('A', (), {})
2312 self.assertEqual(A.__doc__, None)
2313 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2314 A.__doc__ = doc
2315 self.assertEqual(A.__doc__, doc)
2316
2317 def test_bad_args(self):
2318 with self.assertRaises(TypeError):
2319 type()
2320 with self.assertRaises(TypeError):
2321 type('A', ())
2322 with self.assertRaises(TypeError):
2323 type('A', (), {}, ())
2324 with self.assertRaises(TypeError):
2325 type('A', (), dict={})
2326 with self.assertRaises(TypeError):
2327 type('A', [], {})
2328 with self.assertRaises(TypeError):
2329 type('A', (), types.MappingProxyType({}))
2330 with self.assertRaises(TypeError):
2331 type('A', (None,), {})
2332 with self.assertRaises(TypeError):
2333 type('A', (bool,), {})
2334 with self.assertRaises(TypeError):
2335 type('A', (int, str), {})
2336
2337 def test_bad_slots(self):
2338 with self.assertRaises(TypeError):
2339 type('A', (), {'__slots__': b'x'})
2340 with self.assertRaises(TypeError):
2341 type('A', (int,), {'__slots__': 'x'})
2342 with self.assertRaises(TypeError):
2343 type('A', (), {'__slots__': ''})
2344 with self.assertRaises(TypeError):
2345 type('A', (), {'__slots__': '42'})
2346 with self.assertRaises(TypeError):
2347 type('A', (), {'__slots__': 'x\x00y'})
2348 with self.assertRaises(ValueError):
2349 type('A', (), {'__slots__': 'x', 'x': 0})
2350 with self.assertRaises(TypeError):
2351 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2352 with self.assertRaises(TypeError):
2353 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2354
2355 class B:
2356 pass
2357 with self.assertRaises(TypeError):
2358 type('A', (B,), {'__slots__': '__dict__'})
2359 with self.assertRaises(TypeError):
2360 type('A', (B,), {'__slots__': '__weakref__'})
2361
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002362 def test_namespace_order(self):
2363 # bpo-34320: namespace should preserve order
2364 od = collections.OrderedDict([('a', 1), ('b', 2)])
2365 od.move_to_end('a')
2366 expected = list(od.items())
2367
2368 C = type('C', (), od)
2369 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2370
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002371
Zachary Warea4b7a752013-11-24 01:19:09 -06002372def load_tests(loader, tests, pattern):
2373 from doctest import DocTestSuite
2374 tests.addTest(DocTestSuite(builtins))
2375 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002376
2377if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002378 unittest.main()