blob: f680e02fdf52044e831d97018c5e9c8b8991e338 [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
Miss Islington (bot)37bc9352019-09-21 01:22:29 -070022from 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')
Brett Cannon0a6693a2019-09-11 12:38:22 +0100164 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Miss Islington (bot)52c99ae2019-09-13 03:53:22 -0700165 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')
329 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
330 compile('pass', '?', dont_inherit=1, 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:
Miss Islington (bot)ec8a9732020-03-19 04:54:16 -0700393 a = 1''',
394 '''a = [x async for x in arange(2)][1]''',
395 '''a = 1 in {x async for x in arange(2)}''',
396 '''a = {x:1 async for x in arange(1)}[0]''',
397 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
398 '''a = [x async for x in (x async for x in arange(5))][1]''',
399 '''a, = [1 for x in {x async for x in arange(1)}]''',
400 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400401 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402 policy = maybe_get_event_loop_policy()
403 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400404 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700405 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400406 with self.assertRaises(
407 SyntaxError, msg=f"source={source} mode={mode}"):
408 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700409
410 co = compile(source,
411 '?',
412 mode,
413 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
414
415 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400416 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700417
418 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400419 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700420 async_f = FunctionType(co, globals_)
421 asyncio.run(async_f())
422 self.assertEqual(globals_['a'], 1)
423
424 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400425 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700426 asyncio.run(eval(co, globals_))
427 self.assertEqual(globals_['a'], 1)
428 finally:
429 asyncio.set_event_loop_policy(policy)
430
Miss Islington (bot)f7e32fc2020-03-14 21:46:26 -0700431 def test_compile_top_level_await_invalid_cases(self):
432 # helper function just to check we can run top=level async-for
433 async def arange(n):
434 for i in range(n):
435 yield i
436
437 modes = ('single', 'exec')
438 code_samples = [
439 '''def f(): await arange(10)\n''',
440 '''def f(): [x async for x in arange(10)]\n''',
441 '''def f(): [await x async for x in arange(10)]\n''',
442 '''def f():
443 async for i in arange(1):
444 a = 1
445 ''',
446 '''def f():
447 async with asyncio.Lock() as l:
448 a = 1
449 '''
450 ]
451 policy = maybe_get_event_loop_policy()
452 try:
453 for mode, code_sample in product(modes, code_samples):
454 source = dedent(code_sample)
455 with self.assertRaises(
456 SyntaxError, msg=f"source={source} mode={mode}"):
457 compile(source, '?', mode)
458
459 with self.assertRaises(
460 SyntaxError, msg=f"source={source} mode={mode}"):
461 co = compile(source,
462 '?',
463 mode,
464 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
465 finally:
466 asyncio.set_event_loop_policy(policy)
467
468
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700469 def test_compile_async_generator(self):
470 """
471 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400472 make sure AsyncGenerators are still properly not marked with the
473 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700474 """
475 code = dedent("""async def ticker():
476 for i in range(10):
477 yield i
478 await asyncio.sleep(0)""")
479
480 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
481 glob = {}
482 exec(co, glob)
483 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
484
Walter Dörwald919497e2003-01-19 16:23:59 +0000485 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 sys.spam = 1
487 delattr(sys, 'spam')
488 self.assertRaises(TypeError, delattr)
489
490 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000491 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000492 self.assertRaises(TypeError, dir, 42, 42)
493
Georg Brandle32b4222007-03-10 22:13:27 +0000494 # dir() - local scope
495 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000496 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000497
498 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000499 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000500
501 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000502 class Foo(types.ModuleType):
503 __dict__ = 8
504 f = Foo("foo")
505 self.assertRaises(TypeError, dir, f)
506
507 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000508 self.assertIn("strip", dir(str))
509 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000510
511 # dir(obj)
512 class Foo(object):
513 def __init__(self):
514 self.x = 7
515 self.y = 8
516 self.z = 9
517 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000518 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000519
520 # dir(obj_no__dict__)
521 class Foo(object):
522 __slots__ = []
523 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000524 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000525
526 # dir(obj_no__class__with__dict__)
527 # (an ugly trick to cause getattr(f, "__class__") to fail)
528 class Foo(object):
529 __slots__ = ["__class__", "__dict__"]
530 def __init__(self):
531 self.bar = "wow"
532 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000533 self.assertNotIn("__repr__", dir(f))
534 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000535
536 # dir(obj_using __dir__)
537 class Foo(object):
538 def __dir__(self):
539 return ["kan", "ga", "roo"]
540 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000542
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500543 # dir(obj__dir__tuple)
544 class Foo(object):
545 def __dir__(self):
546 return ("b", "c", "a")
547 res = dir(Foo())
548 self.assertIsInstance(res, list)
549 self.assertTrue(res == ["a", "b", "c"])
550
551 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000552 class Foo(object):
553 def __dir__(self):
554 return 7
555 f = Foo()
556 self.assertRaises(TypeError, dir, f)
557
Collin Winter3eed7652007-08-14 17:53:54 +0000558 # dir(traceback)
559 try:
560 raise IndexError
561 except:
562 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
563
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500564 # test that object has a __dir__()
565 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000566
Walter Dörwald919497e2003-01-19 16:23:59 +0000567 def test_divmod(self):
568 self.assertEqual(divmod(12, 7), (1, 5))
569 self.assertEqual(divmod(-12, 7), (-2, 2))
570 self.assertEqual(divmod(12, -7), (-2, -2))
571 self.assertEqual(divmod(-12, -7), (1, -5))
572
Mark Dickinson5c2db372009-12-05 20:28:34 +0000573 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000574
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000575 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
576 (-3.25, 1.0, (-4.0, 0.75)),
577 (3.25, -1.0, (-4.0, -0.75)),
578 (-3.25, -1.0, (3.0, -0.25))]:
579 result = divmod(num, denom)
580 self.assertAlmostEqual(result[0], exp_result[0])
581 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000582
583 self.assertRaises(TypeError, divmod)
584
585 def test_eval(self):
586 self.assertEqual(eval('1+1'), 2)
587 self.assertEqual(eval(' 1+1\n'), 2)
588 globals = {'a': 1, 'b': 2}
589 locals = {'b': 200, 'c': 300}
590 self.assertEqual(eval('a', globals) , 1)
591 self.assertEqual(eval('a', globals, locals), 1)
592 self.assertEqual(eval('b', globals, locals), 200)
593 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000594 globals = {'a': 1, 'b': 2}
595 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000596 bom = b'\xef\xbb\xbf'
597 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000598 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000599 self.assertRaises(TypeError, eval)
600 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000601 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000602
Benjamin Peterson92722792012-12-15 12:51:05 -0500603 class X:
604 def __getitem__(self, key):
605 raise ValueError
606 self.assertRaises(ValueError, eval, "foo", {}, X())
607
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000608 def test_general_eval(self):
609 # Tests that general mappings can be used for the locals argument
610
611 class M:
612 "Test mapping interface versus possible calls from eval()."
613 def __getitem__(self, key):
614 if key == 'a':
615 return 12
616 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000617 def keys(self):
618 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000619
620 m = M()
621 g = globals()
622 self.assertEqual(eval('a', g, m), 12)
623 self.assertRaises(NameError, eval, 'b', g, m)
624 self.assertEqual(eval('dir()', g, m), list('xyz'))
625 self.assertEqual(eval('globals()', g, m), g)
626 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000627 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000628 class A:
629 "Non-mapping"
630 pass
631 m = A()
632 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000633
634 # Verify that dict subclasses work as well
635 class D(dict):
636 def __getitem__(self, key):
637 if key == 'a':
638 return 12
639 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000640 def keys(self):
641 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000642
643 d = D()
644 self.assertEqual(eval('a', g, d), 12)
645 self.assertRaises(NameError, eval, 'b', g, d)
646 self.assertEqual(eval('dir()', g, d), list('xyz'))
647 self.assertEqual(eval('globals()', g, d), g)
648 self.assertEqual(eval('locals()', g, d), d)
649
650 # Verify locals stores (used by list comps)
651 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000652 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000653
654 class SpreadSheet:
655 "Sample application showing nested, calculated lookups."
656 _cells = {}
657 def __setitem__(self, key, formula):
658 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000659 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000660 return eval(self._cells[key], globals(), self)
661
662 ss = SpreadSheet()
663 ss['a1'] = '5'
664 ss['a2'] = 'a1*6'
665 ss['a3'] = 'a2*7'
666 self.assertEqual(ss['a3'], 210)
667
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000668 # Verify that dir() catches a non-list returned by eval
669 # SF bug #1004669
670 class C:
671 def __getitem__(self, item):
672 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000673 def keys(self):
674 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000675 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
676
Georg Brandl7cae87c2006-09-06 06:51:57 +0000677 def test_exec(self):
678 g = {}
679 exec('z = 1', g)
680 if '__builtins__' in g:
681 del g['__builtins__']
682 self.assertEqual(g, {'z': 1})
683
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000684 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000685 if '__builtins__' in g:
686 del g['__builtins__']
687 self.assertEqual(g, {'z': 2})
688 g = {}
689 l = {}
690
Brett Cannon77628992010-03-20 20:59:33 +0000691 with check_warnings():
692 warnings.filterwarnings("ignore", "global statement",
693 module="<string>")
694 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000695 if '__builtins__' in g:
696 del g['__builtins__']
697 if '__builtins__' in l:
698 del l['__builtins__']
699 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
700
Victor Stinnerb0b22422012-04-19 00:57:45 +0200701 def test_exec_globals(self):
702 code = compile("print('Hello World!')", "", "exec")
703 # no builtin function
704 self.assertRaisesRegex(NameError, "name 'print' is not defined",
705 exec, code, {'__builtins__': {}})
706 # __builtins__ must be a mapping type
707 self.assertRaises(TypeError,
708 exec, code, {'__builtins__': 123})
709
710 # no __build_class__ function
711 code = compile("class A: pass", "", "exec")
712 self.assertRaisesRegex(NameError, "__build_class__ not found",
713 exec, code, {'__builtins__': {}})
714
715 class frozendict_error(Exception):
716 pass
717
718 class frozendict(dict):
719 def __setitem__(self, key, value):
720 raise frozendict_error("frozendict is readonly")
721
722 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400723 if isinstance(__builtins__, types.ModuleType):
724 frozen_builtins = frozendict(__builtins__.__dict__)
725 else:
726 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200727 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
728 self.assertRaises(frozendict_error,
729 exec, code, {'__builtins__': frozen_builtins})
730
731 # read-only globals
732 namespace = frozendict({})
733 code = compile("x=1", "test", "exec")
734 self.assertRaises(frozendict_error,
735 exec, code, namespace)
736
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000737 def test_exec_redirected(self):
738 savestdout = sys.stdout
739 sys.stdout = None # Whatever that cannot flush()
740 try:
741 # Used to raise SystemError('error return without exception set')
742 exec('a')
743 except NameError:
744 pass
745 finally:
746 sys.stdout = savestdout
747
Walter Dörwald919497e2003-01-19 16:23:59 +0000748 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000749 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
750 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
751 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
752 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
753 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 def identity(item):
755 return 1
756 filter(identity, Squares(5))
757 self.assertRaises(TypeError, filter)
758 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000759 def __getitem__(self, index):
760 if index<4:
761 return 42
762 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000763 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000764 def badfunc():
765 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000766 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000767
Walter Dörwaldbf517072003-01-27 15:57:14 +0000768 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000769 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
770 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
771 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000772
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000773 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200774 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
775 f1 = filter(filter_char, "abcdeabcde")
776 f2 = filter(filter_char, "abcdeabcde")
777 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000778
Walter Dörwald919497e2003-01-19 16:23:59 +0000779 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000780 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 self.assertRaises(TypeError, getattr, sys, 1)
782 self.assertRaises(TypeError, getattr, sys, 1, "foo")
783 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000784 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000785 # unicode surrogates are not encodable to the default encoding (utf8)
786 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000787
788 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000789 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 self.assertRaises(TypeError, hasattr, sys, 1)
791 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000792 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000793
Benjamin Peterson17689992010-08-24 03:26:23 +0000794 # Check that hasattr propagates all exceptions outside of
795 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000796 class A:
797 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000798 raise SystemExit
799 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000800 class B:
801 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000802 raise ValueError
803 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000804
Walter Dörwald919497e2003-01-19 16:23:59 +0000805 def test_hash(self):
806 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000807 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000808 self.assertEqual(hash(1), hash(1.0))
809 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000810 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000811 hash((0,1,2,3))
812 def f(): pass
813 self.assertRaises(TypeError, hash, [])
814 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000815 # Bug 1536021: Allow hash to return long objects
816 class X:
817 def __hash__(self):
818 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000819 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000820 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000821 def __hash__(self):
822 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000823 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000824
825 def test_hex(self):
826 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000827 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 self.assertRaises(TypeError, hex, {})
829
830 def test_id(self):
831 id(None)
832 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 id(1.0)
834 id('spam')
835 id((0,1,2,3))
836 id([0,1,2,3])
837 id({'spam': 1, 'eggs': 2, 'ham': 3})
838
Guido van Rossuma88a0332007-02-26 16:59:55 +0000839 # Test input() later, alphabetized as if it were raw_input
840
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 def test_iter(self):
842 self.assertRaises(TypeError, iter)
843 self.assertRaises(TypeError, iter, 42, 42)
844 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000845 for l in lists:
846 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000847 self.assertEqual(next(i), '1')
848 self.assertEqual(next(i), '2')
849 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000850
851 def test_isinstance(self):
852 class C:
853 pass
854 class D(C):
855 pass
856 class E:
857 pass
858 c = C()
859 d = D()
860 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000861 self.assertTrue(isinstance(c, C))
862 self.assertTrue(isinstance(d, C))
863 self.assertTrue(not isinstance(e, C))
864 self.assertTrue(not isinstance(c, D))
865 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000866 self.assertRaises(TypeError, isinstance, E, 'foo')
867 self.assertRaises(TypeError, isinstance)
868
869 def test_issubclass(self):
870 class C:
871 pass
872 class D(C):
873 pass
874 class E:
875 pass
876 c = C()
877 d = D()
878 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000879 self.assertTrue(issubclass(D, C))
880 self.assertTrue(issubclass(C, C))
881 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000882 self.assertRaises(TypeError, issubclass, 'foo', E)
883 self.assertRaises(TypeError, issubclass, E, 'foo')
884 self.assertRaises(TypeError, issubclass)
885
886 def test_len(self):
887 self.assertEqual(len('123'), 3)
888 self.assertEqual(len(()), 0)
889 self.assertEqual(len((1, 2, 3, 4)), 4)
890 self.assertEqual(len([1, 2, 3, 4]), 4)
891 self.assertEqual(len({}), 0)
892 self.assertEqual(len({'a':1, 'b': 2}), 2)
893 class BadSeq:
894 def __len__(self):
895 raise ValueError
896 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000897 class InvalidLen:
898 def __len__(self):
899 return None
900 self.assertRaises(TypeError, len, InvalidLen())
901 class FloatLen:
902 def __len__(self):
903 return 4.5
904 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300905 class NegativeLen:
906 def __len__(self):
907 return -10
908 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000909 class HugeLen:
910 def __len__(self):
911 return sys.maxsize + 1
912 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300913 class HugeNegativeLen:
914 def __len__(self):
915 return -sys.maxsize-10
916 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000917 class NoLenMethod(object): pass
918 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000919
Walter Dörwald919497e2003-01-19 16:23:59 +0000920 def test_map(self):
921 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000922 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000923 [1, 4, 9]
924 )
925 try:
926 from math import sqrt
927 except ImportError:
928 def sqrt(x):
929 return pow(x, 0.5)
930 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000931 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000932 [[4.0, 2.0], [9.0, 3.0]]
933 )
934 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000935 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000936 [10, 4, 6]
937 )
938
939 def plus(*v):
940 accu = 0
941 for i in v: accu = accu + i
942 return accu
943 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000944 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000945 [1, 3, 7]
946 )
947 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000948 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000949 [1+4, 3+9, 7+2]
950 )
951 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000952 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000953 [1+4+1, 3+9+1, 7+2+0]
954 )
955 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000956 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000957 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
958 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000959 def Max(a, b):
960 if a is None:
961 return b
962 if b is None:
963 return a
964 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000965 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000966 list(map(Max, Squares(3), Squares(2))),
967 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000968 )
969 self.assertRaises(TypeError, map)
970 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000971 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000972 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000973 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000974 yield None
975 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000976 def badfunc(x):
977 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000978 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000979
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000980 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200981 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
982 m1 = map(map_char, "Is this the real life?")
983 m2 = map(map_char, "Is this the real life?")
984 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000985
Walter Dörwald919497e2003-01-19 16:23:59 +0000986 def test_max(self):
987 self.assertEqual(max('123123'), '3')
988 self.assertEqual(max(1, 2, 3), 3)
989 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
990 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
991
Guido van Rossume2a383d2007-01-15 16:59:06 +0000992 self.assertEqual(max(1, 2, 3.0), 3.0)
993 self.assertEqual(max(1, 2.0, 3), 3)
994 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000995
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700996 self.assertRaises(TypeError, max)
997 self.assertRaises(TypeError, max, 42)
998 self.assertRaises(ValueError, max, ())
999 class BadSeq:
1000 def __getitem__(self, index):
1001 raise ValueError
1002 self.assertRaises(ValueError, max, BadSeq())
1003
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001004 for stmt in (
1005 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001006 "max(default=None)",
1007 "max(1, 2, default=None)", # require container for default
1008 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001009 "max(1, key=int)", # single arg not iterable
1010 "max(1, 2, keystone=int)", # wrong keyword
1011 "max(1, 2, key=int, abc=int)", # two many keywords
1012 "max(1, 2, key=1)", # keyfunc is not callable
1013 ):
Tim Peters7f061872004-12-07 21:17:46 +00001014 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001015 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001016 except TypeError:
1017 pass
1018 else:
1019 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001020
1021 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1022 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1023 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1024
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001025 self.assertEqual(max((), default=None), None) # zero elem iterable
1026 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1027 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1028
1029 self.assertEqual(max((), default=1, key=neg), 1)
1030 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1031
Alexander Marshalove22072f2018-07-24 10:58:21 +07001032 self.assertEqual(max((1, 2), key=None), 2)
1033
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001034 data = [random.randrange(200) for i in range(100)]
1035 keys = dict((elem, random.randrange(50)) for elem in data)
1036 f = keys.__getitem__
1037 self.assertEqual(max(data, key=f),
1038 sorted(reversed(data), key=f)[-1])
1039
Walter Dörwald919497e2003-01-19 16:23:59 +00001040 def test_min(self):
1041 self.assertEqual(min('123123'), '1')
1042 self.assertEqual(min(1, 2, 3), 1)
1043 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1044 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1045
Guido van Rossume2a383d2007-01-15 16:59:06 +00001046 self.assertEqual(min(1, 2, 3.0), 1)
1047 self.assertEqual(min(1, 2.0, 3), 1)
1048 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001049
1050 self.assertRaises(TypeError, min)
1051 self.assertRaises(TypeError, min, 42)
1052 self.assertRaises(ValueError, min, ())
1053 class BadSeq:
1054 def __getitem__(self, index):
1055 raise ValueError
1056 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001057
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001058 for stmt in (
1059 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001060 "min(default=None)",
1061 "min(1, 2, default=None)", # require container for default
1062 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001063 "min(1, key=int)", # single arg not iterable
1064 "min(1, 2, keystone=int)", # wrong keyword
1065 "min(1, 2, key=int, abc=int)", # two many keywords
1066 "min(1, 2, key=1)", # keyfunc is not callable
1067 ):
Tim Peters7f061872004-12-07 21:17:46 +00001068 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001069 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001070 except TypeError:
1071 pass
1072 else:
1073 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001074
1075 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1076 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1077 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1078
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001079 self.assertEqual(min((), default=None), None) # zero elem iterable
1080 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1081 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1082
1083 self.assertEqual(min((), default=1, key=neg), 1)
1084 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1085
Alexander Marshalove22072f2018-07-24 10:58:21 +07001086 self.assertEqual(min((1, 2), key=None), 1)
1087
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001088 data = [random.randrange(200) for i in range(100)]
1089 keys = dict((elem, random.randrange(50)) for elem in data)
1090 f = keys.__getitem__
1091 self.assertEqual(min(data, key=f),
1092 sorted(data, key=f)[0])
1093
Georg Brandla18af4e2007-04-21 15:47:16 +00001094 def test_next(self):
1095 it = iter(range(2))
1096 self.assertEqual(next(it), 0)
1097 self.assertEqual(next(it), 1)
1098 self.assertRaises(StopIteration, next, it)
1099 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001100 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001101
1102 class Iter(object):
1103 def __iter__(self):
1104 return self
1105 def __next__(self):
1106 raise StopIteration
1107
1108 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001110 self.assertRaises(StopIteration, next, it)
1111
1112 def gen():
1113 yield 1
1114 return
1115
1116 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001117 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001118 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001119 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001120
Walter Dörwald919497e2003-01-19 16:23:59 +00001121 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001122 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001123 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 self.assertRaises(TypeError, oct, ())
1125
1126 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001127 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001128 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001129 self.addCleanup(unlink, TESTFN)
1130 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001131 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001132 fp.write('The quick brown fox jumps over the lazy dog')
1133 fp.write('.\n')
1134 fp.write('Dear John\n')
1135 fp.write('XXX'*100)
1136 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001137
1138 def test_open(self):
1139 self.write_testfile()
1140 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001141 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1144 self.assertEqual(fp.readline(4), 'Dear')
1145 self.assertEqual(fp.readline(100), ' John\n')
1146 self.assertEqual(fp.read(300), 'XXX'*100)
1147 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001148
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001149 # embedded null bytes and characters
1150 self.assertRaises(ValueError, open, 'a\x00b')
1151 self.assertRaises(ValueError, open, b'a\x00b')
1152
Victor Stinner91106cd2017-12-13 12:29:09 +01001153 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001154 def test_open_default_encoding(self):
1155 old_environ = dict(os.environ)
1156 try:
1157 # try to get a user preferred encoding different than the current
1158 # locale encoding to check that open() uses the current locale
1159 # encoding and not the user preferred encoding
1160 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1161 if key in os.environ:
1162 del os.environ[key]
1163
1164 self.write_testfile()
1165 current_locale_encoding = locale.getpreferredencoding(False)
1166 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001167 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001168 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001169 finally:
1170 os.environ.clear()
1171 os.environ.update(old_environ)
1172
Victor Stinnerdaf45552013-08-28 00:53:59 +02001173 def test_open_non_inheritable(self):
1174 fileobj = open(__file__)
1175 with fileobj:
1176 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1177
Walter Dörwald919497e2003-01-19 16:23:59 +00001178 def test_ord(self):
1179 self.assertEqual(ord(' '), 32)
1180 self.assertEqual(ord('A'), 65)
1181 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001182 self.assertEqual(ord('\x80'), 128)
1183 self.assertEqual(ord('\xff'), 255)
1184
1185 self.assertEqual(ord(b' '), 32)
1186 self.assertEqual(ord(b'A'), 65)
1187 self.assertEqual(ord(b'a'), 97)
1188 self.assertEqual(ord(b'\x80'), 128)
1189 self.assertEqual(ord(b'\xff'), 255)
1190
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001191 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001193
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001194 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1195 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1196 self.assertEqual(ord("\U00010000"), 0x00010000)
1197 self.assertEqual(ord("\U00010001"), 0x00010001)
1198 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1199 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1200 self.assertEqual(ord("\U00100000"), 0x00100000)
1201 self.assertEqual(ord("\U00100001"), 0x00100001)
1202 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1203 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1204
Walter Dörwald919497e2003-01-19 16:23:59 +00001205 def test_pow(self):
1206 self.assertEqual(pow(0,0), 1)
1207 self.assertEqual(pow(0,1), 0)
1208 self.assertEqual(pow(1,0), 1)
1209 self.assertEqual(pow(1,1), 1)
1210
1211 self.assertEqual(pow(2,0), 1)
1212 self.assertEqual(pow(2,10), 1024)
1213 self.assertEqual(pow(2,20), 1024*1024)
1214 self.assertEqual(pow(2,30), 1024*1024*1024)
1215
1216 self.assertEqual(pow(-2,0), 1)
1217 self.assertEqual(pow(-2,1), -2)
1218 self.assertEqual(pow(-2,2), 4)
1219 self.assertEqual(pow(-2,3), -8)
1220
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 self.assertAlmostEqual(pow(0.,0), 1.)
1222 self.assertAlmostEqual(pow(0.,1), 0.)
1223 self.assertAlmostEqual(pow(1.,0), 1.)
1224 self.assertAlmostEqual(pow(1.,1), 1.)
1225
1226 self.assertAlmostEqual(pow(2.,0), 1.)
1227 self.assertAlmostEqual(pow(2.,10), 1024.)
1228 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1229 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1230
1231 self.assertAlmostEqual(pow(-2.,0), 1.)
1232 self.assertAlmostEqual(pow(-2.,1), -2.)
1233 self.assertAlmostEqual(pow(-2.,2), 4.)
1234 self.assertAlmostEqual(pow(-2.,3), -8.)
1235
Mark Dickinson5c2db372009-12-05 20:28:34 +00001236 for x in 2, 2.0:
1237 for y in 10, 10.0:
1238 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001239 if isinstance(x, float) or \
1240 isinstance(y, float) or \
1241 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001242 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001243 else:
1244 self.assertAlmostEqual(pow(x, y, z), 24.0)
1245
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001246 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1247 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1248
Mark Dickinsonc5299672019-06-02 10:24:06 +01001249 # See test_pow for additional tests for three-argument pow.
1250 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001251 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001252
1253 self.assertRaises(TypeError, pow)
1254
Miss Islington (bot)37bc9352019-09-21 01:22:29 -07001255 # Test passing in arguments as keywords.
1256 self.assertEqual(pow(0, exp=0), 1)
1257 self.assertEqual(pow(base=2, exp=4), 16)
1258 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1259 twopow = partial(pow, base=2)
1260 self.assertEqual(twopow(exp=5), 32)
1261 fifth_power = partial(pow, exp=5)
1262 self.assertEqual(fifth_power(2), 32)
1263 mod10 = partial(pow, mod=10)
1264 self.assertEqual(mod10(2, 6), 4)
1265 self.assertEqual(mod10(exp=6, base=2), 4)
1266
Guido van Rossuma88a0332007-02-26 16:59:55 +00001267 def test_input(self):
1268 self.write_testfile()
1269 fp = open(TESTFN, 'r')
1270 savestdin = sys.stdin
1271 savestdout = sys.stdout # Eats the echo
1272 try:
1273 sys.stdin = fp
1274 sys.stdout = BitBucket()
1275 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001276 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1277 self.assertEqual(input('testing\n'), 'Dear John')
1278
1279 # SF 1535165: don't segfault on closed stdin
1280 # sys.stdout must be a regular file for triggering
1281 sys.stdout = savestdout
1282 sys.stdin.close()
1283 self.assertRaises(ValueError, input)
1284
1285 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001286 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001287 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001288 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001289 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001290 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001291 self.assertRaises(EOFError, input)
1292
1293 del sys.stdout
1294 self.assertRaises(RuntimeError, input, 'prompt')
1295 del sys.stdin
1296 self.assertRaises(RuntimeError, input, 'prompt')
1297 finally:
1298 sys.stdin = savestdin
1299 sys.stdout = savestdout
1300 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001301
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001302 # test_int(): see test_int.py for tests of built-in function int().
1303
Walter Dörwald919497e2003-01-19 16:23:59 +00001304 def test_repr(self):
1305 self.assertEqual(repr(''), '\'\'')
1306 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001307 self.assertEqual(repr(()), '()')
1308 self.assertEqual(repr([]), '[]')
1309 self.assertEqual(repr({}), '{}')
1310 a = []
1311 a.append(a)
1312 self.assertEqual(repr(a), '[[...]]')
1313 a = {}
1314 a[0] = a
1315 self.assertEqual(repr(a), '{0: {...}}')
1316
1317 def test_round(self):
1318 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001319 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001320 self.assertEqual(round(1.0), 1.0)
1321 self.assertEqual(round(10.0), 10.0)
1322 self.assertEqual(round(1000000000.0), 1000000000.0)
1323 self.assertEqual(round(1e20), 1e20)
1324
1325 self.assertEqual(round(-1.0), -1.0)
1326 self.assertEqual(round(-10.0), -10.0)
1327 self.assertEqual(round(-1000000000.0), -1000000000.0)
1328 self.assertEqual(round(-1e20), -1e20)
1329
1330 self.assertEqual(round(0.1), 0.0)
1331 self.assertEqual(round(1.1), 1.0)
1332 self.assertEqual(round(10.1), 10.0)
1333 self.assertEqual(round(1000000000.1), 1000000000.0)
1334
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(0.9), 1.0)
1340 self.assertEqual(round(9.9), 10.0)
1341 self.assertEqual(round(999999999.9), 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(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001348 self.assertEqual(type(round(-8.0, -1)), float)
1349
1350 self.assertEqual(type(round(-8.0, 0)), float)
1351 self.assertEqual(type(round(-8.0, 1)), float)
1352
1353 # Check even / odd rounding behaviour
1354 self.assertEqual(round(5.5), 6)
1355 self.assertEqual(round(6.5), 6)
1356 self.assertEqual(round(-5.5), -6)
1357 self.assertEqual(round(-6.5), -6)
1358
1359 # Check behavior on ints
1360 self.assertEqual(round(0), 0)
1361 self.assertEqual(round(8), 8)
1362 self.assertEqual(round(-8), -8)
1363 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001364 self.assertEqual(type(round(-8, -1)), int)
1365 self.assertEqual(type(round(-8, 0)), int)
1366 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001367
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001368 # test new kwargs
1369 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1370
Walter Dörwald919497e2003-01-19 16:23:59 +00001371 self.assertRaises(TypeError, round)
1372
Alex Martelliae211f92007-08-22 23:21:33 +00001373 # test generic rounding delegation for reals
1374 class TestRound:
1375 def __round__(self):
1376 return 23
1377
1378 class TestNoRound:
1379 pass
1380
1381 self.assertEqual(round(TestRound()), 23)
1382
1383 self.assertRaises(TypeError, round, 1, 2, 3)
1384 self.assertRaises(TypeError, round, TestNoRound())
1385
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001386 t = TestNoRound()
1387 t.__round__ = lambda *args: args
1388 self.assertRaises(TypeError, round, t)
1389 self.assertRaises(TypeError, round, t, 0)
1390
Mark Dickinsonad731b92009-11-09 17:12:30 +00001391 # Some versions of glibc for alpha have a bug that affects
1392 # float -> integer rounding (floor, ceil, rint, round) for
1393 # values in the range [2**52, 2**53). See:
1394 #
1395 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1396 #
1397 # We skip this test on Linux/alpha if it would fail.
1398 linux_alpha = (platform.system().startswith('Linux') and
1399 platform.machine().startswith('alpha'))
1400 system_round_bug = round(5e15+1) != 5e15+1
1401 @unittest.skipIf(linux_alpha and system_round_bug,
1402 "test will fail; failure is probably due to a "
1403 "buggy system round function")
1404 def test_round_large(self):
1405 # Issue #1869: integral floats should remain unchanged
1406 self.assertEqual(round(5e15-1), 5e15-1)
1407 self.assertEqual(round(5e15), 5e15)
1408 self.assertEqual(round(5e15+1), 5e15+1)
1409 self.assertEqual(round(5e15+2), 5e15+2)
1410 self.assertEqual(round(5e15+3), 5e15+3)
1411
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001412 def test_bug_27936(self):
1413 # Verify that ndigits=None means the same as passing in no argument
1414 for x in [1234,
1415 1234.56,
1416 decimal.Decimal('1234.56'),
1417 fractions.Fraction(123456, 100)]:
1418 self.assertEqual(round(x, None), round(x))
1419 self.assertEqual(type(round(x, None)), type(round(x)))
1420
Walter Dörwald919497e2003-01-19 16:23:59 +00001421 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001422 setattr(sys, 'spam', 1)
1423 self.assertEqual(sys.spam, 1)
1424 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1425 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001426
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001427 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001428
Alex Martellia70b1912003-04-22 08:12:33 +00001429 def test_sum(self):
1430 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001431 self.assertEqual(sum(list(range(2,8))), 27)
1432 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001433 self.assertEqual(sum(Squares(10)), 285)
1434 self.assertEqual(sum(iter(Squares(10))), 285)
1435 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1436
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001437 self.assertEqual(sum(range(10), 1000), 1045)
1438 self.assertEqual(sum(range(10), start=1000), 1045)
1439
Alex Martellia70b1912003-04-22 08:12:33 +00001440 self.assertRaises(TypeError, sum)
1441 self.assertRaises(TypeError, sum, 42)
1442 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1443 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001444 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1445 values = [bytearray(b'a'), bytearray(b'b')]
1446 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001447 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1448 self.assertRaises(TypeError, sum, [{2:3}])
1449 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1450
1451 class BadSeq:
1452 def __getitem__(self, index):
1453 raise ValueError
1454 self.assertRaises(ValueError, sum, BadSeq())
1455
Mark Dickinson3a22b472009-10-17 21:48:16 +00001456 empty = []
1457 sum(([x] for x in range(10)), empty)
1458 self.assertEqual(empty, [])
1459
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 def test_type(self):
1461 self.assertEqual(type(''), type('123'))
1462 self.assertNotEqual(type(''), type(()))
1463
Guido van Rossumfee7b932005-01-16 00:21:28 +00001464 # We don't want self in vars(), so these are static methods
1465
1466 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001467 def get_vars_f0():
1468 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001469
Guido van Rossumfee7b932005-01-16 00:21:28 +00001470 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001471 def get_vars_f2():
1472 BuiltinTest.get_vars_f0()
1473 a = 1
1474 b = 2
1475 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001476
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001477 class C_get_vars(object):
1478 def getDict(self):
1479 return {'a':2}
1480 __dict__ = property(fget=getDict)
1481
Walter Dörwald919497e2003-01-19 16:23:59 +00001482 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001483 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001484 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001485 self.assertEqual(self.get_vars_f0(), {})
1486 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1487 self.assertRaises(TypeError, vars, 42, 42)
1488 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001489 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001490
1491 def test_zip(self):
1492 a = (1, 2, 3)
1493 b = (4, 5, 6)
1494 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001495 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001496 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001497 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001498 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001499 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001500 class I:
1501 def __getitem__(self, i):
1502 if i < 0 or i > 2: raise IndexError
1503 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001504 self.assertEqual(list(zip(a, I())), t)
1505 self.assertEqual(list(zip()), [])
1506 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001507 self.assertRaises(TypeError, zip, None)
1508 class G:
1509 pass
1510 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001511 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001512
1513 # Make sure zip doesn't try to allocate a billion elements for the
1514 # result list when one of its arguments doesn't say how long it is.
1515 # A MemoryError is the most likely failure mode.
1516 class SequenceWithoutALength:
1517 def __getitem__(self, i):
1518 if i == 5:
1519 raise IndexError
1520 else:
1521 return i
1522 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001523 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001524 list(enumerate(range(5)))
1525 )
1526
1527 class BadSeq:
1528 def __getitem__(self, i):
1529 if i == 5:
1530 raise ValueError
1531 else:
1532 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001533 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001534
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001535 def test_zip_pickle(self):
1536 a = (1, 2, 3)
1537 b = (4, 5, 6)
1538 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001539 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1540 z1 = zip(a, b)
1541 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001542
Miss Islington (bot)27f41862019-08-29 23:23:17 -07001543 def test_zip_bad_iterable(self):
1544 exception = TypeError()
1545
1546 class BadIterable:
1547 def __iter__(self):
1548 raise exception
1549
1550 with self.assertRaises(TypeError) as cm:
1551 zip(BadIterable())
1552
1553 self.assertIs(cm.exception, exception)
1554
Eric Smithe4d63172010-09-13 20:48:43 +00001555 def test_format(self):
1556 # Test the basic machinery of the format() builtin. Don't test
1557 # the specifics of the various formatters
1558 self.assertEqual(format(3, ''), '3')
1559
1560 # Returns some classes to use for various tests. There's
1561 # an old-style version, and a new-style version
1562 def classes_new():
1563 class A(object):
1564 def __init__(self, x):
1565 self.x = x
1566 def __format__(self, format_spec):
1567 return str(self.x) + format_spec
1568 class DerivedFromA(A):
1569 pass
1570
1571 class Simple(object): pass
1572 class DerivedFromSimple(Simple):
1573 def __init__(self, x):
1574 self.x = x
1575 def __format__(self, format_spec):
1576 return str(self.x) + format_spec
1577 class DerivedFromSimple2(DerivedFromSimple): pass
1578 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1579
1580 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1581 self.assertEqual(format(A(3), 'spec'), '3spec')
1582 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1583 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1584 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1585 '10abcdef')
1586
1587 class_test(*classes_new())
1588
1589 def empty_format_spec(value):
1590 # test that:
1591 # format(x, '') == str(x)
1592 # format(x) == str(x)
1593 self.assertEqual(format(value, ""), str(value))
1594 self.assertEqual(format(value), str(value))
1595
1596 # for builtin types, format(x, "") == str(x)
1597 empty_format_spec(17**13)
1598 empty_format_spec(1.0)
1599 empty_format_spec(3.1415e104)
1600 empty_format_spec(-3.1415e104)
1601 empty_format_spec(3.1415e-104)
1602 empty_format_spec(-3.1415e-104)
1603 empty_format_spec(object)
1604 empty_format_spec(None)
1605
1606 # TypeError because self.__format__ returns the wrong type
1607 class BadFormatResult:
1608 def __format__(self, format_spec):
1609 return 1.0
1610 self.assertRaises(TypeError, format, BadFormatResult(), "")
1611
1612 # TypeError because format_spec is not unicode or str
1613 self.assertRaises(TypeError, format, object(), 4)
1614 self.assertRaises(TypeError, format, object(), object())
1615
1616 # tests for object.__format__ really belong elsewhere, but
1617 # there's no good place to put them
1618 x = object().__format__('')
1619 self.assertTrue(x.startswith('<object object at'))
1620
1621 # first argument to object.__format__ must be string
1622 self.assertRaises(TypeError, object().__format__, 3)
1623 self.assertRaises(TypeError, object().__format__, object())
1624 self.assertRaises(TypeError, object().__format__, None)
1625
1626 # --------------------------------------------------------------------
1627 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001628 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001629 class A:
1630 def __format__(self, fmt_str):
1631 return format('', fmt_str)
1632
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001633 self.assertEqual(format(A()), '')
1634 self.assertEqual(format(A(), ''), '')
1635 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001636
1637 class B:
1638 pass
1639
1640 class C(object):
1641 pass
1642
1643 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001644 obj = cls()
1645 self.assertEqual(format(obj), str(obj))
1646 self.assertEqual(format(obj, ''), str(obj))
1647 with self.assertRaisesRegex(TypeError,
1648 r'\b%s\b' % re.escape(cls.__name__)):
1649 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001650 # --------------------------------------------------------------------
1651
1652 # make sure we can take a subclass of str as a format spec
1653 class DerivedFromStr(str): pass
1654 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1655
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001656 def test_bin(self):
1657 self.assertEqual(bin(0), '0b0')
1658 self.assertEqual(bin(1), '0b1')
1659 self.assertEqual(bin(-1), '-0b1')
1660 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1661 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1662 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1663 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1664
Georg Brandl953152f2009-07-22 12:03:59 +00001665 def test_bytearray_translate(self):
1666 x = bytearray(b"abc")
1667 self.assertRaises(ValueError, x.translate, b"1", 1)
1668 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1669
Miss Islington (bot)5c4ce3e2019-06-26 13:17:00 -07001670 def test_bytearray_extend_error(self):
1671 array = bytearray()
1672 bad_iter = map(int, "X")
1673 self.assertRaises(ValueError, array.extend, bad_iter)
1674
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001675 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001676 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001677 tp = type(const)
1678 self.assertIs(tp(), const)
1679 self.assertRaises(TypeError, tp, 1, 2)
1680 self.assertRaises(TypeError, tp, a=1, b=2)
1681
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001682
1683class TestBreakpoint(unittest.TestCase):
1684 def setUp(self):
1685 # These tests require a clean slate environment. For example, if the
1686 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1687 # will mess up these tests. Similarly for sys.breakpointhook.
1688 # Cleaning the slate here means you can't use breakpoint() to debug
1689 # these tests, but I think that's okay. Just use pdb.set_trace() if
1690 # you must.
1691 self.resources = ExitStack()
1692 self.addCleanup(self.resources.close)
1693 self.env = self.resources.enter_context(EnvironmentVarGuard())
1694 del self.env['PYTHONBREAKPOINT']
1695 self.resources.enter_context(
1696 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1697
1698 def test_breakpoint(self):
1699 with patch('pdb.set_trace') as mock:
1700 breakpoint()
1701 mock.assert_called_once()
1702
1703 def test_breakpoint_with_breakpointhook_set(self):
1704 my_breakpointhook = MagicMock()
1705 sys.breakpointhook = my_breakpointhook
1706 breakpoint()
1707 my_breakpointhook.assert_called_once_with()
1708
1709 def test_breakpoint_with_breakpointhook_reset(self):
1710 my_breakpointhook = MagicMock()
1711 sys.breakpointhook = my_breakpointhook
1712 breakpoint()
1713 my_breakpointhook.assert_called_once_with()
1714 # Reset the hook and it will not be called again.
1715 sys.breakpointhook = sys.__breakpointhook__
1716 with patch('pdb.set_trace') as mock:
1717 breakpoint()
1718 mock.assert_called_once_with()
1719 my_breakpointhook.assert_called_once_with()
1720
1721 def test_breakpoint_with_args_and_keywords(self):
1722 my_breakpointhook = MagicMock()
1723 sys.breakpointhook = my_breakpointhook
1724 breakpoint(1, 2, 3, four=4, five=5)
1725 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1726
1727 def test_breakpoint_with_passthru_error(self):
1728 def my_breakpointhook():
1729 pass
1730 sys.breakpointhook = my_breakpointhook
1731 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1732
1733 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1734 def test_envar_good_path_builtin(self):
1735 self.env['PYTHONBREAKPOINT'] = 'int'
1736 with patch('builtins.int') as mock:
1737 breakpoint('7')
1738 mock.assert_called_once_with('7')
1739
1740 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1741 def test_envar_good_path_other(self):
1742 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1743 with patch('sys.exit') as mock:
1744 breakpoint()
1745 mock.assert_called_once_with()
1746
1747 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1748 def test_envar_good_path_noop_0(self):
1749 self.env['PYTHONBREAKPOINT'] = '0'
1750 with patch('pdb.set_trace') as mock:
1751 breakpoint()
1752 mock.assert_not_called()
1753
1754 def test_envar_good_path_empty_string(self):
1755 # PYTHONBREAKPOINT='' is the same as it not being set.
1756 self.env['PYTHONBREAKPOINT'] = ''
1757 with patch('pdb.set_trace') as mock:
1758 breakpoint()
1759 mock.assert_called_once_with()
1760
1761 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1762 def test_envar_unimportable(self):
1763 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001764 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001765 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001766 'nosuchbuiltin',
1767 'nosuchmodule.nosuchcallable',
1768 ):
1769 with self.subTest(envar=envar):
1770 self.env['PYTHONBREAKPOINT'] = envar
1771 mock = self.resources.enter_context(patch('pdb.set_trace'))
1772 w = self.resources.enter_context(check_warnings(quiet=True))
1773 breakpoint()
1774 self.assertEqual(
1775 str(w.message),
1776 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1777 self.assertEqual(w.category, RuntimeWarning)
1778 mock.assert_not_called()
1779
1780 def test_envar_ignored_when_hook_is_set(self):
1781 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1782 with patch('sys.exit') as mock:
1783 sys.breakpointhook = int
1784 breakpoint()
1785 mock.assert_not_called()
1786
1787
Martin Panterc9a6ab52015-10-10 01:25:38 +00001788@unittest.skipUnless(pty, "the pty and signal modules must be available")
1789class PtyTests(unittest.TestCase):
1790 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1791 terminals in the test environment"""
1792
Martin Pantere44dba32015-10-10 05:27:15 +00001793 def run_child(self, child, terminal_input):
1794 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001795 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001796 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001797 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001798 os.close(r)
1799 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001800 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001801 raise
1802 if pid == 0:
1803 # Child
1804 try:
1805 # Make sure we don't get stuck if there's a problem
1806 signal.alarm(2)
1807 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001808 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001809 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001810 except:
1811 traceback.print_exc()
1812 finally:
1813 # We don't want to return to unittest...
1814 os._exit(0)
1815 # Parent
1816 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001817 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001818 # Get results from the pipe
1819 with open(r, "r") as rpipe:
1820 lines = []
1821 while True:
1822 line = rpipe.readline().strip()
1823 if line == "":
1824 # The other end was closed => the child exited
1825 break
1826 lines.append(line)
1827 # Check the result was got and corresponds to the user's terminal input
1828 if len(lines) != 2:
1829 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001830 # Beware of Linux raising EIO when the slave is closed
1831 child_output = bytearray()
1832 while True:
1833 try:
1834 chunk = os.read(fd, 3000)
1835 except OSError: # Assume EIO
1836 break
1837 if not chunk:
1838 break
1839 child_output.extend(chunk)
1840 os.close(fd)
1841 child_output = child_output.decode("ascii", "ignore")
1842 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1843 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001844 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001845
Victor Stinner3ca9f502017-08-09 23:08:22 +02001846 # Wait until the child process completes
1847 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001848
Martin Pantere44dba32015-10-10 05:27:15 +00001849 return lines
1850
1851 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1852 if not sys.stdin.isatty() or not sys.stdout.isatty():
1853 self.skipTest("stdin and stdout must be ttys")
1854 def child(wpipe):
1855 # Check the error handlers are accounted for
1856 if stdio_encoding:
1857 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1858 encoding=stdio_encoding,
1859 errors='surrogateescape')
1860 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1861 encoding=stdio_encoding,
1862 errors='replace')
1863 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1864 print(ascii(input(prompt)), file=wpipe)
1865 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001866 # Check we did exercise the GNU readline path
1867 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1868 if lines[0] != 'tty = True':
1869 self.skipTest("standard IO in should have been a tty")
1870 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1871 if stdio_encoding:
1872 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1873 else:
1874 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1875 self.assertEqual(input_result, expected)
1876
1877 def test_input_tty(self):
1878 # Test input() functionality when wired to a tty (the code path
1879 # is different and invokes GNU readline if available).
1880 self.check_input_tty("prompt", b"quux")
1881
1882 def test_input_tty_non_ascii(self):
1883 # Check stdin/stdout encoding is used when invoking GNU readline
1884 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1885
1886 def test_input_tty_non_ascii_unicode_errors(self):
1887 # Check stdin/stdout error handler is used when invoking GNU readline
1888 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1889
1890 def test_input_no_stdout_fileno(self):
1891 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1892 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001893 def child(wpipe):
1894 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1895 sys.stdout = io.StringIO() # Does not support fileno()
1896 input("prompt")
1897 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1898 lines = self.run_child(child, b"quux\r")
1899 expected = (
1900 "stdin.isatty(): True",
1901 "captured: 'prompt'",
1902 )
1903 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001904
Raymond Hettinger64958a12003-12-17 20:43:33 +00001905class TestSorted(unittest.TestCase):
1906
1907 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001908 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001909 copy = data[:]
1910 random.shuffle(copy)
1911 self.assertEqual(data, sorted(copy))
1912 self.assertNotEqual(data, copy)
1913
1914 data.reverse()
1915 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001916 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1917 self.assertNotEqual(data, copy)
1918 random.shuffle(copy)
1919 self.assertEqual(data, sorted(copy, reverse=1))
1920 self.assertNotEqual(data, copy)
1921
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001922 def test_bad_arguments(self):
1923 # Issue #29327: The first argument is positional-only.
1924 sorted([])
1925 with self.assertRaises(TypeError):
1926 sorted(iterable=[])
1927 # Other arguments are keyword-only
1928 sorted([], key=None)
1929 with self.assertRaises(TypeError):
1930 sorted([], None)
1931
Raymond Hettinger64958a12003-12-17 20:43:33 +00001932 def test_inputtypes(self):
1933 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001934 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001935 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001936 self.assertEqual(sorted(s), sorted(T(s)))
1937
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001938 s = ''.join(set(s)) # unique letters only
1939 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001940 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001941 self.assertEqual(sorted(s), sorted(T(s)))
1942
1943 def test_baddecorator(self):
1944 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1945 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1946
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001947
1948class ShutdownTest(unittest.TestCase):
1949
1950 def test_cleanup(self):
1951 # Issue #19255: builtins are still available at shutdown
1952 code = """if 1:
1953 import builtins
1954 import sys
1955
1956 class C:
1957 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001958 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001959 # Check that builtins still exist
1960 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001961 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001962
1963 c = C()
1964 # Make this module survive until builtins and sys are cleaned
1965 builtins.here = sys.modules[__name__]
1966 sys.here = sys.modules[__name__]
1967 # Create a reference loop so that this module needs to go
1968 # through a GC phase.
1969 here = sys.modules[__name__]
1970 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001971 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1972 # otherwise the codec may be unloaded before C.__del__() is called, and
1973 # so print("before") fails because the codec cannot be used to encode
1974 # "before" to sys.stdout.encoding. For example, on Windows,
1975 # sys.stdout.encoding is the OEM code page and these code pages are
1976 # implemented in Python
1977 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001978 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001979 self.assertEqual(["before", "after"], out.decode().splitlines())
1980
1981
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001982class TestType(unittest.TestCase):
1983 def test_new_type(self):
1984 A = type('A', (), {})
1985 self.assertEqual(A.__name__, 'A')
1986 self.assertEqual(A.__qualname__, 'A')
1987 self.assertEqual(A.__module__, __name__)
1988 self.assertEqual(A.__bases__, (object,))
1989 self.assertIs(A.__base__, object)
1990 x = A()
1991 self.assertIs(type(x), A)
1992 self.assertIs(x.__class__, A)
1993
1994 class B:
1995 def ham(self):
1996 return 'ham%d' % self
1997 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1998 self.assertEqual(C.__name__, 'C')
1999 self.assertEqual(C.__qualname__, 'C')
2000 self.assertEqual(C.__module__, __name__)
2001 self.assertEqual(C.__bases__, (B, int))
2002 self.assertIs(C.__base__, int)
2003 self.assertIn('spam', C.__dict__)
2004 self.assertNotIn('ham', C.__dict__)
2005 x = C(42)
2006 self.assertEqual(x, 42)
2007 self.assertIs(type(x), C)
2008 self.assertIs(x.__class__, C)
2009 self.assertEqual(x.ham(), 'ham42')
2010 self.assertEqual(x.spam(), 'spam42')
2011 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2012
Nick Coghland78448e2016-07-30 16:26:03 +10002013 def test_type_nokwargs(self):
2014 with self.assertRaises(TypeError):
2015 type('a', (), {}, x=5)
2016 with self.assertRaises(TypeError):
2017 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002018
2019 def test_type_name(self):
2020 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2021 with self.subTest(name=name):
2022 A = type(name, (), {})
2023 self.assertEqual(A.__name__, name)
2024 self.assertEqual(A.__qualname__, name)
2025 self.assertEqual(A.__module__, __name__)
2026 with self.assertRaises(ValueError):
2027 type('A\x00B', (), {})
2028 with self.assertRaises(ValueError):
2029 type('A\udcdcB', (), {})
2030 with self.assertRaises(TypeError):
2031 type(b'A', (), {})
2032
2033 C = type('C', (), {})
2034 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2035 with self.subTest(name=name):
2036 C.__name__ = name
2037 self.assertEqual(C.__name__, name)
2038 self.assertEqual(C.__qualname__, 'C')
2039 self.assertEqual(C.__module__, __name__)
2040
2041 A = type('C', (), {})
2042 with self.assertRaises(ValueError):
2043 A.__name__ = 'A\x00B'
2044 self.assertEqual(A.__name__, 'C')
2045 with self.assertRaises(ValueError):
2046 A.__name__ = 'A\udcdcB'
2047 self.assertEqual(A.__name__, 'C')
2048 with self.assertRaises(TypeError):
2049 A.__name__ = b'A'
2050 self.assertEqual(A.__name__, 'C')
2051
2052 def test_type_qualname(self):
2053 A = type('A', (), {'__qualname__': 'B.C'})
2054 self.assertEqual(A.__name__, 'A')
2055 self.assertEqual(A.__qualname__, 'B.C')
2056 self.assertEqual(A.__module__, __name__)
2057 with self.assertRaises(TypeError):
2058 type('A', (), {'__qualname__': b'B'})
2059 self.assertEqual(A.__qualname__, 'B.C')
2060
2061 A.__qualname__ = 'D.E'
2062 self.assertEqual(A.__name__, 'A')
2063 self.assertEqual(A.__qualname__, 'D.E')
2064 with self.assertRaises(TypeError):
2065 A.__qualname__ = b'B'
2066 self.assertEqual(A.__qualname__, 'D.E')
2067
2068 def test_type_doc(self):
2069 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2070 A = type('A', (), {'__doc__': doc})
2071 self.assertEqual(A.__doc__, doc)
2072 with self.assertRaises(UnicodeEncodeError):
2073 type('A', (), {'__doc__': 'x\udcdcy'})
2074
2075 A = type('A', (), {})
2076 self.assertEqual(A.__doc__, None)
2077 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2078 A.__doc__ = doc
2079 self.assertEqual(A.__doc__, doc)
2080
2081 def test_bad_args(self):
2082 with self.assertRaises(TypeError):
2083 type()
2084 with self.assertRaises(TypeError):
2085 type('A', ())
2086 with self.assertRaises(TypeError):
2087 type('A', (), {}, ())
2088 with self.assertRaises(TypeError):
2089 type('A', (), dict={})
2090 with self.assertRaises(TypeError):
2091 type('A', [], {})
2092 with self.assertRaises(TypeError):
2093 type('A', (), types.MappingProxyType({}))
2094 with self.assertRaises(TypeError):
2095 type('A', (None,), {})
2096 with self.assertRaises(TypeError):
2097 type('A', (bool,), {})
2098 with self.assertRaises(TypeError):
2099 type('A', (int, str), {})
2100
2101 def test_bad_slots(self):
2102 with self.assertRaises(TypeError):
2103 type('A', (), {'__slots__': b'x'})
2104 with self.assertRaises(TypeError):
2105 type('A', (int,), {'__slots__': 'x'})
2106 with self.assertRaises(TypeError):
2107 type('A', (), {'__slots__': ''})
2108 with self.assertRaises(TypeError):
2109 type('A', (), {'__slots__': '42'})
2110 with self.assertRaises(TypeError):
2111 type('A', (), {'__slots__': 'x\x00y'})
2112 with self.assertRaises(ValueError):
2113 type('A', (), {'__slots__': 'x', 'x': 0})
2114 with self.assertRaises(TypeError):
2115 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2116 with self.assertRaises(TypeError):
2117 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2118
2119 class B:
2120 pass
2121 with self.assertRaises(TypeError):
2122 type('A', (B,), {'__slots__': '__dict__'})
2123 with self.assertRaises(TypeError):
2124 type('A', (B,), {'__slots__': '__weakref__'})
2125
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002126 def test_namespace_order(self):
2127 # bpo-34320: namespace should preserve order
2128 od = collections.OrderedDict([('a', 1), ('b', 2)])
2129 od.move_to_end('a')
2130 expected = list(od.items())
2131
2132 C = type('C', (), od)
2133 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2134
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002135
Zachary Warea4b7a752013-11-24 01:19:09 -06002136def load_tests(loader, tests, pattern):
2137 from doctest import DocTestSuite
2138 tests.addTest(DocTestSuite(builtins))
2139 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002140
2141if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002142 unittest.main()