blob: 0d241587a869089784fd366929ea7c5962df60b9 [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:
393 a = 1'''
394 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700395 policy = maybe_get_event_loop_policy()
396 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400397 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700398 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 with self.assertRaises(
400 SyntaxError, msg=f"source={source} mode={mode}"):
401 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402
403 co = compile(source,
404 '?',
405 mode,
406 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
407
408 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400409 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700410
411 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 async_f = FunctionType(co, globals_)
414 asyncio.run(async_f())
415 self.assertEqual(globals_['a'], 1)
416
417 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400418 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700419 asyncio.run(eval(co, globals_))
420 self.assertEqual(globals_['a'], 1)
421 finally:
422 asyncio.set_event_loop_policy(policy)
423
Miss Islington (bot)f7e32fc2020-03-14 21:46:26 -0700424 def test_compile_top_level_await_invalid_cases(self):
425 # helper function just to check we can run top=level async-for
426 async def arange(n):
427 for i in range(n):
428 yield i
429
430 modes = ('single', 'exec')
431 code_samples = [
432 '''def f(): await arange(10)\n''',
433 '''def f(): [x async for x in arange(10)]\n''',
434 '''def f(): [await x async for x in arange(10)]\n''',
435 '''def f():
436 async for i in arange(1):
437 a = 1
438 ''',
439 '''def f():
440 async with asyncio.Lock() as l:
441 a = 1
442 '''
443 ]
444 policy = maybe_get_event_loop_policy()
445 try:
446 for mode, code_sample in product(modes, code_samples):
447 source = dedent(code_sample)
448 with self.assertRaises(
449 SyntaxError, msg=f"source={source} mode={mode}"):
450 compile(source, '?', mode)
451
452 with self.assertRaises(
453 SyntaxError, msg=f"source={source} mode={mode}"):
454 co = compile(source,
455 '?',
456 mode,
457 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
458 finally:
459 asyncio.set_event_loop_policy(policy)
460
461
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700462 def test_compile_async_generator(self):
463 """
464 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400465 make sure AsyncGenerators are still properly not marked with the
466 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700467 """
468 code = dedent("""async def ticker():
469 for i in range(10):
470 yield i
471 await asyncio.sleep(0)""")
472
473 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
474 glob = {}
475 exec(co, glob)
476 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
477
Walter Dörwald919497e2003-01-19 16:23:59 +0000478 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000479 sys.spam = 1
480 delattr(sys, 'spam')
481 self.assertRaises(TypeError, delattr)
482
483 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000484 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000485 self.assertRaises(TypeError, dir, 42, 42)
486
Georg Brandle32b4222007-03-10 22:13:27 +0000487 # dir() - local scope
488 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000489 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000490
491 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000492 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000493
494 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000495 class Foo(types.ModuleType):
496 __dict__ = 8
497 f = Foo("foo")
498 self.assertRaises(TypeError, dir, f)
499
500 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000501 self.assertIn("strip", dir(str))
502 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000503
504 # dir(obj)
505 class Foo(object):
506 def __init__(self):
507 self.x = 7
508 self.y = 8
509 self.z = 9
510 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000511 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000512
513 # dir(obj_no__dict__)
514 class Foo(object):
515 __slots__ = []
516 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000517 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000518
519 # dir(obj_no__class__with__dict__)
520 # (an ugly trick to cause getattr(f, "__class__") to fail)
521 class Foo(object):
522 __slots__ = ["__class__", "__dict__"]
523 def __init__(self):
524 self.bar = "wow"
525 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000526 self.assertNotIn("__repr__", dir(f))
527 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000528
529 # dir(obj_using __dir__)
530 class Foo(object):
531 def __dir__(self):
532 return ["kan", "ga", "roo"]
533 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000534 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000535
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500536 # dir(obj__dir__tuple)
537 class Foo(object):
538 def __dir__(self):
539 return ("b", "c", "a")
540 res = dir(Foo())
541 self.assertIsInstance(res, list)
542 self.assertTrue(res == ["a", "b", "c"])
543
544 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000545 class Foo(object):
546 def __dir__(self):
547 return 7
548 f = Foo()
549 self.assertRaises(TypeError, dir, f)
550
Collin Winter3eed7652007-08-14 17:53:54 +0000551 # dir(traceback)
552 try:
553 raise IndexError
554 except:
555 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
556
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500557 # test that object has a __dir__()
558 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000559
Walter Dörwald919497e2003-01-19 16:23:59 +0000560 def test_divmod(self):
561 self.assertEqual(divmod(12, 7), (1, 5))
562 self.assertEqual(divmod(-12, 7), (-2, 2))
563 self.assertEqual(divmod(12, -7), (-2, -2))
564 self.assertEqual(divmod(-12, -7), (1, -5))
565
Mark Dickinson5c2db372009-12-05 20:28:34 +0000566 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000567
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000568 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
569 (-3.25, 1.0, (-4.0, 0.75)),
570 (3.25, -1.0, (-4.0, -0.75)),
571 (-3.25, -1.0, (3.0, -0.25))]:
572 result = divmod(num, denom)
573 self.assertAlmostEqual(result[0], exp_result[0])
574 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000575
576 self.assertRaises(TypeError, divmod)
577
578 def test_eval(self):
579 self.assertEqual(eval('1+1'), 2)
580 self.assertEqual(eval(' 1+1\n'), 2)
581 globals = {'a': 1, 'b': 2}
582 locals = {'b': 200, 'c': 300}
583 self.assertEqual(eval('a', globals) , 1)
584 self.assertEqual(eval('a', globals, locals), 1)
585 self.assertEqual(eval('b', globals, locals), 200)
586 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000587 globals = {'a': 1, 'b': 2}
588 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000589 bom = b'\xef\xbb\xbf'
590 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000591 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000592 self.assertRaises(TypeError, eval)
593 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000594 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000595
Benjamin Peterson92722792012-12-15 12:51:05 -0500596 class X:
597 def __getitem__(self, key):
598 raise ValueError
599 self.assertRaises(ValueError, eval, "foo", {}, X())
600
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000601 def test_general_eval(self):
602 # Tests that general mappings can be used for the locals argument
603
604 class M:
605 "Test mapping interface versus possible calls from eval()."
606 def __getitem__(self, key):
607 if key == 'a':
608 return 12
609 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000610 def keys(self):
611 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000612
613 m = M()
614 g = globals()
615 self.assertEqual(eval('a', g, m), 12)
616 self.assertRaises(NameError, eval, 'b', g, m)
617 self.assertEqual(eval('dir()', g, m), list('xyz'))
618 self.assertEqual(eval('globals()', g, m), g)
619 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000620 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000621 class A:
622 "Non-mapping"
623 pass
624 m = A()
625 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000626
627 # Verify that dict subclasses work as well
628 class D(dict):
629 def __getitem__(self, key):
630 if key == 'a':
631 return 12
632 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000633 def keys(self):
634 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000635
636 d = D()
637 self.assertEqual(eval('a', g, d), 12)
638 self.assertRaises(NameError, eval, 'b', g, d)
639 self.assertEqual(eval('dir()', g, d), list('xyz'))
640 self.assertEqual(eval('globals()', g, d), g)
641 self.assertEqual(eval('locals()', g, d), d)
642
643 # Verify locals stores (used by list comps)
644 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000645 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000646
647 class SpreadSheet:
648 "Sample application showing nested, calculated lookups."
649 _cells = {}
650 def __setitem__(self, key, formula):
651 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000652 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000653 return eval(self._cells[key], globals(), self)
654
655 ss = SpreadSheet()
656 ss['a1'] = '5'
657 ss['a2'] = 'a1*6'
658 ss['a3'] = 'a2*7'
659 self.assertEqual(ss['a3'], 210)
660
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000661 # Verify that dir() catches a non-list returned by eval
662 # SF bug #1004669
663 class C:
664 def __getitem__(self, item):
665 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000666 def keys(self):
667 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000668 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
669
Georg Brandl7cae87c2006-09-06 06:51:57 +0000670 def test_exec(self):
671 g = {}
672 exec('z = 1', g)
673 if '__builtins__' in g:
674 del g['__builtins__']
675 self.assertEqual(g, {'z': 1})
676
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000677 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000678 if '__builtins__' in g:
679 del g['__builtins__']
680 self.assertEqual(g, {'z': 2})
681 g = {}
682 l = {}
683
Brett Cannon77628992010-03-20 20:59:33 +0000684 with check_warnings():
685 warnings.filterwarnings("ignore", "global statement",
686 module="<string>")
687 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000688 if '__builtins__' in g:
689 del g['__builtins__']
690 if '__builtins__' in l:
691 del l['__builtins__']
692 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
693
Victor Stinnerb0b22422012-04-19 00:57:45 +0200694 def test_exec_globals(self):
695 code = compile("print('Hello World!')", "", "exec")
696 # no builtin function
697 self.assertRaisesRegex(NameError, "name 'print' is not defined",
698 exec, code, {'__builtins__': {}})
699 # __builtins__ must be a mapping type
700 self.assertRaises(TypeError,
701 exec, code, {'__builtins__': 123})
702
703 # no __build_class__ function
704 code = compile("class A: pass", "", "exec")
705 self.assertRaisesRegex(NameError, "__build_class__ not found",
706 exec, code, {'__builtins__': {}})
707
708 class frozendict_error(Exception):
709 pass
710
711 class frozendict(dict):
712 def __setitem__(self, key, value):
713 raise frozendict_error("frozendict is readonly")
714
715 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400716 if isinstance(__builtins__, types.ModuleType):
717 frozen_builtins = frozendict(__builtins__.__dict__)
718 else:
719 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200720 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
721 self.assertRaises(frozendict_error,
722 exec, code, {'__builtins__': frozen_builtins})
723
724 # read-only globals
725 namespace = frozendict({})
726 code = compile("x=1", "test", "exec")
727 self.assertRaises(frozendict_error,
728 exec, code, namespace)
729
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000730 def test_exec_redirected(self):
731 savestdout = sys.stdout
732 sys.stdout = None # Whatever that cannot flush()
733 try:
734 # Used to raise SystemError('error return without exception set')
735 exec('a')
736 except NameError:
737 pass
738 finally:
739 sys.stdout = savestdout
740
Walter Dörwald919497e2003-01-19 16:23:59 +0000741 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000742 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
743 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
744 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
745 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
746 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000747 def identity(item):
748 return 1
749 filter(identity, Squares(5))
750 self.assertRaises(TypeError, filter)
751 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000752 def __getitem__(self, index):
753 if index<4:
754 return 42
755 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000756 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000757 def badfunc():
758 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000759 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000760
Walter Dörwaldbf517072003-01-27 15:57:14 +0000761 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000762 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
763 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
764 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000765
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000766 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200767 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
768 f1 = filter(filter_char, "abcdeabcde")
769 f2 = filter(filter_char, "abcdeabcde")
770 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000771
Walter Dörwald919497e2003-01-19 16:23:59 +0000772 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000773 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000774 self.assertRaises(TypeError, getattr, sys, 1)
775 self.assertRaises(TypeError, getattr, sys, 1, "foo")
776 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000777 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000778 # unicode surrogates are not encodable to the default encoding (utf8)
779 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000780
781 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000782 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000783 self.assertRaises(TypeError, hasattr, sys, 1)
784 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000785 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000786
Benjamin Peterson17689992010-08-24 03:26:23 +0000787 # Check that hasattr propagates all exceptions outside of
788 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000789 class A:
790 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000791 raise SystemExit
792 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000793 class B:
794 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000795 raise ValueError
796 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000797
Walter Dörwald919497e2003-01-19 16:23:59 +0000798 def test_hash(self):
799 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000800 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 self.assertEqual(hash(1), hash(1.0))
802 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000803 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 hash((0,1,2,3))
805 def f(): pass
806 self.assertRaises(TypeError, hash, [])
807 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000808 # Bug 1536021: Allow hash to return long objects
809 class X:
810 def __hash__(self):
811 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000812 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000813 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000814 def __hash__(self):
815 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000816 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000817
818 def test_hex(self):
819 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000820 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 self.assertRaises(TypeError, hex, {})
822
823 def test_id(self):
824 id(None)
825 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000826 id(1.0)
827 id('spam')
828 id((0,1,2,3))
829 id([0,1,2,3])
830 id({'spam': 1, 'eggs': 2, 'ham': 3})
831
Guido van Rossuma88a0332007-02-26 16:59:55 +0000832 # Test input() later, alphabetized as if it were raw_input
833
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 def test_iter(self):
835 self.assertRaises(TypeError, iter)
836 self.assertRaises(TypeError, iter, 42, 42)
837 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000838 for l in lists:
839 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000840 self.assertEqual(next(i), '1')
841 self.assertEqual(next(i), '2')
842 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000843
844 def test_isinstance(self):
845 class C:
846 pass
847 class D(C):
848 pass
849 class E:
850 pass
851 c = C()
852 d = D()
853 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000854 self.assertTrue(isinstance(c, C))
855 self.assertTrue(isinstance(d, C))
856 self.assertTrue(not isinstance(e, C))
857 self.assertTrue(not isinstance(c, D))
858 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000859 self.assertRaises(TypeError, isinstance, E, 'foo')
860 self.assertRaises(TypeError, isinstance)
861
862 def test_issubclass(self):
863 class C:
864 pass
865 class D(C):
866 pass
867 class E:
868 pass
869 c = C()
870 d = D()
871 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000872 self.assertTrue(issubclass(D, C))
873 self.assertTrue(issubclass(C, C))
874 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000875 self.assertRaises(TypeError, issubclass, 'foo', E)
876 self.assertRaises(TypeError, issubclass, E, 'foo')
877 self.assertRaises(TypeError, issubclass)
878
879 def test_len(self):
880 self.assertEqual(len('123'), 3)
881 self.assertEqual(len(()), 0)
882 self.assertEqual(len((1, 2, 3, 4)), 4)
883 self.assertEqual(len([1, 2, 3, 4]), 4)
884 self.assertEqual(len({}), 0)
885 self.assertEqual(len({'a':1, 'b': 2}), 2)
886 class BadSeq:
887 def __len__(self):
888 raise ValueError
889 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000890 class InvalidLen:
891 def __len__(self):
892 return None
893 self.assertRaises(TypeError, len, InvalidLen())
894 class FloatLen:
895 def __len__(self):
896 return 4.5
897 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300898 class NegativeLen:
899 def __len__(self):
900 return -10
901 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000902 class HugeLen:
903 def __len__(self):
904 return sys.maxsize + 1
905 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300906 class HugeNegativeLen:
907 def __len__(self):
908 return -sys.maxsize-10
909 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000910 class NoLenMethod(object): pass
911 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000912
Walter Dörwald919497e2003-01-19 16:23:59 +0000913 def test_map(self):
914 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000915 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000916 [1, 4, 9]
917 )
918 try:
919 from math import sqrt
920 except ImportError:
921 def sqrt(x):
922 return pow(x, 0.5)
923 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000924 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000925 [[4.0, 2.0], [9.0, 3.0]]
926 )
927 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000928 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000929 [10, 4, 6]
930 )
931
932 def plus(*v):
933 accu = 0
934 for i in v: accu = accu + i
935 return accu
936 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000937 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000938 [1, 3, 7]
939 )
940 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000941 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000942 [1+4, 3+9, 7+2]
943 )
944 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000945 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000946 [1+4+1, 3+9+1, 7+2+0]
947 )
948 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000949 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000950 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
951 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000952 def Max(a, b):
953 if a is None:
954 return b
955 if b is None:
956 return a
957 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000958 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000959 list(map(Max, Squares(3), Squares(2))),
960 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000961 )
962 self.assertRaises(TypeError, map)
963 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000964 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000965 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000966 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000967 yield None
968 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000969 def badfunc(x):
970 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000971 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000972
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000973 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200974 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
975 m1 = map(map_char, "Is this the real life?")
976 m2 = map(map_char, "Is this the real life?")
977 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000978
Walter Dörwald919497e2003-01-19 16:23:59 +0000979 def test_max(self):
980 self.assertEqual(max('123123'), '3')
981 self.assertEqual(max(1, 2, 3), 3)
982 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
983 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
984
Guido van Rossume2a383d2007-01-15 16:59:06 +0000985 self.assertEqual(max(1, 2, 3.0), 3.0)
986 self.assertEqual(max(1, 2.0, 3), 3)
987 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000988
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700989 self.assertRaises(TypeError, max)
990 self.assertRaises(TypeError, max, 42)
991 self.assertRaises(ValueError, max, ())
992 class BadSeq:
993 def __getitem__(self, index):
994 raise ValueError
995 self.assertRaises(ValueError, max, BadSeq())
996
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000997 for stmt in (
998 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700999 "max(default=None)",
1000 "max(1, 2, default=None)", # require container for default
1001 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001002 "max(1, key=int)", # single arg not iterable
1003 "max(1, 2, keystone=int)", # wrong keyword
1004 "max(1, 2, key=int, abc=int)", # two many keywords
1005 "max(1, 2, key=1)", # keyfunc is not callable
1006 ):
Tim Peters7f061872004-12-07 21:17:46 +00001007 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001008 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001009 except TypeError:
1010 pass
1011 else:
1012 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001013
1014 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1015 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1016 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1017
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001018 self.assertEqual(max((), default=None), None) # zero elem iterable
1019 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1020 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1021
1022 self.assertEqual(max((), default=1, key=neg), 1)
1023 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1024
Alexander Marshalove22072f2018-07-24 10:58:21 +07001025 self.assertEqual(max((1, 2), key=None), 2)
1026
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001027 data = [random.randrange(200) for i in range(100)]
1028 keys = dict((elem, random.randrange(50)) for elem in data)
1029 f = keys.__getitem__
1030 self.assertEqual(max(data, key=f),
1031 sorted(reversed(data), key=f)[-1])
1032
Walter Dörwald919497e2003-01-19 16:23:59 +00001033 def test_min(self):
1034 self.assertEqual(min('123123'), '1')
1035 self.assertEqual(min(1, 2, 3), 1)
1036 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1037 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1038
Guido van Rossume2a383d2007-01-15 16:59:06 +00001039 self.assertEqual(min(1, 2, 3.0), 1)
1040 self.assertEqual(min(1, 2.0, 3), 1)
1041 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001042
1043 self.assertRaises(TypeError, min)
1044 self.assertRaises(TypeError, min, 42)
1045 self.assertRaises(ValueError, min, ())
1046 class BadSeq:
1047 def __getitem__(self, index):
1048 raise ValueError
1049 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001050
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001051 for stmt in (
1052 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001053 "min(default=None)",
1054 "min(1, 2, default=None)", # require container for default
1055 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001056 "min(1, key=int)", # single arg not iterable
1057 "min(1, 2, keystone=int)", # wrong keyword
1058 "min(1, 2, key=int, abc=int)", # two many keywords
1059 "min(1, 2, key=1)", # keyfunc is not callable
1060 ):
Tim Peters7f061872004-12-07 21:17:46 +00001061 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001062 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001063 except TypeError:
1064 pass
1065 else:
1066 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001067
1068 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1069 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1070 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1071
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001072 self.assertEqual(min((), default=None), None) # zero elem iterable
1073 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1074 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1075
1076 self.assertEqual(min((), default=1, key=neg), 1)
1077 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1078
Alexander Marshalove22072f2018-07-24 10:58:21 +07001079 self.assertEqual(min((1, 2), key=None), 1)
1080
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001081 data = [random.randrange(200) for i in range(100)]
1082 keys = dict((elem, random.randrange(50)) for elem in data)
1083 f = keys.__getitem__
1084 self.assertEqual(min(data, key=f),
1085 sorted(data, key=f)[0])
1086
Georg Brandla18af4e2007-04-21 15:47:16 +00001087 def test_next(self):
1088 it = iter(range(2))
1089 self.assertEqual(next(it), 0)
1090 self.assertEqual(next(it), 1)
1091 self.assertRaises(StopIteration, next, it)
1092 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001093 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001094
1095 class Iter(object):
1096 def __iter__(self):
1097 return self
1098 def __next__(self):
1099 raise StopIteration
1100
1101 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001102 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001103 self.assertRaises(StopIteration, next, it)
1104
1105 def gen():
1106 yield 1
1107 return
1108
1109 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001110 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001111 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001112 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001113
Walter Dörwald919497e2003-01-19 16:23:59 +00001114 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001115 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001116 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001117 self.assertRaises(TypeError, oct, ())
1118
1119 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001120 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001121 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001122 self.addCleanup(unlink, TESTFN)
1123 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001125 fp.write('The quick brown fox jumps over the lazy dog')
1126 fp.write('.\n')
1127 fp.write('Dear John\n')
1128 fp.write('XXX'*100)
1129 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001130
1131 def test_open(self):
1132 self.write_testfile()
1133 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001134 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001136 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1137 self.assertEqual(fp.readline(4), 'Dear')
1138 self.assertEqual(fp.readline(100), ' John\n')
1139 self.assertEqual(fp.read(300), 'XXX'*100)
1140 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001141
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001142 # embedded null bytes and characters
1143 self.assertRaises(ValueError, open, 'a\x00b')
1144 self.assertRaises(ValueError, open, b'a\x00b')
1145
Victor Stinner91106cd2017-12-13 12:29:09 +01001146 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001147 def test_open_default_encoding(self):
1148 old_environ = dict(os.environ)
1149 try:
1150 # try to get a user preferred encoding different than the current
1151 # locale encoding to check that open() uses the current locale
1152 # encoding and not the user preferred encoding
1153 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1154 if key in os.environ:
1155 del os.environ[key]
1156
1157 self.write_testfile()
1158 current_locale_encoding = locale.getpreferredencoding(False)
1159 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001160 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001161 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001162 finally:
1163 os.environ.clear()
1164 os.environ.update(old_environ)
1165
Victor Stinnerdaf45552013-08-28 00:53:59 +02001166 def test_open_non_inheritable(self):
1167 fileobj = open(__file__)
1168 with fileobj:
1169 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1170
Walter Dörwald919497e2003-01-19 16:23:59 +00001171 def test_ord(self):
1172 self.assertEqual(ord(' '), 32)
1173 self.assertEqual(ord('A'), 65)
1174 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001175 self.assertEqual(ord('\x80'), 128)
1176 self.assertEqual(ord('\xff'), 255)
1177
1178 self.assertEqual(ord(b' '), 32)
1179 self.assertEqual(ord(b'A'), 65)
1180 self.assertEqual(ord(b'a'), 97)
1181 self.assertEqual(ord(b'\x80'), 128)
1182 self.assertEqual(ord(b'\xff'), 255)
1183
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001184 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001185 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001186
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001187 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1188 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1189 self.assertEqual(ord("\U00010000"), 0x00010000)
1190 self.assertEqual(ord("\U00010001"), 0x00010001)
1191 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1192 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1193 self.assertEqual(ord("\U00100000"), 0x00100000)
1194 self.assertEqual(ord("\U00100001"), 0x00100001)
1195 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1196 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1197
Walter Dörwald919497e2003-01-19 16:23:59 +00001198 def test_pow(self):
1199 self.assertEqual(pow(0,0), 1)
1200 self.assertEqual(pow(0,1), 0)
1201 self.assertEqual(pow(1,0), 1)
1202 self.assertEqual(pow(1,1), 1)
1203
1204 self.assertEqual(pow(2,0), 1)
1205 self.assertEqual(pow(2,10), 1024)
1206 self.assertEqual(pow(2,20), 1024*1024)
1207 self.assertEqual(pow(2,30), 1024*1024*1024)
1208
1209 self.assertEqual(pow(-2,0), 1)
1210 self.assertEqual(pow(-2,1), -2)
1211 self.assertEqual(pow(-2,2), 4)
1212 self.assertEqual(pow(-2,3), -8)
1213
Walter Dörwald919497e2003-01-19 16:23:59 +00001214 self.assertAlmostEqual(pow(0.,0), 1.)
1215 self.assertAlmostEqual(pow(0.,1), 0.)
1216 self.assertAlmostEqual(pow(1.,0), 1.)
1217 self.assertAlmostEqual(pow(1.,1), 1.)
1218
1219 self.assertAlmostEqual(pow(2.,0), 1.)
1220 self.assertAlmostEqual(pow(2.,10), 1024.)
1221 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1222 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1223
1224 self.assertAlmostEqual(pow(-2.,0), 1.)
1225 self.assertAlmostEqual(pow(-2.,1), -2.)
1226 self.assertAlmostEqual(pow(-2.,2), 4.)
1227 self.assertAlmostEqual(pow(-2.,3), -8.)
1228
Mark Dickinson5c2db372009-12-05 20:28:34 +00001229 for x in 2, 2.0:
1230 for y in 10, 10.0:
1231 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001232 if isinstance(x, float) or \
1233 isinstance(y, float) or \
1234 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001235 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001236 else:
1237 self.assertAlmostEqual(pow(x, y, z), 24.0)
1238
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001239 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1240 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1241
Mark Dickinsonc5299672019-06-02 10:24:06 +01001242 # See test_pow for additional tests for three-argument pow.
1243 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001244 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001245
1246 self.assertRaises(TypeError, pow)
1247
Miss Islington (bot)37bc9352019-09-21 01:22:29 -07001248 # Test passing in arguments as keywords.
1249 self.assertEqual(pow(0, exp=0), 1)
1250 self.assertEqual(pow(base=2, exp=4), 16)
1251 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1252 twopow = partial(pow, base=2)
1253 self.assertEqual(twopow(exp=5), 32)
1254 fifth_power = partial(pow, exp=5)
1255 self.assertEqual(fifth_power(2), 32)
1256 mod10 = partial(pow, mod=10)
1257 self.assertEqual(mod10(2, 6), 4)
1258 self.assertEqual(mod10(exp=6, base=2), 4)
1259
Guido van Rossuma88a0332007-02-26 16:59:55 +00001260 def test_input(self):
1261 self.write_testfile()
1262 fp = open(TESTFN, 'r')
1263 savestdin = sys.stdin
1264 savestdout = sys.stdout # Eats the echo
1265 try:
1266 sys.stdin = fp
1267 sys.stdout = BitBucket()
1268 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001269 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1270 self.assertEqual(input('testing\n'), 'Dear John')
1271
1272 # SF 1535165: don't segfault on closed stdin
1273 # sys.stdout must be a regular file for triggering
1274 sys.stdout = savestdout
1275 sys.stdin.close()
1276 self.assertRaises(ValueError, input)
1277
1278 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001279 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001280 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001281 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001282 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001283 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001284 self.assertRaises(EOFError, input)
1285
1286 del sys.stdout
1287 self.assertRaises(RuntimeError, input, 'prompt')
1288 del sys.stdin
1289 self.assertRaises(RuntimeError, input, 'prompt')
1290 finally:
1291 sys.stdin = savestdin
1292 sys.stdout = savestdout
1293 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001294
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001295 # test_int(): see test_int.py for tests of built-in function int().
1296
Walter Dörwald919497e2003-01-19 16:23:59 +00001297 def test_repr(self):
1298 self.assertEqual(repr(''), '\'\'')
1299 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001300 self.assertEqual(repr(()), '()')
1301 self.assertEqual(repr([]), '[]')
1302 self.assertEqual(repr({}), '{}')
1303 a = []
1304 a.append(a)
1305 self.assertEqual(repr(a), '[[...]]')
1306 a = {}
1307 a[0] = a
1308 self.assertEqual(repr(a), '{0: {...}}')
1309
1310 def test_round(self):
1311 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001312 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001313 self.assertEqual(round(1.0), 1.0)
1314 self.assertEqual(round(10.0), 10.0)
1315 self.assertEqual(round(1000000000.0), 1000000000.0)
1316 self.assertEqual(round(1e20), 1e20)
1317
1318 self.assertEqual(round(-1.0), -1.0)
1319 self.assertEqual(round(-10.0), -10.0)
1320 self.assertEqual(round(-1000000000.0), -1000000000.0)
1321 self.assertEqual(round(-1e20), -1e20)
1322
1323 self.assertEqual(round(0.1), 0.0)
1324 self.assertEqual(round(1.1), 1.0)
1325 self.assertEqual(round(10.1), 10.0)
1326 self.assertEqual(round(1000000000.1), 1000000000.0)
1327
1328 self.assertEqual(round(-1.1), -1.0)
1329 self.assertEqual(round(-10.1), -10.0)
1330 self.assertEqual(round(-1000000000.1), -1000000000.0)
1331
1332 self.assertEqual(round(0.9), 1.0)
1333 self.assertEqual(round(9.9), 10.0)
1334 self.assertEqual(round(999999999.9), 1000000000.0)
1335
1336 self.assertEqual(round(-0.9), -1.0)
1337 self.assertEqual(round(-9.9), -10.0)
1338 self.assertEqual(round(-999999999.9), -1000000000.0)
1339
1340 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001341 self.assertEqual(type(round(-8.0, -1)), float)
1342
1343 self.assertEqual(type(round(-8.0, 0)), float)
1344 self.assertEqual(type(round(-8.0, 1)), float)
1345
1346 # Check even / odd rounding behaviour
1347 self.assertEqual(round(5.5), 6)
1348 self.assertEqual(round(6.5), 6)
1349 self.assertEqual(round(-5.5), -6)
1350 self.assertEqual(round(-6.5), -6)
1351
1352 # Check behavior on ints
1353 self.assertEqual(round(0), 0)
1354 self.assertEqual(round(8), 8)
1355 self.assertEqual(round(-8), -8)
1356 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001357 self.assertEqual(type(round(-8, -1)), int)
1358 self.assertEqual(type(round(-8, 0)), int)
1359 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001360
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001361 # test new kwargs
1362 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1363
Walter Dörwald919497e2003-01-19 16:23:59 +00001364 self.assertRaises(TypeError, round)
1365
Alex Martelliae211f92007-08-22 23:21:33 +00001366 # test generic rounding delegation for reals
1367 class TestRound:
1368 def __round__(self):
1369 return 23
1370
1371 class TestNoRound:
1372 pass
1373
1374 self.assertEqual(round(TestRound()), 23)
1375
1376 self.assertRaises(TypeError, round, 1, 2, 3)
1377 self.assertRaises(TypeError, round, TestNoRound())
1378
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001379 t = TestNoRound()
1380 t.__round__ = lambda *args: args
1381 self.assertRaises(TypeError, round, t)
1382 self.assertRaises(TypeError, round, t, 0)
1383
Mark Dickinsonad731b92009-11-09 17:12:30 +00001384 # Some versions of glibc for alpha have a bug that affects
1385 # float -> integer rounding (floor, ceil, rint, round) for
1386 # values in the range [2**52, 2**53). See:
1387 #
1388 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1389 #
1390 # We skip this test on Linux/alpha if it would fail.
1391 linux_alpha = (platform.system().startswith('Linux') and
1392 platform.machine().startswith('alpha'))
1393 system_round_bug = round(5e15+1) != 5e15+1
1394 @unittest.skipIf(linux_alpha and system_round_bug,
1395 "test will fail; failure is probably due to a "
1396 "buggy system round function")
1397 def test_round_large(self):
1398 # Issue #1869: integral floats should remain unchanged
1399 self.assertEqual(round(5e15-1), 5e15-1)
1400 self.assertEqual(round(5e15), 5e15)
1401 self.assertEqual(round(5e15+1), 5e15+1)
1402 self.assertEqual(round(5e15+2), 5e15+2)
1403 self.assertEqual(round(5e15+3), 5e15+3)
1404
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001405 def test_bug_27936(self):
1406 # Verify that ndigits=None means the same as passing in no argument
1407 for x in [1234,
1408 1234.56,
1409 decimal.Decimal('1234.56'),
1410 fractions.Fraction(123456, 100)]:
1411 self.assertEqual(round(x, None), round(x))
1412 self.assertEqual(type(round(x, None)), type(round(x)))
1413
Walter Dörwald919497e2003-01-19 16:23:59 +00001414 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001415 setattr(sys, 'spam', 1)
1416 self.assertEqual(sys.spam, 1)
1417 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1418 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001419
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001420 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001421
Alex Martellia70b1912003-04-22 08:12:33 +00001422 def test_sum(self):
1423 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001424 self.assertEqual(sum(list(range(2,8))), 27)
1425 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001426 self.assertEqual(sum(Squares(10)), 285)
1427 self.assertEqual(sum(iter(Squares(10))), 285)
1428 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1429
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001430 self.assertEqual(sum(range(10), 1000), 1045)
1431 self.assertEqual(sum(range(10), start=1000), 1045)
1432
Alex Martellia70b1912003-04-22 08:12:33 +00001433 self.assertRaises(TypeError, sum)
1434 self.assertRaises(TypeError, sum, 42)
1435 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1436 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001437 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1438 values = [bytearray(b'a'), bytearray(b'b')]
1439 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001440 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1441 self.assertRaises(TypeError, sum, [{2:3}])
1442 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1443
1444 class BadSeq:
1445 def __getitem__(self, index):
1446 raise ValueError
1447 self.assertRaises(ValueError, sum, BadSeq())
1448
Mark Dickinson3a22b472009-10-17 21:48:16 +00001449 empty = []
1450 sum(([x] for x in range(10)), empty)
1451 self.assertEqual(empty, [])
1452
Walter Dörwald919497e2003-01-19 16:23:59 +00001453 def test_type(self):
1454 self.assertEqual(type(''), type('123'))
1455 self.assertNotEqual(type(''), type(()))
1456
Guido van Rossumfee7b932005-01-16 00:21:28 +00001457 # We don't want self in vars(), so these are static methods
1458
1459 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 def get_vars_f0():
1461 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001462
Guido van Rossumfee7b932005-01-16 00:21:28 +00001463 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001464 def get_vars_f2():
1465 BuiltinTest.get_vars_f0()
1466 a = 1
1467 b = 2
1468 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001469
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001470 class C_get_vars(object):
1471 def getDict(self):
1472 return {'a':2}
1473 __dict__ = property(fget=getDict)
1474
Walter Dörwald919497e2003-01-19 16:23:59 +00001475 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001476 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001477 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001478 self.assertEqual(self.get_vars_f0(), {})
1479 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1480 self.assertRaises(TypeError, vars, 42, 42)
1481 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001482 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001483
1484 def test_zip(self):
1485 a = (1, 2, 3)
1486 b = (4, 5, 6)
1487 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001488 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001489 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001490 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001491 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001492 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001493 class I:
1494 def __getitem__(self, i):
1495 if i < 0 or i > 2: raise IndexError
1496 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001497 self.assertEqual(list(zip(a, I())), t)
1498 self.assertEqual(list(zip()), [])
1499 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001500 self.assertRaises(TypeError, zip, None)
1501 class G:
1502 pass
1503 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001504 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001505
1506 # Make sure zip doesn't try to allocate a billion elements for the
1507 # result list when one of its arguments doesn't say how long it is.
1508 # A MemoryError is the most likely failure mode.
1509 class SequenceWithoutALength:
1510 def __getitem__(self, i):
1511 if i == 5:
1512 raise IndexError
1513 else:
1514 return i
1515 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001516 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001517 list(enumerate(range(5)))
1518 )
1519
1520 class BadSeq:
1521 def __getitem__(self, i):
1522 if i == 5:
1523 raise ValueError
1524 else:
1525 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001526 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001527
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001528 def test_zip_pickle(self):
1529 a = (1, 2, 3)
1530 b = (4, 5, 6)
1531 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001532 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1533 z1 = zip(a, b)
1534 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001535
Miss Islington (bot)27f41862019-08-29 23:23:17 -07001536 def test_zip_bad_iterable(self):
1537 exception = TypeError()
1538
1539 class BadIterable:
1540 def __iter__(self):
1541 raise exception
1542
1543 with self.assertRaises(TypeError) as cm:
1544 zip(BadIterable())
1545
1546 self.assertIs(cm.exception, exception)
1547
Eric Smithe4d63172010-09-13 20:48:43 +00001548 def test_format(self):
1549 # Test the basic machinery of the format() builtin. Don't test
1550 # the specifics of the various formatters
1551 self.assertEqual(format(3, ''), '3')
1552
1553 # Returns some classes to use for various tests. There's
1554 # an old-style version, and a new-style version
1555 def classes_new():
1556 class A(object):
1557 def __init__(self, x):
1558 self.x = x
1559 def __format__(self, format_spec):
1560 return str(self.x) + format_spec
1561 class DerivedFromA(A):
1562 pass
1563
1564 class Simple(object): pass
1565 class DerivedFromSimple(Simple):
1566 def __init__(self, x):
1567 self.x = x
1568 def __format__(self, format_spec):
1569 return str(self.x) + format_spec
1570 class DerivedFromSimple2(DerivedFromSimple): pass
1571 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1572
1573 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1574 self.assertEqual(format(A(3), 'spec'), '3spec')
1575 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1576 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1577 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1578 '10abcdef')
1579
1580 class_test(*classes_new())
1581
1582 def empty_format_spec(value):
1583 # test that:
1584 # format(x, '') == str(x)
1585 # format(x) == str(x)
1586 self.assertEqual(format(value, ""), str(value))
1587 self.assertEqual(format(value), str(value))
1588
1589 # for builtin types, format(x, "") == str(x)
1590 empty_format_spec(17**13)
1591 empty_format_spec(1.0)
1592 empty_format_spec(3.1415e104)
1593 empty_format_spec(-3.1415e104)
1594 empty_format_spec(3.1415e-104)
1595 empty_format_spec(-3.1415e-104)
1596 empty_format_spec(object)
1597 empty_format_spec(None)
1598
1599 # TypeError because self.__format__ returns the wrong type
1600 class BadFormatResult:
1601 def __format__(self, format_spec):
1602 return 1.0
1603 self.assertRaises(TypeError, format, BadFormatResult(), "")
1604
1605 # TypeError because format_spec is not unicode or str
1606 self.assertRaises(TypeError, format, object(), 4)
1607 self.assertRaises(TypeError, format, object(), object())
1608
1609 # tests for object.__format__ really belong elsewhere, but
1610 # there's no good place to put them
1611 x = object().__format__('')
1612 self.assertTrue(x.startswith('<object object at'))
1613
1614 # first argument to object.__format__ must be string
1615 self.assertRaises(TypeError, object().__format__, 3)
1616 self.assertRaises(TypeError, object().__format__, object())
1617 self.assertRaises(TypeError, object().__format__, None)
1618
1619 # --------------------------------------------------------------------
1620 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001621 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001622 class A:
1623 def __format__(self, fmt_str):
1624 return format('', fmt_str)
1625
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001626 self.assertEqual(format(A()), '')
1627 self.assertEqual(format(A(), ''), '')
1628 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001629
1630 class B:
1631 pass
1632
1633 class C(object):
1634 pass
1635
1636 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001637 obj = cls()
1638 self.assertEqual(format(obj), str(obj))
1639 self.assertEqual(format(obj, ''), str(obj))
1640 with self.assertRaisesRegex(TypeError,
1641 r'\b%s\b' % re.escape(cls.__name__)):
1642 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001643 # --------------------------------------------------------------------
1644
1645 # make sure we can take a subclass of str as a format spec
1646 class DerivedFromStr(str): pass
1647 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1648
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001649 def test_bin(self):
1650 self.assertEqual(bin(0), '0b0')
1651 self.assertEqual(bin(1), '0b1')
1652 self.assertEqual(bin(-1), '-0b1')
1653 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1654 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1655 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1656 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1657
Georg Brandl953152f2009-07-22 12:03:59 +00001658 def test_bytearray_translate(self):
1659 x = bytearray(b"abc")
1660 self.assertRaises(ValueError, x.translate, b"1", 1)
1661 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1662
Miss Islington (bot)5c4ce3e2019-06-26 13:17:00 -07001663 def test_bytearray_extend_error(self):
1664 array = bytearray()
1665 bad_iter = map(int, "X")
1666 self.assertRaises(ValueError, array.extend, bad_iter)
1667
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001668 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001669 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001670 tp = type(const)
1671 self.assertIs(tp(), const)
1672 self.assertRaises(TypeError, tp, 1, 2)
1673 self.assertRaises(TypeError, tp, a=1, b=2)
1674
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001675
1676class TestBreakpoint(unittest.TestCase):
1677 def setUp(self):
1678 # These tests require a clean slate environment. For example, if the
1679 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1680 # will mess up these tests. Similarly for sys.breakpointhook.
1681 # Cleaning the slate here means you can't use breakpoint() to debug
1682 # these tests, but I think that's okay. Just use pdb.set_trace() if
1683 # you must.
1684 self.resources = ExitStack()
1685 self.addCleanup(self.resources.close)
1686 self.env = self.resources.enter_context(EnvironmentVarGuard())
1687 del self.env['PYTHONBREAKPOINT']
1688 self.resources.enter_context(
1689 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1690
1691 def test_breakpoint(self):
1692 with patch('pdb.set_trace') as mock:
1693 breakpoint()
1694 mock.assert_called_once()
1695
1696 def test_breakpoint_with_breakpointhook_set(self):
1697 my_breakpointhook = MagicMock()
1698 sys.breakpointhook = my_breakpointhook
1699 breakpoint()
1700 my_breakpointhook.assert_called_once_with()
1701
1702 def test_breakpoint_with_breakpointhook_reset(self):
1703 my_breakpointhook = MagicMock()
1704 sys.breakpointhook = my_breakpointhook
1705 breakpoint()
1706 my_breakpointhook.assert_called_once_with()
1707 # Reset the hook and it will not be called again.
1708 sys.breakpointhook = sys.__breakpointhook__
1709 with patch('pdb.set_trace') as mock:
1710 breakpoint()
1711 mock.assert_called_once_with()
1712 my_breakpointhook.assert_called_once_with()
1713
1714 def test_breakpoint_with_args_and_keywords(self):
1715 my_breakpointhook = MagicMock()
1716 sys.breakpointhook = my_breakpointhook
1717 breakpoint(1, 2, 3, four=4, five=5)
1718 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1719
1720 def test_breakpoint_with_passthru_error(self):
1721 def my_breakpointhook():
1722 pass
1723 sys.breakpointhook = my_breakpointhook
1724 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1725
1726 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1727 def test_envar_good_path_builtin(self):
1728 self.env['PYTHONBREAKPOINT'] = 'int'
1729 with patch('builtins.int') as mock:
1730 breakpoint('7')
1731 mock.assert_called_once_with('7')
1732
1733 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1734 def test_envar_good_path_other(self):
1735 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1736 with patch('sys.exit') as mock:
1737 breakpoint()
1738 mock.assert_called_once_with()
1739
1740 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1741 def test_envar_good_path_noop_0(self):
1742 self.env['PYTHONBREAKPOINT'] = '0'
1743 with patch('pdb.set_trace') as mock:
1744 breakpoint()
1745 mock.assert_not_called()
1746
1747 def test_envar_good_path_empty_string(self):
1748 # PYTHONBREAKPOINT='' is the same as it not being set.
1749 self.env['PYTHONBREAKPOINT'] = ''
1750 with patch('pdb.set_trace') as mock:
1751 breakpoint()
1752 mock.assert_called_once_with()
1753
1754 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1755 def test_envar_unimportable(self):
1756 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001757 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001758 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001759 'nosuchbuiltin',
1760 'nosuchmodule.nosuchcallable',
1761 ):
1762 with self.subTest(envar=envar):
1763 self.env['PYTHONBREAKPOINT'] = envar
1764 mock = self.resources.enter_context(patch('pdb.set_trace'))
1765 w = self.resources.enter_context(check_warnings(quiet=True))
1766 breakpoint()
1767 self.assertEqual(
1768 str(w.message),
1769 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1770 self.assertEqual(w.category, RuntimeWarning)
1771 mock.assert_not_called()
1772
1773 def test_envar_ignored_when_hook_is_set(self):
1774 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1775 with patch('sys.exit') as mock:
1776 sys.breakpointhook = int
1777 breakpoint()
1778 mock.assert_not_called()
1779
1780
Martin Panterc9a6ab52015-10-10 01:25:38 +00001781@unittest.skipUnless(pty, "the pty and signal modules must be available")
1782class PtyTests(unittest.TestCase):
1783 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1784 terminals in the test environment"""
1785
Martin Pantere44dba32015-10-10 05:27:15 +00001786 def run_child(self, child, terminal_input):
1787 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001788 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001789 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001790 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001791 os.close(r)
1792 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001793 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001794 raise
1795 if pid == 0:
1796 # Child
1797 try:
1798 # Make sure we don't get stuck if there's a problem
1799 signal.alarm(2)
1800 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001801 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001802 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001803 except:
1804 traceback.print_exc()
1805 finally:
1806 # We don't want to return to unittest...
1807 os._exit(0)
1808 # Parent
1809 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001810 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001811 # Get results from the pipe
1812 with open(r, "r") as rpipe:
1813 lines = []
1814 while True:
1815 line = rpipe.readline().strip()
1816 if line == "":
1817 # The other end was closed => the child exited
1818 break
1819 lines.append(line)
1820 # Check the result was got and corresponds to the user's terminal input
1821 if len(lines) != 2:
1822 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001823 # Beware of Linux raising EIO when the slave is closed
1824 child_output = bytearray()
1825 while True:
1826 try:
1827 chunk = os.read(fd, 3000)
1828 except OSError: # Assume EIO
1829 break
1830 if not chunk:
1831 break
1832 child_output.extend(chunk)
1833 os.close(fd)
1834 child_output = child_output.decode("ascii", "ignore")
1835 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1836 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001837 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001838
Victor Stinner3ca9f502017-08-09 23:08:22 +02001839 # Wait until the child process completes
1840 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001841
Martin Pantere44dba32015-10-10 05:27:15 +00001842 return lines
1843
1844 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1845 if not sys.stdin.isatty() or not sys.stdout.isatty():
1846 self.skipTest("stdin and stdout must be ttys")
1847 def child(wpipe):
1848 # Check the error handlers are accounted for
1849 if stdio_encoding:
1850 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1851 encoding=stdio_encoding,
1852 errors='surrogateescape')
1853 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1854 encoding=stdio_encoding,
1855 errors='replace')
1856 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1857 print(ascii(input(prompt)), file=wpipe)
1858 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001859 # Check we did exercise the GNU readline path
1860 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1861 if lines[0] != 'tty = True':
1862 self.skipTest("standard IO in should have been a tty")
1863 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1864 if stdio_encoding:
1865 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1866 else:
1867 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1868 self.assertEqual(input_result, expected)
1869
1870 def test_input_tty(self):
1871 # Test input() functionality when wired to a tty (the code path
1872 # is different and invokes GNU readline if available).
1873 self.check_input_tty("prompt", b"quux")
1874
1875 def test_input_tty_non_ascii(self):
1876 # Check stdin/stdout encoding is used when invoking GNU readline
1877 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1878
1879 def test_input_tty_non_ascii_unicode_errors(self):
1880 # Check stdin/stdout error handler is used when invoking GNU readline
1881 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1882
1883 def test_input_no_stdout_fileno(self):
1884 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1885 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001886 def child(wpipe):
1887 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1888 sys.stdout = io.StringIO() # Does not support fileno()
1889 input("prompt")
1890 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1891 lines = self.run_child(child, b"quux\r")
1892 expected = (
1893 "stdin.isatty(): True",
1894 "captured: 'prompt'",
1895 )
1896 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001897
Raymond Hettinger64958a12003-12-17 20:43:33 +00001898class TestSorted(unittest.TestCase):
1899
1900 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001901 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001902 copy = data[:]
1903 random.shuffle(copy)
1904 self.assertEqual(data, sorted(copy))
1905 self.assertNotEqual(data, copy)
1906
1907 data.reverse()
1908 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001909 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1910 self.assertNotEqual(data, copy)
1911 random.shuffle(copy)
1912 self.assertEqual(data, sorted(copy, reverse=1))
1913 self.assertNotEqual(data, copy)
1914
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001915 def test_bad_arguments(self):
1916 # Issue #29327: The first argument is positional-only.
1917 sorted([])
1918 with self.assertRaises(TypeError):
1919 sorted(iterable=[])
1920 # Other arguments are keyword-only
1921 sorted([], key=None)
1922 with self.assertRaises(TypeError):
1923 sorted([], None)
1924
Raymond Hettinger64958a12003-12-17 20:43:33 +00001925 def test_inputtypes(self):
1926 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001927 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001928 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001929 self.assertEqual(sorted(s), sorted(T(s)))
1930
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001931 s = ''.join(set(s)) # unique letters only
1932 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001933 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001934 self.assertEqual(sorted(s), sorted(T(s)))
1935
1936 def test_baddecorator(self):
1937 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1938 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1939
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001940
1941class ShutdownTest(unittest.TestCase):
1942
1943 def test_cleanup(self):
1944 # Issue #19255: builtins are still available at shutdown
1945 code = """if 1:
1946 import builtins
1947 import sys
1948
1949 class C:
1950 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001951 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001952 # Check that builtins still exist
1953 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001954 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001955
1956 c = C()
1957 # Make this module survive until builtins and sys are cleaned
1958 builtins.here = sys.modules[__name__]
1959 sys.here = sys.modules[__name__]
1960 # Create a reference loop so that this module needs to go
1961 # through a GC phase.
1962 here = sys.modules[__name__]
1963 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001964 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1965 # otherwise the codec may be unloaded before C.__del__() is called, and
1966 # so print("before") fails because the codec cannot be used to encode
1967 # "before" to sys.stdout.encoding. For example, on Windows,
1968 # sys.stdout.encoding is the OEM code page and these code pages are
1969 # implemented in Python
1970 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001971 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001972 self.assertEqual(["before", "after"], out.decode().splitlines())
1973
1974
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001975class TestType(unittest.TestCase):
1976 def test_new_type(self):
1977 A = type('A', (), {})
1978 self.assertEqual(A.__name__, 'A')
1979 self.assertEqual(A.__qualname__, 'A')
1980 self.assertEqual(A.__module__, __name__)
1981 self.assertEqual(A.__bases__, (object,))
1982 self.assertIs(A.__base__, object)
1983 x = A()
1984 self.assertIs(type(x), A)
1985 self.assertIs(x.__class__, A)
1986
1987 class B:
1988 def ham(self):
1989 return 'ham%d' % self
1990 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1991 self.assertEqual(C.__name__, 'C')
1992 self.assertEqual(C.__qualname__, 'C')
1993 self.assertEqual(C.__module__, __name__)
1994 self.assertEqual(C.__bases__, (B, int))
1995 self.assertIs(C.__base__, int)
1996 self.assertIn('spam', C.__dict__)
1997 self.assertNotIn('ham', C.__dict__)
1998 x = C(42)
1999 self.assertEqual(x, 42)
2000 self.assertIs(type(x), C)
2001 self.assertIs(x.__class__, C)
2002 self.assertEqual(x.ham(), 'ham42')
2003 self.assertEqual(x.spam(), 'spam42')
2004 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2005
Nick Coghland78448e2016-07-30 16:26:03 +10002006 def test_type_nokwargs(self):
2007 with self.assertRaises(TypeError):
2008 type('a', (), {}, x=5)
2009 with self.assertRaises(TypeError):
2010 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002011
2012 def test_type_name(self):
2013 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2014 with self.subTest(name=name):
2015 A = type(name, (), {})
2016 self.assertEqual(A.__name__, name)
2017 self.assertEqual(A.__qualname__, name)
2018 self.assertEqual(A.__module__, __name__)
2019 with self.assertRaises(ValueError):
2020 type('A\x00B', (), {})
2021 with self.assertRaises(ValueError):
2022 type('A\udcdcB', (), {})
2023 with self.assertRaises(TypeError):
2024 type(b'A', (), {})
2025
2026 C = type('C', (), {})
2027 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2028 with self.subTest(name=name):
2029 C.__name__ = name
2030 self.assertEqual(C.__name__, name)
2031 self.assertEqual(C.__qualname__, 'C')
2032 self.assertEqual(C.__module__, __name__)
2033
2034 A = type('C', (), {})
2035 with self.assertRaises(ValueError):
2036 A.__name__ = 'A\x00B'
2037 self.assertEqual(A.__name__, 'C')
2038 with self.assertRaises(ValueError):
2039 A.__name__ = 'A\udcdcB'
2040 self.assertEqual(A.__name__, 'C')
2041 with self.assertRaises(TypeError):
2042 A.__name__ = b'A'
2043 self.assertEqual(A.__name__, 'C')
2044
2045 def test_type_qualname(self):
2046 A = type('A', (), {'__qualname__': 'B.C'})
2047 self.assertEqual(A.__name__, 'A')
2048 self.assertEqual(A.__qualname__, 'B.C')
2049 self.assertEqual(A.__module__, __name__)
2050 with self.assertRaises(TypeError):
2051 type('A', (), {'__qualname__': b'B'})
2052 self.assertEqual(A.__qualname__, 'B.C')
2053
2054 A.__qualname__ = 'D.E'
2055 self.assertEqual(A.__name__, 'A')
2056 self.assertEqual(A.__qualname__, 'D.E')
2057 with self.assertRaises(TypeError):
2058 A.__qualname__ = b'B'
2059 self.assertEqual(A.__qualname__, 'D.E')
2060
2061 def test_type_doc(self):
2062 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2063 A = type('A', (), {'__doc__': doc})
2064 self.assertEqual(A.__doc__, doc)
2065 with self.assertRaises(UnicodeEncodeError):
2066 type('A', (), {'__doc__': 'x\udcdcy'})
2067
2068 A = type('A', (), {})
2069 self.assertEqual(A.__doc__, None)
2070 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2071 A.__doc__ = doc
2072 self.assertEqual(A.__doc__, doc)
2073
2074 def test_bad_args(self):
2075 with self.assertRaises(TypeError):
2076 type()
2077 with self.assertRaises(TypeError):
2078 type('A', ())
2079 with self.assertRaises(TypeError):
2080 type('A', (), {}, ())
2081 with self.assertRaises(TypeError):
2082 type('A', (), dict={})
2083 with self.assertRaises(TypeError):
2084 type('A', [], {})
2085 with self.assertRaises(TypeError):
2086 type('A', (), types.MappingProxyType({}))
2087 with self.assertRaises(TypeError):
2088 type('A', (None,), {})
2089 with self.assertRaises(TypeError):
2090 type('A', (bool,), {})
2091 with self.assertRaises(TypeError):
2092 type('A', (int, str), {})
2093
2094 def test_bad_slots(self):
2095 with self.assertRaises(TypeError):
2096 type('A', (), {'__slots__': b'x'})
2097 with self.assertRaises(TypeError):
2098 type('A', (int,), {'__slots__': 'x'})
2099 with self.assertRaises(TypeError):
2100 type('A', (), {'__slots__': ''})
2101 with self.assertRaises(TypeError):
2102 type('A', (), {'__slots__': '42'})
2103 with self.assertRaises(TypeError):
2104 type('A', (), {'__slots__': 'x\x00y'})
2105 with self.assertRaises(ValueError):
2106 type('A', (), {'__slots__': 'x', 'x': 0})
2107 with self.assertRaises(TypeError):
2108 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2109 with self.assertRaises(TypeError):
2110 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2111
2112 class B:
2113 pass
2114 with self.assertRaises(TypeError):
2115 type('A', (B,), {'__slots__': '__dict__'})
2116 with self.assertRaises(TypeError):
2117 type('A', (B,), {'__slots__': '__weakref__'})
2118
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002119 def test_namespace_order(self):
2120 # bpo-34320: namespace should preserve order
2121 od = collections.OrderedDict([('a', 1), ('b', 2)])
2122 od.move_to_end('a')
2123 expected = list(od.items())
2124
2125 C = type('C', (), od)
2126 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2127
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002128
Zachary Warea4b7a752013-11-24 01:19:09 -06002129def load_tests(loader, tests, pattern):
2130 from doctest import DocTestSuite
2131 tests.addTest(DocTestSuite(builtins))
2132 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002133
2134if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002135 unittest.main()