blob: d6b9ee1a95a7870fa7709f7976a3589fd34d6828 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004import asyncio
Victor Stinnerf86a5e82012-06-05 13:43:22 +02005import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00006import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07007import decimal
8import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00009import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010011import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020013import platform
14import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020015import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020016import sys
17import traceback
18import types
19import unittest
20import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040021from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040022from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070023from inspect import CO_COROUTINE
24from itertools import product
25from textwrap import dedent
26from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020027from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040028from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070029 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
30 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030031from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040032from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010033try:
Antoine Pitrou772add72011-11-06 02:37:42 +010034 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010035except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010036 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000037
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Walter Dörwald919497e2003-01-19 16:23:59 +000039class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000040
Walter Dörwald919497e2003-01-19 16:23:59 +000041 def __init__(self, max):
42 self.max = max
43 self.sofar = []
44
45 def __len__(self): return len(self.sofar)
46
47 def __getitem__(self, i):
48 if not 0 <= i < self.max: raise IndexError
49 n = len(self.sofar)
50 while n <= i:
51 self.sofar.append(n*n)
52 n += 1
53 return self.sofar[i]
54
55class StrSquares:
56
57 def __init__(self, max):
58 self.max = max
59 self.sofar = []
60
61 def __len__(self):
62 return len(self.sofar)
63
64 def __getitem__(self, i):
65 if not 0 <= i < self.max:
66 raise IndexError
67 n = len(self.sofar)
68 while n <= i:
69 self.sofar.append(str(n*n))
70 n += 1
71 return self.sofar[i]
72
73class BitBucket:
74 def write(self, line):
75 pass
76
Facundo Batista2336bdd2008-01-19 19:12:01 +000077test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000078 ('0', 0),
79 ('1', 1),
80 ('9', 9),
81 ('10', 10),
82 ('99', 99),
83 ('100', 100),
84 ('314', 314),
85 (' 314', 314),
86 ('314 ', 314),
87 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000088 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000089 (' 1x', ValueError),
90 (' 1 ', 1),
91 (' 1\02 ', ValueError),
92 ('', ValueError),
93 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000094 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040095 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000096 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000097]
98
Facundo Batista2336bdd2008-01-19 19:12:01 +000099test_conv_sign = [
100 ('0', 0),
101 ('1', 1),
102 ('9', 9),
103 ('10', 10),
104 ('99', 99),
105 ('100', 100),
106 ('314', 314),
107 (' 314', ValueError),
108 ('314 ', 314),
109 (' \t\t 314 \t\t ', ValueError),
110 (repr(sys.maxsize), sys.maxsize),
111 (' 1x', ValueError),
112 (' 1 ', ValueError),
113 (' 1\02 ', ValueError),
114 ('', ValueError),
115 (' ', ValueError),
116 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400117 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000118 (chr(0x200), ValueError),
119]
120
Raymond Hettinger96229b12005-03-11 06:49:40 +0000121class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000122 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123 raise RuntimeError
124
125class TestFailingIter:
126 def __iter__(self):
127 raise RuntimeError
128
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000129def filter_char(arg):
130 return ord(arg) > ord("d")
131
132def map_char(arg):
133 return chr(ord(arg)+1)
134
Walter Dörwald919497e2003-01-19 16:23:59 +0000135class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000136 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200137 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000138 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200139 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000140 it = pickle.loads(d)
141 self.assertEqual(type(itorg), type(it))
142 self.assertEqual(list(it), seq)
143
144 #test the iterator after dropping one from it
145 it = pickle.loads(d)
146 try:
147 next(it)
148 except StopIteration:
149 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200150 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000151 it = pickle.loads(d)
152 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000153
154 def test_import(self):
155 __import__('sys')
156 __import__('time')
157 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000158 __import__(name='sys')
159 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 self.assertRaises(ImportError, __import__, 'spamspam')
161 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000162 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000163 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000164 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100165 with self.assertWarns(ImportWarning):
166 self.assertRaises(ImportError, __import__, '',
167 {'__package__': None, '__spec__': None, '__name__': '__main__'},
168 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300169 # embedded null character
170 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000171
172 def test_abs(self):
173 # int
174 self.assertEqual(abs(0), 0)
175 self.assertEqual(abs(1234), 1234)
176 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000177 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000178 # float
179 self.assertEqual(abs(0.0), 0.0)
180 self.assertEqual(abs(3.14), 3.14)
181 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 # str
183 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000184 # bool
185 self.assertEqual(abs(True), 1)
186 self.assertEqual(abs(False), 0)
187 # other
188 self.assertRaises(TypeError, abs)
189 self.assertRaises(TypeError, abs, None)
190 class AbsClass(object):
191 def __abs__(self):
192 return -5
193 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000194
Raymond Hettinger96229b12005-03-11 06:49:40 +0000195 def test_all(self):
196 self.assertEqual(all([2, 4, 6]), True)
197 self.assertEqual(all([2, None, 6]), False)
198 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
199 self.assertRaises(RuntimeError, all, TestFailingIter())
200 self.assertRaises(TypeError, all, 10) # Non-iterable
201 self.assertRaises(TypeError, all) # No args
202 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
203 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200204 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000205 S = [50, 60]
206 self.assertEqual(all(x > 42 for x in S), True)
207 S = [50, 40, 60]
208 self.assertEqual(all(x > 42 for x in S), False)
209
210 def test_any(self):
211 self.assertEqual(any([None, None, None]), False)
212 self.assertEqual(any([None, 4, None]), True)
213 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500214 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000215 self.assertRaises(TypeError, any, 10) # Non-iterable
216 self.assertRaises(TypeError, any) # No args
217 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
218 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200219 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000220 S = [40, 60, 30]
221 self.assertEqual(any(x > 42 for x in S), True)
222 S = [10, 20, 30]
223 self.assertEqual(any(x > 42 for x in S), False)
224
Georg Brandl559e5d72008-06-11 18:37:52 +0000225 def test_ascii(self):
226 self.assertEqual(ascii(''), '\'\'')
227 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000228 self.assertEqual(ascii(()), '()')
229 self.assertEqual(ascii([]), '[]')
230 self.assertEqual(ascii({}), '{}')
231 a = []
232 a.append(a)
233 self.assertEqual(ascii(a), '[[...]]')
234 a = {}
235 a[0] = a
236 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000237 # Advanced checks for unicode strings
238 def _check_uni(s):
239 self.assertEqual(ascii(s), repr(s))
240 _check_uni("'")
241 _check_uni('"')
242 _check_uni('"\'')
243 _check_uni('\0')
244 _check_uni('\r\n\t .')
245 # Unprintable non-ASCII characters
246 _check_uni('\x85')
247 _check_uni('\u1fff')
248 _check_uni('\U00012fff')
249 # Lone surrogates
250 _check_uni('\ud800')
251 _check_uni('\udfff')
252 # Issue #9804: surrogates should be joined even for printable
253 # wide characters (UCS-2 builds).
254 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
255 # All together
256 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
257 self.assertEqual(ascii(s),
258 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000259
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000261 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000262 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000263 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000264
Walter Dörwald919497e2003-01-19 16:23:59 +0000265 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000266 self.assertTrue(callable(len))
267 self.assertFalse(callable("a"))
268 self.assertTrue(callable(callable))
269 self.assertTrue(callable(lambda x, y: x + y))
270 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000271 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000272 self.assertTrue(callable(f))
273
274 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000276 self.assertTrue(callable(C1))
277 c = C1()
278 self.assertTrue(callable(c.meth))
279 self.assertFalse(callable(c))
280
281 # __call__ is looked up on the class, not the instance
282 c.__call__ = None
283 self.assertFalse(callable(c))
284 c.__call__ = lambda self: 0
285 self.assertFalse(callable(c))
286 del c.__call__
287 self.assertFalse(callable(c))
288
289 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000290 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000291 c2 = C2()
292 self.assertTrue(callable(c2))
293 c2.__call__ = None
294 self.assertTrue(callable(c2))
295 class C3(C2): pass
296 c3 = C3()
297 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000298
299 def test_chr(self):
300 self.assertEqual(chr(32), ' ')
301 self.assertEqual(chr(65), 'A')
302 self.assertEqual(chr(97), 'a')
303 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000304 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000305 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300306 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000307 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000308 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
309 self.assertEqual(chr(0x00010000), "\U00010000")
310 self.assertEqual(chr(0x00010001), "\U00010001")
311 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
312 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
313 self.assertEqual(chr(0x00100000), "\U00100000")
314 self.assertEqual(chr(0x00100001), "\U00100001")
315 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
316 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
317 self.assertRaises(ValueError, chr, -1)
318 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000319 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000320
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000321 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000322 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000323
Walter Dörwald919497e2003-01-19 16:23:59 +0000324 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000325 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000326 bom = b'\xef\xbb\xbf'
327 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300329 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
330 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000331 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300335 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
337 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000338 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300339 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000340 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000341
Georg Brandl8334fd92010-12-04 10:26:46 +0000342 # test the optimize argument
343
344 codestr = '''def f():
345 """doc"""
diana543386b2017-10-03 10:46:56 -0600346 debug_enabled = False
347 if __debug__:
348 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000349 try:
350 assert False
351 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200352 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000353 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200354 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000355 '''
356 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200357 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
358 (0, True, 'doc', True, True),
359 (1, False, 'doc', False, False),
360 (2, False, None, False, False)]
361 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000362 # test both direct compilation and compilation via AST
363 codeobjs = []
364 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
365 tree = ast.parse(codestr)
366 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
367 for code in codeobjs:
368 ns = {}
369 exec(code, ns)
370 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200371 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000372
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700373 def test_compile_top_level_await(self):
374 """Test whether code some top level await can be compiled.
375
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400376 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
377 set, and make sure the generated code object has the CO_COROUTINE flag
378 set in order to execute it with `await eval(.....)` instead of exec,
379 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700380 """
381
382 # helper function just to check we can run top=level async-for
383 async def arange(n):
384 for i in range(n):
385 yield i
386
387 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400388 code_samples = [
389 '''a = await asyncio.sleep(0, result=1)''',
390 '''async for i in arange(1):
391 a = 1''',
392 '''async with asyncio.Lock() as l:
393 a = 1'''
394 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700395 policy = maybe_get_event_loop_policy()
396 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400397 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700398 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 with self.assertRaises(
400 SyntaxError, msg=f"source={source} mode={mode}"):
401 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402
403 co = compile(source,
404 '?',
405 mode,
406 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
407
408 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400409 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700410
411 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 async_f = FunctionType(co, globals_)
414 asyncio.run(async_f())
415 self.assertEqual(globals_['a'], 1)
416
417 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400418 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700419 asyncio.run(eval(co, globals_))
420 self.assertEqual(globals_['a'], 1)
421 finally:
422 asyncio.set_event_loop_policy(policy)
423
Pablo Galindo90235812020-03-15 04:29:22 +0000424 def test_compile_top_level_await_invalid_cases(self):
425 # helper function just to check we can run top=level async-for
426 async def arange(n):
427 for i in range(n):
428 yield i
429
430 modes = ('single', 'exec')
431 code_samples = [
432 '''def f(): await arange(10)\n''',
433 '''def f(): [x async for x in arange(10)]\n''',
434 '''def f(): [await x async for x in arange(10)]\n''',
435 '''def f():
436 async for i in arange(1):
437 a = 1
438 ''',
439 '''def f():
440 async with asyncio.Lock() as l:
441 a = 1
442 '''
443 ]
444 policy = maybe_get_event_loop_policy()
445 try:
446 for mode, code_sample in product(modes, code_samples):
447 source = dedent(code_sample)
448 with self.assertRaises(
449 SyntaxError, msg=f"source={source} mode={mode}"):
450 compile(source, '?', mode)
451
452 with self.assertRaises(
453 SyntaxError, msg=f"source={source} mode={mode}"):
454 co = compile(source,
455 '?',
456 mode,
457 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
458 finally:
459 asyncio.set_event_loop_policy(policy)
460
461
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700462 def test_compile_async_generator(self):
463 """
464 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400465 make sure AsyncGenerators are still properly not marked with the
466 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700467 """
468 code = dedent("""async def ticker():
469 for i in range(10):
470 yield i
471 await asyncio.sleep(0)""")
472
473 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
474 glob = {}
475 exec(co, glob)
476 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
477
Walter Dörwald919497e2003-01-19 16:23:59 +0000478 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000479 sys.spam = 1
480 delattr(sys, 'spam')
481 self.assertRaises(TypeError, delattr)
482
483 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000484 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000485 self.assertRaises(TypeError, dir, 42, 42)
486
Georg Brandle32b4222007-03-10 22:13:27 +0000487 # dir() - local scope
488 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000489 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000490
491 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000492 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000493
494 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000495 class Foo(types.ModuleType):
496 __dict__ = 8
497 f = Foo("foo")
498 self.assertRaises(TypeError, dir, f)
499
500 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000501 self.assertIn("strip", dir(str))
502 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000503
504 # dir(obj)
505 class Foo(object):
506 def __init__(self):
507 self.x = 7
508 self.y = 8
509 self.z = 9
510 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000511 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000512
513 # dir(obj_no__dict__)
514 class Foo(object):
515 __slots__ = []
516 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000517 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000518
519 # dir(obj_no__class__with__dict__)
520 # (an ugly trick to cause getattr(f, "__class__") to fail)
521 class Foo(object):
522 __slots__ = ["__class__", "__dict__"]
523 def __init__(self):
524 self.bar = "wow"
525 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000526 self.assertNotIn("__repr__", dir(f))
527 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000528
529 # dir(obj_using __dir__)
530 class Foo(object):
531 def __dir__(self):
532 return ["kan", "ga", "roo"]
533 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000534 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000535
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500536 # dir(obj__dir__tuple)
537 class Foo(object):
538 def __dir__(self):
539 return ("b", "c", "a")
540 res = dir(Foo())
541 self.assertIsInstance(res, list)
542 self.assertTrue(res == ["a", "b", "c"])
543
544 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000545 class Foo(object):
546 def __dir__(self):
547 return 7
548 f = Foo()
549 self.assertRaises(TypeError, dir, f)
550
Collin Winter3eed7652007-08-14 17:53:54 +0000551 # dir(traceback)
552 try:
553 raise IndexError
554 except:
555 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
556
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500557 # test that object has a __dir__()
558 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000559
Walter Dörwald919497e2003-01-19 16:23:59 +0000560 def test_divmod(self):
561 self.assertEqual(divmod(12, 7), (1, 5))
562 self.assertEqual(divmod(-12, 7), (-2, 2))
563 self.assertEqual(divmod(12, -7), (-2, -2))
564 self.assertEqual(divmod(-12, -7), (1, -5))
565
Mark Dickinson5c2db372009-12-05 20:28:34 +0000566 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000567
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000568 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
569 (-3.25, 1.0, (-4.0, 0.75)),
570 (3.25, -1.0, (-4.0, -0.75)),
571 (-3.25, -1.0, (3.0, -0.25))]:
572 result = divmod(num, denom)
573 self.assertAlmostEqual(result[0], exp_result[0])
574 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000575
576 self.assertRaises(TypeError, divmod)
577
578 def test_eval(self):
579 self.assertEqual(eval('1+1'), 2)
580 self.assertEqual(eval(' 1+1\n'), 2)
581 globals = {'a': 1, 'b': 2}
582 locals = {'b': 200, 'c': 300}
583 self.assertEqual(eval('a', globals) , 1)
584 self.assertEqual(eval('a', globals, locals), 1)
585 self.assertEqual(eval('b', globals, locals), 200)
586 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000587 globals = {'a': 1, 'b': 2}
588 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000589 bom = b'\xef\xbb\xbf'
590 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000591 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000592 self.assertRaises(TypeError, eval)
593 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000594 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000595
Benjamin Peterson92722792012-12-15 12:51:05 -0500596 class X:
597 def __getitem__(self, key):
598 raise ValueError
599 self.assertRaises(ValueError, eval, "foo", {}, X())
600
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000601 def test_general_eval(self):
602 # Tests that general mappings can be used for the locals argument
603
604 class M:
605 "Test mapping interface versus possible calls from eval()."
606 def __getitem__(self, key):
607 if key == 'a':
608 return 12
609 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000610 def keys(self):
611 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000612
613 m = M()
614 g = globals()
615 self.assertEqual(eval('a', g, m), 12)
616 self.assertRaises(NameError, eval, 'b', g, m)
617 self.assertEqual(eval('dir()', g, m), list('xyz'))
618 self.assertEqual(eval('globals()', g, m), g)
619 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000620 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000621 class A:
622 "Non-mapping"
623 pass
624 m = A()
625 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000626
627 # Verify that dict subclasses work as well
628 class D(dict):
629 def __getitem__(self, key):
630 if key == 'a':
631 return 12
632 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000633 def keys(self):
634 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000635
636 d = D()
637 self.assertEqual(eval('a', g, d), 12)
638 self.assertRaises(NameError, eval, 'b', g, d)
639 self.assertEqual(eval('dir()', g, d), list('xyz'))
640 self.assertEqual(eval('globals()', g, d), g)
641 self.assertEqual(eval('locals()', g, d), d)
642
643 # Verify locals stores (used by list comps)
644 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000645 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000646
647 class SpreadSheet:
648 "Sample application showing nested, calculated lookups."
649 _cells = {}
650 def __setitem__(self, key, formula):
651 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000652 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000653 return eval(self._cells[key], globals(), self)
654
655 ss = SpreadSheet()
656 ss['a1'] = '5'
657 ss['a2'] = 'a1*6'
658 ss['a3'] = 'a2*7'
659 self.assertEqual(ss['a3'], 210)
660
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000661 # Verify that dir() catches a non-list returned by eval
662 # SF bug #1004669
663 class C:
664 def __getitem__(self, item):
665 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000666 def keys(self):
667 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000668 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
669
Georg Brandl7cae87c2006-09-06 06:51:57 +0000670 def test_exec(self):
671 g = {}
672 exec('z = 1', g)
673 if '__builtins__' in g:
674 del g['__builtins__']
675 self.assertEqual(g, {'z': 1})
676
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000677 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000678 if '__builtins__' in g:
679 del g['__builtins__']
680 self.assertEqual(g, {'z': 2})
681 g = {}
682 l = {}
683
Brett Cannon77628992010-03-20 20:59:33 +0000684 with check_warnings():
685 warnings.filterwarnings("ignore", "global statement",
686 module="<string>")
687 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000688 if '__builtins__' in g:
689 del g['__builtins__']
690 if '__builtins__' in l:
691 del l['__builtins__']
692 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
693
Victor Stinnerb0b22422012-04-19 00:57:45 +0200694 def test_exec_globals(self):
695 code = compile("print('Hello World!')", "", "exec")
696 # no builtin function
697 self.assertRaisesRegex(NameError, "name 'print' is not defined",
698 exec, code, {'__builtins__': {}})
699 # __builtins__ must be a mapping type
700 self.assertRaises(TypeError,
701 exec, code, {'__builtins__': 123})
702
703 # no __build_class__ function
704 code = compile("class A: pass", "", "exec")
705 self.assertRaisesRegex(NameError, "__build_class__ not found",
706 exec, code, {'__builtins__': {}})
707
708 class frozendict_error(Exception):
709 pass
710
711 class frozendict(dict):
712 def __setitem__(self, key, value):
713 raise frozendict_error("frozendict is readonly")
714
715 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400716 if isinstance(__builtins__, types.ModuleType):
717 frozen_builtins = frozendict(__builtins__.__dict__)
718 else:
719 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200720 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
721 self.assertRaises(frozendict_error,
722 exec, code, {'__builtins__': frozen_builtins})
723
724 # read-only globals
725 namespace = frozendict({})
726 code = compile("x=1", "test", "exec")
727 self.assertRaises(frozendict_error,
728 exec, code, namespace)
729
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000730 def test_exec_redirected(self):
731 savestdout = sys.stdout
732 sys.stdout = None # Whatever that cannot flush()
733 try:
734 # Used to raise SystemError('error return without exception set')
735 exec('a')
736 except NameError:
737 pass
738 finally:
739 sys.stdout = savestdout
740
Walter Dörwald919497e2003-01-19 16:23:59 +0000741 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000742 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
743 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
744 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
745 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
746 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000747 def identity(item):
748 return 1
749 filter(identity, Squares(5))
750 self.assertRaises(TypeError, filter)
751 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000752 def __getitem__(self, index):
753 if index<4:
754 return 42
755 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000756 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000757 def badfunc():
758 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000759 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000760
Walter Dörwaldbf517072003-01-27 15:57:14 +0000761 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000762 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
763 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
764 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000765
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000766 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200767 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
768 f1 = filter(filter_char, "abcdeabcde")
769 f2 = filter(filter_char, "abcdeabcde")
770 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000771
Walter Dörwald919497e2003-01-19 16:23:59 +0000772 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000773 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000774 self.assertRaises(TypeError, getattr, sys, 1)
775 self.assertRaises(TypeError, getattr, sys, 1, "foo")
776 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000777 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000778 # unicode surrogates are not encodable to the default encoding (utf8)
779 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000780
781 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000782 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000783 self.assertRaises(TypeError, hasattr, sys, 1)
784 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000785 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000786
Benjamin Peterson17689992010-08-24 03:26:23 +0000787 # Check that hasattr propagates all exceptions outside of
788 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000789 class A:
790 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000791 raise SystemExit
792 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000793 class B:
794 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000795 raise ValueError
796 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000797
Walter Dörwald919497e2003-01-19 16:23:59 +0000798 def test_hash(self):
799 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000800 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 self.assertEqual(hash(1), hash(1.0))
802 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000803 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 hash((0,1,2,3))
805 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000806 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000807 self.assertRaises(TypeError, hash, [])
808 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000809 # Bug 1536021: Allow hash to return long objects
810 class X:
811 def __hash__(self):
812 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000813 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000814 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000815 def __hash__(self):
816 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000817 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000818
819 def test_hex(self):
820 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000821 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000822 self.assertRaises(TypeError, hex, {})
823
824 def test_id(self):
825 id(None)
826 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000827 id(1.0)
828 id('spam')
829 id((0,1,2,3))
830 id([0,1,2,3])
831 id({'spam': 1, 'eggs': 2, 'ham': 3})
832
Guido van Rossuma88a0332007-02-26 16:59:55 +0000833 # Test input() later, alphabetized as if it were raw_input
834
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 def test_iter(self):
836 self.assertRaises(TypeError, iter)
837 self.assertRaises(TypeError, iter, 42, 42)
838 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000839 for l in lists:
840 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000841 self.assertEqual(next(i), '1')
842 self.assertEqual(next(i), '2')
843 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000844
845 def test_isinstance(self):
846 class C:
847 pass
848 class D(C):
849 pass
850 class E:
851 pass
852 c = C()
853 d = D()
854 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000855 self.assertTrue(isinstance(c, C))
856 self.assertTrue(isinstance(d, C))
857 self.assertTrue(not isinstance(e, C))
858 self.assertTrue(not isinstance(c, D))
859 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000860 self.assertRaises(TypeError, isinstance, E, 'foo')
861 self.assertRaises(TypeError, isinstance)
862
863 def test_issubclass(self):
864 class C:
865 pass
866 class D(C):
867 pass
868 class E:
869 pass
870 c = C()
871 d = D()
872 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000873 self.assertTrue(issubclass(D, C))
874 self.assertTrue(issubclass(C, C))
875 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000876 self.assertRaises(TypeError, issubclass, 'foo', E)
877 self.assertRaises(TypeError, issubclass, E, 'foo')
878 self.assertRaises(TypeError, issubclass)
879
880 def test_len(self):
881 self.assertEqual(len('123'), 3)
882 self.assertEqual(len(()), 0)
883 self.assertEqual(len((1, 2, 3, 4)), 4)
884 self.assertEqual(len([1, 2, 3, 4]), 4)
885 self.assertEqual(len({}), 0)
886 self.assertEqual(len({'a':1, 'b': 2}), 2)
887 class BadSeq:
888 def __len__(self):
889 raise ValueError
890 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000891 class InvalidLen:
892 def __len__(self):
893 return None
894 self.assertRaises(TypeError, len, InvalidLen())
895 class FloatLen:
896 def __len__(self):
897 return 4.5
898 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300899 class NegativeLen:
900 def __len__(self):
901 return -10
902 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000903 class HugeLen:
904 def __len__(self):
905 return sys.maxsize + 1
906 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300907 class HugeNegativeLen:
908 def __len__(self):
909 return -sys.maxsize-10
910 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000911 class NoLenMethod(object): pass
912 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000913
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 def test_map(self):
915 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000916 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 [1, 4, 9]
918 )
919 try:
920 from math import sqrt
921 except ImportError:
922 def sqrt(x):
923 return pow(x, 0.5)
924 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000925 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000926 [[4.0, 2.0], [9.0, 3.0]]
927 )
928 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000929 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000930 [10, 4, 6]
931 )
932
933 def plus(*v):
934 accu = 0
935 for i in v: accu = accu + i
936 return accu
937 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000938 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 [1, 3, 7]
940 )
941 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000942 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000943 [1+4, 3+9, 7+2]
944 )
945 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000946 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 [1+4+1, 3+9+1, 7+2+0]
948 )
949 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000950 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000951 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
952 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000953 def Max(a, b):
954 if a is None:
955 return b
956 if b is None:
957 return a
958 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000959 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000960 list(map(Max, Squares(3), Squares(2))),
961 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 )
963 self.assertRaises(TypeError, map)
964 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000965 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000966 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000967 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000968 yield None
969 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000970 def badfunc(x):
971 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000972 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000973
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000974 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200975 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
976 m1 = map(map_char, "Is this the real life?")
977 m2 = map(map_char, "Is this the real life?")
978 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000979
Walter Dörwald919497e2003-01-19 16:23:59 +0000980 def test_max(self):
981 self.assertEqual(max('123123'), '3')
982 self.assertEqual(max(1, 2, 3), 3)
983 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
984 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
985
Guido van Rossume2a383d2007-01-15 16:59:06 +0000986 self.assertEqual(max(1, 2, 3.0), 3.0)
987 self.assertEqual(max(1, 2.0, 3), 3)
988 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000989
Dong-hee Naabdc6342020-01-11 01:31:43 +0900990 with self.assertRaisesRegex(
991 TypeError,
992 'max expected at least 1 argument, got 0'
993 ):
994 max()
995
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700996 self.assertRaises(TypeError, max, 42)
997 self.assertRaises(ValueError, max, ())
998 class BadSeq:
999 def __getitem__(self, index):
1000 raise ValueError
1001 self.assertRaises(ValueError, max, BadSeq())
1002
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001003 for stmt in (
1004 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001005 "max(default=None)",
1006 "max(1, 2, default=None)", # require container for default
1007 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001008 "max(1, key=int)", # single arg not iterable
1009 "max(1, 2, keystone=int)", # wrong keyword
1010 "max(1, 2, key=int, abc=int)", # two many keywords
1011 "max(1, 2, key=1)", # keyfunc is not callable
1012 ):
Tim Peters7f061872004-12-07 21:17:46 +00001013 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001014 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001015 except TypeError:
1016 pass
1017 else:
1018 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001019
1020 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1021 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1022 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1023
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001024 self.assertEqual(max((), default=None), None) # zero elem iterable
1025 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1026 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1027
1028 self.assertEqual(max((), default=1, key=neg), 1)
1029 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1030
Alexander Marshalove22072f2018-07-24 10:58:21 +07001031 self.assertEqual(max((1, 2), key=None), 2)
1032
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001033 data = [random.randrange(200) for i in range(100)]
1034 keys = dict((elem, random.randrange(50)) for elem in data)
1035 f = keys.__getitem__
1036 self.assertEqual(max(data, key=f),
1037 sorted(reversed(data), key=f)[-1])
1038
Walter Dörwald919497e2003-01-19 16:23:59 +00001039 def test_min(self):
1040 self.assertEqual(min('123123'), '1')
1041 self.assertEqual(min(1, 2, 3), 1)
1042 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1043 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1044
Guido van Rossume2a383d2007-01-15 16:59:06 +00001045 self.assertEqual(min(1, 2, 3.0), 1)
1046 self.assertEqual(min(1, 2.0, 3), 1)
1047 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001048
Dong-hee Naabdc6342020-01-11 01:31:43 +09001049 with self.assertRaisesRegex(
1050 TypeError,
1051 'min expected at least 1 argument, got 0'
1052 ):
1053 min()
1054
Walter Dörwald919497e2003-01-19 16:23:59 +00001055 self.assertRaises(TypeError, min, 42)
1056 self.assertRaises(ValueError, min, ())
1057 class BadSeq:
1058 def __getitem__(self, index):
1059 raise ValueError
1060 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001061
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001062 for stmt in (
1063 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001064 "min(default=None)",
1065 "min(1, 2, default=None)", # require container for default
1066 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001067 "min(1, key=int)", # single arg not iterable
1068 "min(1, 2, keystone=int)", # wrong keyword
1069 "min(1, 2, key=int, abc=int)", # two many keywords
1070 "min(1, 2, key=1)", # keyfunc is not callable
1071 ):
Tim Peters7f061872004-12-07 21:17:46 +00001072 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001073 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001074 except TypeError:
1075 pass
1076 else:
1077 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001078
1079 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1080 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1081 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1082
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001083 self.assertEqual(min((), default=None), None) # zero elem iterable
1084 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1085 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1086
1087 self.assertEqual(min((), default=1, key=neg), 1)
1088 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1089
Alexander Marshalove22072f2018-07-24 10:58:21 +07001090 self.assertEqual(min((1, 2), key=None), 1)
1091
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001092 data = [random.randrange(200) for i in range(100)]
1093 keys = dict((elem, random.randrange(50)) for elem in data)
1094 f = keys.__getitem__
1095 self.assertEqual(min(data, key=f),
1096 sorted(data, key=f)[0])
1097
Georg Brandla18af4e2007-04-21 15:47:16 +00001098 def test_next(self):
1099 it = iter(range(2))
1100 self.assertEqual(next(it), 0)
1101 self.assertEqual(next(it), 1)
1102 self.assertRaises(StopIteration, next, it)
1103 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001104 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001105
1106 class Iter(object):
1107 def __iter__(self):
1108 return self
1109 def __next__(self):
1110 raise StopIteration
1111
1112 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001113 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001114 self.assertRaises(StopIteration, next, it)
1115
1116 def gen():
1117 yield 1
1118 return
1119
1120 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001121 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001122 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001123 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001124
Walter Dörwald919497e2003-01-19 16:23:59 +00001125 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001126 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001127 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001128 self.assertRaises(TypeError, oct, ())
1129
1130 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001131 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001132 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001133 self.addCleanup(unlink, TESTFN)
1134 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001136 fp.write('The quick brown fox jumps over the lazy dog')
1137 fp.write('.\n')
1138 fp.write('Dear John\n')
1139 fp.write('XXX'*100)
1140 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001141
1142 def test_open(self):
1143 self.write_testfile()
1144 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001145 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001146 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001147 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1148 self.assertEqual(fp.readline(4), 'Dear')
1149 self.assertEqual(fp.readline(100), ' John\n')
1150 self.assertEqual(fp.read(300), 'XXX'*100)
1151 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001152
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001153 # embedded null bytes and characters
1154 self.assertRaises(ValueError, open, 'a\x00b')
1155 self.assertRaises(ValueError, open, b'a\x00b')
1156
Victor Stinner91106cd2017-12-13 12:29:09 +01001157 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001158 def test_open_default_encoding(self):
1159 old_environ = dict(os.environ)
1160 try:
1161 # try to get a user preferred encoding different than the current
1162 # locale encoding to check that open() uses the current locale
1163 # encoding and not the user preferred encoding
1164 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1165 if key in os.environ:
1166 del os.environ[key]
1167
1168 self.write_testfile()
1169 current_locale_encoding = locale.getpreferredencoding(False)
1170 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001171 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001172 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001173 finally:
1174 os.environ.clear()
1175 os.environ.update(old_environ)
1176
Victor Stinnerdaf45552013-08-28 00:53:59 +02001177 def test_open_non_inheritable(self):
1178 fileobj = open(__file__)
1179 with fileobj:
1180 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1181
Walter Dörwald919497e2003-01-19 16:23:59 +00001182 def test_ord(self):
1183 self.assertEqual(ord(' '), 32)
1184 self.assertEqual(ord('A'), 65)
1185 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001186 self.assertEqual(ord('\x80'), 128)
1187 self.assertEqual(ord('\xff'), 255)
1188
1189 self.assertEqual(ord(b' '), 32)
1190 self.assertEqual(ord(b'A'), 65)
1191 self.assertEqual(ord(b'a'), 97)
1192 self.assertEqual(ord(b'\x80'), 128)
1193 self.assertEqual(ord(b'\xff'), 255)
1194
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001195 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001196 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001197
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001198 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1199 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1200 self.assertEqual(ord("\U00010000"), 0x00010000)
1201 self.assertEqual(ord("\U00010001"), 0x00010001)
1202 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1203 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1204 self.assertEqual(ord("\U00100000"), 0x00100000)
1205 self.assertEqual(ord("\U00100001"), 0x00100001)
1206 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1207 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1208
Walter Dörwald919497e2003-01-19 16:23:59 +00001209 def test_pow(self):
1210 self.assertEqual(pow(0,0), 1)
1211 self.assertEqual(pow(0,1), 0)
1212 self.assertEqual(pow(1,0), 1)
1213 self.assertEqual(pow(1,1), 1)
1214
1215 self.assertEqual(pow(2,0), 1)
1216 self.assertEqual(pow(2,10), 1024)
1217 self.assertEqual(pow(2,20), 1024*1024)
1218 self.assertEqual(pow(2,30), 1024*1024*1024)
1219
1220 self.assertEqual(pow(-2,0), 1)
1221 self.assertEqual(pow(-2,1), -2)
1222 self.assertEqual(pow(-2,2), 4)
1223 self.assertEqual(pow(-2,3), -8)
1224
Walter Dörwald919497e2003-01-19 16:23:59 +00001225 self.assertAlmostEqual(pow(0.,0), 1.)
1226 self.assertAlmostEqual(pow(0.,1), 0.)
1227 self.assertAlmostEqual(pow(1.,0), 1.)
1228 self.assertAlmostEqual(pow(1.,1), 1.)
1229
1230 self.assertAlmostEqual(pow(2.,0), 1.)
1231 self.assertAlmostEqual(pow(2.,10), 1024.)
1232 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1233 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1234
1235 self.assertAlmostEqual(pow(-2.,0), 1.)
1236 self.assertAlmostEqual(pow(-2.,1), -2.)
1237 self.assertAlmostEqual(pow(-2.,2), 4.)
1238 self.assertAlmostEqual(pow(-2.,3), -8.)
1239
Mark Dickinson5c2db372009-12-05 20:28:34 +00001240 for x in 2, 2.0:
1241 for y in 10, 10.0:
1242 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001243 if isinstance(x, float) or \
1244 isinstance(y, float) or \
1245 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001246 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001247 else:
1248 self.assertAlmostEqual(pow(x, y, z), 24.0)
1249
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001250 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1251 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1252
Mark Dickinsonc5299672019-06-02 10:24:06 +01001253 # See test_pow for additional tests for three-argument pow.
1254 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001255 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001256
1257 self.assertRaises(TypeError, pow)
1258
Ammar Askar87d6cd32019-09-21 00:28:49 -04001259 # Test passing in arguments as keywords.
1260 self.assertEqual(pow(0, exp=0), 1)
1261 self.assertEqual(pow(base=2, exp=4), 16)
1262 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1263 twopow = partial(pow, base=2)
1264 self.assertEqual(twopow(exp=5), 32)
1265 fifth_power = partial(pow, exp=5)
1266 self.assertEqual(fifth_power(2), 32)
1267 mod10 = partial(pow, mod=10)
1268 self.assertEqual(mod10(2, 6), 4)
1269 self.assertEqual(mod10(exp=6, base=2), 4)
1270
Guido van Rossuma88a0332007-02-26 16:59:55 +00001271 def test_input(self):
1272 self.write_testfile()
1273 fp = open(TESTFN, 'r')
1274 savestdin = sys.stdin
1275 savestdout = sys.stdout # Eats the echo
1276 try:
1277 sys.stdin = fp
1278 sys.stdout = BitBucket()
1279 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001280 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1281 self.assertEqual(input('testing\n'), 'Dear John')
1282
1283 # SF 1535165: don't segfault on closed stdin
1284 # sys.stdout must be a regular file for triggering
1285 sys.stdout = savestdout
1286 sys.stdin.close()
1287 self.assertRaises(ValueError, input)
1288
1289 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001290 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001291 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001292 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001293 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001294 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001295 self.assertRaises(EOFError, input)
1296
1297 del sys.stdout
1298 self.assertRaises(RuntimeError, input, 'prompt')
1299 del sys.stdin
1300 self.assertRaises(RuntimeError, input, 'prompt')
1301 finally:
1302 sys.stdin = savestdin
1303 sys.stdout = savestdout
1304 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001305
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001306 # test_int(): see test_int.py for tests of built-in function int().
1307
Walter Dörwald919497e2003-01-19 16:23:59 +00001308 def test_repr(self):
1309 self.assertEqual(repr(''), '\'\'')
1310 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001311 self.assertEqual(repr(()), '()')
1312 self.assertEqual(repr([]), '[]')
1313 self.assertEqual(repr({}), '{}')
1314 a = []
1315 a.append(a)
1316 self.assertEqual(repr(a), '[[...]]')
1317 a = {}
1318 a[0] = a
1319 self.assertEqual(repr(a), '{0: {...}}')
1320
1321 def test_round(self):
1322 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001323 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001324 self.assertEqual(round(1.0), 1.0)
1325 self.assertEqual(round(10.0), 10.0)
1326 self.assertEqual(round(1000000000.0), 1000000000.0)
1327 self.assertEqual(round(1e20), 1e20)
1328
1329 self.assertEqual(round(-1.0), -1.0)
1330 self.assertEqual(round(-10.0), -10.0)
1331 self.assertEqual(round(-1000000000.0), -1000000000.0)
1332 self.assertEqual(round(-1e20), -1e20)
1333
1334 self.assertEqual(round(0.1), 0.0)
1335 self.assertEqual(round(1.1), 1.0)
1336 self.assertEqual(round(10.1), 10.0)
1337 self.assertEqual(round(1000000000.1), 1000000000.0)
1338
1339 self.assertEqual(round(-1.1), -1.0)
1340 self.assertEqual(round(-10.1), -10.0)
1341 self.assertEqual(round(-1000000000.1), -1000000000.0)
1342
1343 self.assertEqual(round(0.9), 1.0)
1344 self.assertEqual(round(9.9), 10.0)
1345 self.assertEqual(round(999999999.9), 1000000000.0)
1346
1347 self.assertEqual(round(-0.9), -1.0)
1348 self.assertEqual(round(-9.9), -10.0)
1349 self.assertEqual(round(-999999999.9), -1000000000.0)
1350
1351 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001352 self.assertEqual(type(round(-8.0, -1)), float)
1353
1354 self.assertEqual(type(round(-8.0, 0)), float)
1355 self.assertEqual(type(round(-8.0, 1)), float)
1356
1357 # Check even / odd rounding behaviour
1358 self.assertEqual(round(5.5), 6)
1359 self.assertEqual(round(6.5), 6)
1360 self.assertEqual(round(-5.5), -6)
1361 self.assertEqual(round(-6.5), -6)
1362
1363 # Check behavior on ints
1364 self.assertEqual(round(0), 0)
1365 self.assertEqual(round(8), 8)
1366 self.assertEqual(round(-8), -8)
1367 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001368 self.assertEqual(type(round(-8, -1)), int)
1369 self.assertEqual(type(round(-8, 0)), int)
1370 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001371
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372 # test new kwargs
1373 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1374
Walter Dörwald919497e2003-01-19 16:23:59 +00001375 self.assertRaises(TypeError, round)
1376
Alex Martelliae211f92007-08-22 23:21:33 +00001377 # test generic rounding delegation for reals
1378 class TestRound:
1379 def __round__(self):
1380 return 23
1381
1382 class TestNoRound:
1383 pass
1384
1385 self.assertEqual(round(TestRound()), 23)
1386
1387 self.assertRaises(TypeError, round, 1, 2, 3)
1388 self.assertRaises(TypeError, round, TestNoRound())
1389
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001390 t = TestNoRound()
1391 t.__round__ = lambda *args: args
1392 self.assertRaises(TypeError, round, t)
1393 self.assertRaises(TypeError, round, t, 0)
1394
Mark Dickinsonad731b92009-11-09 17:12:30 +00001395 # Some versions of glibc for alpha have a bug that affects
1396 # float -> integer rounding (floor, ceil, rint, round) for
1397 # values in the range [2**52, 2**53). See:
1398 #
1399 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1400 #
1401 # We skip this test on Linux/alpha if it would fail.
1402 linux_alpha = (platform.system().startswith('Linux') and
1403 platform.machine().startswith('alpha'))
1404 system_round_bug = round(5e15+1) != 5e15+1
1405 @unittest.skipIf(linux_alpha and system_round_bug,
1406 "test will fail; failure is probably due to a "
1407 "buggy system round function")
1408 def test_round_large(self):
1409 # Issue #1869: integral floats should remain unchanged
1410 self.assertEqual(round(5e15-1), 5e15-1)
1411 self.assertEqual(round(5e15), 5e15)
1412 self.assertEqual(round(5e15+1), 5e15+1)
1413 self.assertEqual(round(5e15+2), 5e15+2)
1414 self.assertEqual(round(5e15+3), 5e15+3)
1415
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001416 def test_bug_27936(self):
1417 # Verify that ndigits=None means the same as passing in no argument
1418 for x in [1234,
1419 1234.56,
1420 decimal.Decimal('1234.56'),
1421 fractions.Fraction(123456, 100)]:
1422 self.assertEqual(round(x, None), round(x))
1423 self.assertEqual(type(round(x, None)), type(round(x)))
1424
Walter Dörwald919497e2003-01-19 16:23:59 +00001425 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001426 setattr(sys, 'spam', 1)
1427 self.assertEqual(sys.spam, 1)
1428 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1429 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001430
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001431 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001432
Alex Martellia70b1912003-04-22 08:12:33 +00001433 def test_sum(self):
1434 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001435 self.assertEqual(sum(list(range(2,8))), 27)
1436 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001437 self.assertEqual(sum(Squares(10)), 285)
1438 self.assertEqual(sum(iter(Squares(10))), 285)
1439 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1440
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001441 self.assertEqual(sum(range(10), 1000), 1045)
1442 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001443 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1444 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1445
1446 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1447 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1448 2**31+2)
1449 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1450 2**63+2)
1451 self.assertIs(sum([], False), False)
1452
1453 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1454 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1455 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1456 self.assertEqual(sum([0.5, 1]), 1.5)
1457 self.assertEqual(sum([1, 0.5]), 1.5)
1458 self.assertEqual(repr(sum([-0.0])), '0.0')
1459 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1460 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001461
Alex Martellia70b1912003-04-22 08:12:33 +00001462 self.assertRaises(TypeError, sum)
1463 self.assertRaises(TypeError, sum, 42)
1464 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1465 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001466 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1467 values = [bytearray(b'a'), bytearray(b'b')]
1468 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001469 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1470 self.assertRaises(TypeError, sum, [{2:3}])
1471 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001472 self.assertRaises(TypeError, sum, [], '')
1473 self.assertRaises(TypeError, sum, [], b'')
1474 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001475
1476 class BadSeq:
1477 def __getitem__(self, index):
1478 raise ValueError
1479 self.assertRaises(ValueError, sum, BadSeq())
1480
Mark Dickinson3a22b472009-10-17 21:48:16 +00001481 empty = []
1482 sum(([x] for x in range(10)), empty)
1483 self.assertEqual(empty, [])
1484
Walter Dörwald919497e2003-01-19 16:23:59 +00001485 def test_type(self):
1486 self.assertEqual(type(''), type('123'))
1487 self.assertNotEqual(type(''), type(()))
1488
Guido van Rossumfee7b932005-01-16 00:21:28 +00001489 # We don't want self in vars(), so these are static methods
1490
1491 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001492 def get_vars_f0():
1493 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001494
Guido van Rossumfee7b932005-01-16 00:21:28 +00001495 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001496 def get_vars_f2():
1497 BuiltinTest.get_vars_f0()
1498 a = 1
1499 b = 2
1500 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001501
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001502 class C_get_vars(object):
1503 def getDict(self):
1504 return {'a':2}
1505 __dict__ = property(fget=getDict)
1506
Walter Dörwald919497e2003-01-19 16:23:59 +00001507 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001508 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001509 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001510 self.assertEqual(self.get_vars_f0(), {})
1511 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1512 self.assertRaises(TypeError, vars, 42, 42)
1513 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001514 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001515
1516 def test_zip(self):
1517 a = (1, 2, 3)
1518 b = (4, 5, 6)
1519 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001520 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001521 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001522 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001523 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001524 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001525 class I:
1526 def __getitem__(self, i):
1527 if i < 0 or i > 2: raise IndexError
1528 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001529 self.assertEqual(list(zip(a, I())), t)
1530 self.assertEqual(list(zip()), [])
1531 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001532 self.assertRaises(TypeError, zip, None)
1533 class G:
1534 pass
1535 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001536 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001537
1538 # Make sure zip doesn't try to allocate a billion elements for the
1539 # result list when one of its arguments doesn't say how long it is.
1540 # A MemoryError is the most likely failure mode.
1541 class SequenceWithoutALength:
1542 def __getitem__(self, i):
1543 if i == 5:
1544 raise IndexError
1545 else:
1546 return i
1547 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001548 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001549 list(enumerate(range(5)))
1550 )
1551
1552 class BadSeq:
1553 def __getitem__(self, i):
1554 if i == 5:
1555 raise ValueError
1556 else:
1557 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001558 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001559
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001560 def test_zip_pickle(self):
1561 a = (1, 2, 3)
1562 b = (4, 5, 6)
1563 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001564 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1565 z1 = zip(a, b)
1566 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001567
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001568 def test_zip_bad_iterable(self):
1569 exception = TypeError()
1570
1571 class BadIterable:
1572 def __iter__(self):
1573 raise exception
1574
1575 with self.assertRaises(TypeError) as cm:
1576 zip(BadIterable())
1577
1578 self.assertIs(cm.exception, exception)
1579
Eric Smithe4d63172010-09-13 20:48:43 +00001580 def test_format(self):
1581 # Test the basic machinery of the format() builtin. Don't test
1582 # the specifics of the various formatters
1583 self.assertEqual(format(3, ''), '3')
1584
1585 # Returns some classes to use for various tests. There's
1586 # an old-style version, and a new-style version
1587 def classes_new():
1588 class A(object):
1589 def __init__(self, x):
1590 self.x = x
1591 def __format__(self, format_spec):
1592 return str(self.x) + format_spec
1593 class DerivedFromA(A):
1594 pass
1595
1596 class Simple(object): pass
1597 class DerivedFromSimple(Simple):
1598 def __init__(self, x):
1599 self.x = x
1600 def __format__(self, format_spec):
1601 return str(self.x) + format_spec
1602 class DerivedFromSimple2(DerivedFromSimple): pass
1603 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1604
1605 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1606 self.assertEqual(format(A(3), 'spec'), '3spec')
1607 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1608 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1609 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1610 '10abcdef')
1611
1612 class_test(*classes_new())
1613
1614 def empty_format_spec(value):
1615 # test that:
1616 # format(x, '') == str(x)
1617 # format(x) == str(x)
1618 self.assertEqual(format(value, ""), str(value))
1619 self.assertEqual(format(value), str(value))
1620
1621 # for builtin types, format(x, "") == str(x)
1622 empty_format_spec(17**13)
1623 empty_format_spec(1.0)
1624 empty_format_spec(3.1415e104)
1625 empty_format_spec(-3.1415e104)
1626 empty_format_spec(3.1415e-104)
1627 empty_format_spec(-3.1415e-104)
1628 empty_format_spec(object)
1629 empty_format_spec(None)
1630
1631 # TypeError because self.__format__ returns the wrong type
1632 class BadFormatResult:
1633 def __format__(self, format_spec):
1634 return 1.0
1635 self.assertRaises(TypeError, format, BadFormatResult(), "")
1636
1637 # TypeError because format_spec is not unicode or str
1638 self.assertRaises(TypeError, format, object(), 4)
1639 self.assertRaises(TypeError, format, object(), object())
1640
1641 # tests for object.__format__ really belong elsewhere, but
1642 # there's no good place to put them
1643 x = object().__format__('')
1644 self.assertTrue(x.startswith('<object object at'))
1645
1646 # first argument to object.__format__ must be string
1647 self.assertRaises(TypeError, object().__format__, 3)
1648 self.assertRaises(TypeError, object().__format__, object())
1649 self.assertRaises(TypeError, object().__format__, None)
1650
1651 # --------------------------------------------------------------------
1652 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001653 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001654 class A:
1655 def __format__(self, fmt_str):
1656 return format('', fmt_str)
1657
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001658 self.assertEqual(format(A()), '')
1659 self.assertEqual(format(A(), ''), '')
1660 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001661
1662 class B:
1663 pass
1664
1665 class C(object):
1666 pass
1667
1668 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001669 obj = cls()
1670 self.assertEqual(format(obj), str(obj))
1671 self.assertEqual(format(obj, ''), str(obj))
1672 with self.assertRaisesRegex(TypeError,
1673 r'\b%s\b' % re.escape(cls.__name__)):
1674 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001675 # --------------------------------------------------------------------
1676
1677 # make sure we can take a subclass of str as a format spec
1678 class DerivedFromStr(str): pass
1679 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1680
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001681 def test_bin(self):
1682 self.assertEqual(bin(0), '0b0')
1683 self.assertEqual(bin(1), '0b1')
1684 self.assertEqual(bin(-1), '-0b1')
1685 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1686 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1687 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1688 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1689
Georg Brandl953152f2009-07-22 12:03:59 +00001690 def test_bytearray_translate(self):
1691 x = bytearray(b"abc")
1692 self.assertRaises(ValueError, x.translate, b"1", 1)
1693 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1694
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001695 def test_bytearray_extend_error(self):
1696 array = bytearray()
1697 bad_iter = map(int, "X")
1698 self.assertRaises(ValueError, array.extend, bad_iter)
1699
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001700 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001701 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001702 tp = type(const)
1703 self.assertIs(tp(), const)
1704 self.assertRaises(TypeError, tp, 1, 2)
1705 self.assertRaises(TypeError, tp, a=1, b=2)
1706
MojoVampire469325c2020-03-03 18:50:17 +00001707 def test_warning_notimplemented(self):
1708 # Issue #35712: NotImplemented is a sentinel value that should never
1709 # be evaluated in a boolean context (virtually all such use cases
1710 # are a result of accidental misuse implementing rich comparison
1711 # operations in terms of one another).
1712 # For the time being, it will continue to evaluate as truthy, but
1713 # issue a deprecation warning (with the eventual intent to make it
1714 # a TypeError).
1715 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1716 with self.assertWarns(DeprecationWarning):
1717 self.assertTrue(NotImplemented)
1718 with self.assertWarns(DeprecationWarning):
1719 self.assertFalse(not NotImplemented)
1720
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001721
1722class TestBreakpoint(unittest.TestCase):
1723 def setUp(self):
1724 # These tests require a clean slate environment. For example, if the
1725 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1726 # will mess up these tests. Similarly for sys.breakpointhook.
1727 # Cleaning the slate here means you can't use breakpoint() to debug
1728 # these tests, but I think that's okay. Just use pdb.set_trace() if
1729 # you must.
1730 self.resources = ExitStack()
1731 self.addCleanup(self.resources.close)
1732 self.env = self.resources.enter_context(EnvironmentVarGuard())
1733 del self.env['PYTHONBREAKPOINT']
1734 self.resources.enter_context(
1735 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1736
1737 def test_breakpoint(self):
1738 with patch('pdb.set_trace') as mock:
1739 breakpoint()
1740 mock.assert_called_once()
1741
1742 def test_breakpoint_with_breakpointhook_set(self):
1743 my_breakpointhook = MagicMock()
1744 sys.breakpointhook = my_breakpointhook
1745 breakpoint()
1746 my_breakpointhook.assert_called_once_with()
1747
1748 def test_breakpoint_with_breakpointhook_reset(self):
1749 my_breakpointhook = MagicMock()
1750 sys.breakpointhook = my_breakpointhook
1751 breakpoint()
1752 my_breakpointhook.assert_called_once_with()
1753 # Reset the hook and it will not be called again.
1754 sys.breakpointhook = sys.__breakpointhook__
1755 with patch('pdb.set_trace') as mock:
1756 breakpoint()
1757 mock.assert_called_once_with()
1758 my_breakpointhook.assert_called_once_with()
1759
1760 def test_breakpoint_with_args_and_keywords(self):
1761 my_breakpointhook = MagicMock()
1762 sys.breakpointhook = my_breakpointhook
1763 breakpoint(1, 2, 3, four=4, five=5)
1764 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1765
1766 def test_breakpoint_with_passthru_error(self):
1767 def my_breakpointhook():
1768 pass
1769 sys.breakpointhook = my_breakpointhook
1770 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1771
1772 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1773 def test_envar_good_path_builtin(self):
1774 self.env['PYTHONBREAKPOINT'] = 'int'
1775 with patch('builtins.int') as mock:
1776 breakpoint('7')
1777 mock.assert_called_once_with('7')
1778
1779 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1780 def test_envar_good_path_other(self):
1781 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1782 with patch('sys.exit') as mock:
1783 breakpoint()
1784 mock.assert_called_once_with()
1785
1786 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1787 def test_envar_good_path_noop_0(self):
1788 self.env['PYTHONBREAKPOINT'] = '0'
1789 with patch('pdb.set_trace') as mock:
1790 breakpoint()
1791 mock.assert_not_called()
1792
1793 def test_envar_good_path_empty_string(self):
1794 # PYTHONBREAKPOINT='' is the same as it not being set.
1795 self.env['PYTHONBREAKPOINT'] = ''
1796 with patch('pdb.set_trace') as mock:
1797 breakpoint()
1798 mock.assert_called_once_with()
1799
1800 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1801 def test_envar_unimportable(self):
1802 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001803 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001804 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001805 'nosuchbuiltin',
1806 'nosuchmodule.nosuchcallable',
1807 ):
1808 with self.subTest(envar=envar):
1809 self.env['PYTHONBREAKPOINT'] = envar
1810 mock = self.resources.enter_context(patch('pdb.set_trace'))
1811 w = self.resources.enter_context(check_warnings(quiet=True))
1812 breakpoint()
1813 self.assertEqual(
1814 str(w.message),
1815 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1816 self.assertEqual(w.category, RuntimeWarning)
1817 mock.assert_not_called()
1818
1819 def test_envar_ignored_when_hook_is_set(self):
1820 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1821 with patch('sys.exit') as mock:
1822 sys.breakpointhook = int
1823 breakpoint()
1824 mock.assert_not_called()
1825
1826
Martin Panterc9a6ab52015-10-10 01:25:38 +00001827@unittest.skipUnless(pty, "the pty and signal modules must be available")
1828class PtyTests(unittest.TestCase):
1829 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1830 terminals in the test environment"""
1831
Martin Pantere44dba32015-10-10 05:27:15 +00001832 def run_child(self, child, terminal_input):
1833 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001834 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001835 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001836 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001837 os.close(r)
1838 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001839 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001840 raise
1841 if pid == 0:
1842 # Child
1843 try:
1844 # Make sure we don't get stuck if there's a problem
1845 signal.alarm(2)
1846 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001847 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001848 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001849 except:
1850 traceback.print_exc()
1851 finally:
1852 # We don't want to return to unittest...
1853 os._exit(0)
1854 # Parent
1855 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001856 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001857 # Get results from the pipe
1858 with open(r, "r") as rpipe:
1859 lines = []
1860 while True:
1861 line = rpipe.readline().strip()
1862 if line == "":
1863 # The other end was closed => the child exited
1864 break
1865 lines.append(line)
1866 # Check the result was got and corresponds to the user's terminal input
1867 if len(lines) != 2:
1868 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001869 # Beware of Linux raising EIO when the slave is closed
1870 child_output = bytearray()
1871 while True:
1872 try:
1873 chunk = os.read(fd, 3000)
1874 except OSError: # Assume EIO
1875 break
1876 if not chunk:
1877 break
1878 child_output.extend(chunk)
1879 os.close(fd)
1880 child_output = child_output.decode("ascii", "ignore")
1881 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1882 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001883 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001884
Victor Stinner3ca9f502017-08-09 23:08:22 +02001885 # Wait until the child process completes
1886 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001887
Martin Pantere44dba32015-10-10 05:27:15 +00001888 return lines
1889
1890 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1891 if not sys.stdin.isatty() or not sys.stdout.isatty():
1892 self.skipTest("stdin and stdout must be ttys")
1893 def child(wpipe):
1894 # Check the error handlers are accounted for
1895 if stdio_encoding:
1896 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1897 encoding=stdio_encoding,
1898 errors='surrogateescape')
1899 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1900 encoding=stdio_encoding,
1901 errors='replace')
1902 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1903 print(ascii(input(prompt)), file=wpipe)
1904 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001905 # Check we did exercise the GNU readline path
1906 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1907 if lines[0] != 'tty = True':
1908 self.skipTest("standard IO in should have been a tty")
1909 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1910 if stdio_encoding:
1911 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1912 else:
1913 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1914 self.assertEqual(input_result, expected)
1915
1916 def test_input_tty(self):
1917 # Test input() functionality when wired to a tty (the code path
1918 # is different and invokes GNU readline if available).
1919 self.check_input_tty("prompt", b"quux")
1920
1921 def test_input_tty_non_ascii(self):
1922 # Check stdin/stdout encoding is used when invoking GNU readline
1923 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1924
1925 def test_input_tty_non_ascii_unicode_errors(self):
1926 # Check stdin/stdout error handler is used when invoking GNU readline
1927 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1928
1929 def test_input_no_stdout_fileno(self):
1930 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1931 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001932 def child(wpipe):
1933 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1934 sys.stdout = io.StringIO() # Does not support fileno()
1935 input("prompt")
1936 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1937 lines = self.run_child(child, b"quux\r")
1938 expected = (
1939 "stdin.isatty(): True",
1940 "captured: 'prompt'",
1941 )
1942 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001943
Raymond Hettinger64958a12003-12-17 20:43:33 +00001944class TestSorted(unittest.TestCase):
1945
1946 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001947 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001948 copy = data[:]
1949 random.shuffle(copy)
1950 self.assertEqual(data, sorted(copy))
1951 self.assertNotEqual(data, copy)
1952
1953 data.reverse()
1954 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001955 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1956 self.assertNotEqual(data, copy)
1957 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001958 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001959 self.assertNotEqual(data, copy)
1960
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001961 def test_bad_arguments(self):
1962 # Issue #29327: The first argument is positional-only.
1963 sorted([])
1964 with self.assertRaises(TypeError):
1965 sorted(iterable=[])
1966 # Other arguments are keyword-only
1967 sorted([], key=None)
1968 with self.assertRaises(TypeError):
1969 sorted([], None)
1970
Raymond Hettinger64958a12003-12-17 20:43:33 +00001971 def test_inputtypes(self):
1972 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001973 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001974 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001975 self.assertEqual(sorted(s), sorted(T(s)))
1976
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001977 s = ''.join(set(s)) # unique letters only
1978 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001979 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001980 self.assertEqual(sorted(s), sorted(T(s)))
1981
1982 def test_baddecorator(self):
1983 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1984 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1985
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001986
1987class ShutdownTest(unittest.TestCase):
1988
1989 def test_cleanup(self):
1990 # Issue #19255: builtins are still available at shutdown
1991 code = """if 1:
1992 import builtins
1993 import sys
1994
1995 class C:
1996 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001997 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001998 # Check that builtins still exist
1999 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002000 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002001
2002 c = C()
2003 # Make this module survive until builtins and sys are cleaned
2004 builtins.here = sys.modules[__name__]
2005 sys.here = sys.modules[__name__]
2006 # Create a reference loop so that this module needs to go
2007 # through a GC phase.
2008 here = sys.modules[__name__]
2009 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002010 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2011 # otherwise the codec may be unloaded before C.__del__() is called, and
2012 # so print("before") fails because the codec cannot be used to encode
2013 # "before" to sys.stdout.encoding. For example, on Windows,
2014 # sys.stdout.encoding is the OEM code page and these code pages are
2015 # implemented in Python
2016 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002017 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002018 self.assertEqual(["before", "after"], out.decode().splitlines())
2019
2020
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002021class TestType(unittest.TestCase):
2022 def test_new_type(self):
2023 A = type('A', (), {})
2024 self.assertEqual(A.__name__, 'A')
2025 self.assertEqual(A.__qualname__, 'A')
2026 self.assertEqual(A.__module__, __name__)
2027 self.assertEqual(A.__bases__, (object,))
2028 self.assertIs(A.__base__, object)
2029 x = A()
2030 self.assertIs(type(x), A)
2031 self.assertIs(x.__class__, A)
2032
2033 class B:
2034 def ham(self):
2035 return 'ham%d' % self
2036 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2037 self.assertEqual(C.__name__, 'C')
2038 self.assertEqual(C.__qualname__, 'C')
2039 self.assertEqual(C.__module__, __name__)
2040 self.assertEqual(C.__bases__, (B, int))
2041 self.assertIs(C.__base__, int)
2042 self.assertIn('spam', C.__dict__)
2043 self.assertNotIn('ham', C.__dict__)
2044 x = C(42)
2045 self.assertEqual(x, 42)
2046 self.assertIs(type(x), C)
2047 self.assertIs(x.__class__, C)
2048 self.assertEqual(x.ham(), 'ham42')
2049 self.assertEqual(x.spam(), 'spam42')
2050 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2051
Nick Coghland78448e2016-07-30 16:26:03 +10002052 def test_type_nokwargs(self):
2053 with self.assertRaises(TypeError):
2054 type('a', (), {}, x=5)
2055 with self.assertRaises(TypeError):
2056 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002057
2058 def test_type_name(self):
2059 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2060 with self.subTest(name=name):
2061 A = type(name, (), {})
2062 self.assertEqual(A.__name__, name)
2063 self.assertEqual(A.__qualname__, name)
2064 self.assertEqual(A.__module__, __name__)
2065 with self.assertRaises(ValueError):
2066 type('A\x00B', (), {})
2067 with self.assertRaises(ValueError):
2068 type('A\udcdcB', (), {})
2069 with self.assertRaises(TypeError):
2070 type(b'A', (), {})
2071
2072 C = type('C', (), {})
2073 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2074 with self.subTest(name=name):
2075 C.__name__ = name
2076 self.assertEqual(C.__name__, name)
2077 self.assertEqual(C.__qualname__, 'C')
2078 self.assertEqual(C.__module__, __name__)
2079
2080 A = type('C', (), {})
2081 with self.assertRaises(ValueError):
2082 A.__name__ = 'A\x00B'
2083 self.assertEqual(A.__name__, 'C')
2084 with self.assertRaises(ValueError):
2085 A.__name__ = 'A\udcdcB'
2086 self.assertEqual(A.__name__, 'C')
2087 with self.assertRaises(TypeError):
2088 A.__name__ = b'A'
2089 self.assertEqual(A.__name__, 'C')
2090
2091 def test_type_qualname(self):
2092 A = type('A', (), {'__qualname__': 'B.C'})
2093 self.assertEqual(A.__name__, 'A')
2094 self.assertEqual(A.__qualname__, 'B.C')
2095 self.assertEqual(A.__module__, __name__)
2096 with self.assertRaises(TypeError):
2097 type('A', (), {'__qualname__': b'B'})
2098 self.assertEqual(A.__qualname__, 'B.C')
2099
2100 A.__qualname__ = 'D.E'
2101 self.assertEqual(A.__name__, 'A')
2102 self.assertEqual(A.__qualname__, 'D.E')
2103 with self.assertRaises(TypeError):
2104 A.__qualname__ = b'B'
2105 self.assertEqual(A.__qualname__, 'D.E')
2106
2107 def test_type_doc(self):
2108 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2109 A = type('A', (), {'__doc__': doc})
2110 self.assertEqual(A.__doc__, doc)
2111 with self.assertRaises(UnicodeEncodeError):
2112 type('A', (), {'__doc__': 'x\udcdcy'})
2113
2114 A = type('A', (), {})
2115 self.assertEqual(A.__doc__, None)
2116 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2117 A.__doc__ = doc
2118 self.assertEqual(A.__doc__, doc)
2119
2120 def test_bad_args(self):
2121 with self.assertRaises(TypeError):
2122 type()
2123 with self.assertRaises(TypeError):
2124 type('A', ())
2125 with self.assertRaises(TypeError):
2126 type('A', (), {}, ())
2127 with self.assertRaises(TypeError):
2128 type('A', (), dict={})
2129 with self.assertRaises(TypeError):
2130 type('A', [], {})
2131 with self.assertRaises(TypeError):
2132 type('A', (), types.MappingProxyType({}))
2133 with self.assertRaises(TypeError):
2134 type('A', (None,), {})
2135 with self.assertRaises(TypeError):
2136 type('A', (bool,), {})
2137 with self.assertRaises(TypeError):
2138 type('A', (int, str), {})
2139
2140 def test_bad_slots(self):
2141 with self.assertRaises(TypeError):
2142 type('A', (), {'__slots__': b'x'})
2143 with self.assertRaises(TypeError):
2144 type('A', (int,), {'__slots__': 'x'})
2145 with self.assertRaises(TypeError):
2146 type('A', (), {'__slots__': ''})
2147 with self.assertRaises(TypeError):
2148 type('A', (), {'__slots__': '42'})
2149 with self.assertRaises(TypeError):
2150 type('A', (), {'__slots__': 'x\x00y'})
2151 with self.assertRaises(ValueError):
2152 type('A', (), {'__slots__': 'x', 'x': 0})
2153 with self.assertRaises(TypeError):
2154 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2155 with self.assertRaises(TypeError):
2156 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2157
2158 class B:
2159 pass
2160 with self.assertRaises(TypeError):
2161 type('A', (B,), {'__slots__': '__dict__'})
2162 with self.assertRaises(TypeError):
2163 type('A', (B,), {'__slots__': '__weakref__'})
2164
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002165 def test_namespace_order(self):
2166 # bpo-34320: namespace should preserve order
2167 od = collections.OrderedDict([('a', 1), ('b', 2)])
2168 od.move_to_end('a')
2169 expected = list(od.items())
2170
2171 C = type('C', (), od)
2172 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2173
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002174
Zachary Warea4b7a752013-11-24 01:19:09 -06002175def load_tests(loader, tests, pattern):
2176 from doctest import DocTestSuite
2177 tests.addTest(DocTestSuite(builtins))
2178 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002179
2180if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002181 unittest.main()