blob: 6a88454289d3472331d8beb1e0df57cf577c4010 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004import asyncio
Victor Stinnerf86a5e82012-06-05 13:43:22 +02005import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00006import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07007import decimal
8import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00009import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010011import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020013import platform
14import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020015import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020016import sys
17import traceback
18import types
19import unittest
20import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040021from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040022from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070023from inspect import CO_COROUTINE
24from itertools import product
25from textwrap import dedent
26from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020027from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040028from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070029 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
30 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030031from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040032from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010033try:
Antoine Pitrou772add72011-11-06 02:37:42 +010034 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010035except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010036 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000037
Guido van Rossum3bead091992-01-27 17:00:37 +000038
Walter Dörwald919497e2003-01-19 16:23:59 +000039class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000040
Walter Dörwald919497e2003-01-19 16:23:59 +000041 def __init__(self, max):
42 self.max = max
43 self.sofar = []
44
45 def __len__(self): return len(self.sofar)
46
47 def __getitem__(self, i):
48 if not 0 <= i < self.max: raise IndexError
49 n = len(self.sofar)
50 while n <= i:
51 self.sofar.append(n*n)
52 n += 1
53 return self.sofar[i]
54
55class StrSquares:
56
57 def __init__(self, max):
58 self.max = max
59 self.sofar = []
60
61 def __len__(self):
62 return len(self.sofar)
63
64 def __getitem__(self, i):
65 if not 0 <= i < self.max:
66 raise IndexError
67 n = len(self.sofar)
68 while n <= i:
69 self.sofar.append(str(n*n))
70 n += 1
71 return self.sofar[i]
72
73class BitBucket:
74 def write(self, line):
75 pass
76
Facundo Batista2336bdd2008-01-19 19:12:01 +000077test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000078 ('0', 0),
79 ('1', 1),
80 ('9', 9),
81 ('10', 10),
82 ('99', 99),
83 ('100', 100),
84 ('314', 314),
85 (' 314', 314),
86 ('314 ', 314),
87 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000088 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000089 (' 1x', ValueError),
90 (' 1 ', 1),
91 (' 1\02 ', ValueError),
92 ('', ValueError),
93 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000094 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040095 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000096 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000097]
98
Facundo Batista2336bdd2008-01-19 19:12:01 +000099test_conv_sign = [
100 ('0', 0),
101 ('1', 1),
102 ('9', 9),
103 ('10', 10),
104 ('99', 99),
105 ('100', 100),
106 ('314', 314),
107 (' 314', ValueError),
108 ('314 ', 314),
109 (' \t\t 314 \t\t ', ValueError),
110 (repr(sys.maxsize), sys.maxsize),
111 (' 1x', ValueError),
112 (' 1 ', ValueError),
113 (' 1\02 ', ValueError),
114 ('', ValueError),
115 (' ', ValueError),
116 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400117 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000118 (chr(0x200), ValueError),
119]
120
Raymond Hettinger96229b12005-03-11 06:49:40 +0000121class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000122 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123 raise RuntimeError
124
125class TestFailingIter:
126 def __iter__(self):
127 raise RuntimeError
128
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000129def filter_char(arg):
130 return ord(arg) > ord("d")
131
132def map_char(arg):
133 return chr(ord(arg)+1)
134
Walter Dörwald919497e2003-01-19 16:23:59 +0000135class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000136 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200137 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000138 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200139 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000140 it = pickle.loads(d)
141 self.assertEqual(type(itorg), type(it))
142 self.assertEqual(list(it), seq)
143
144 #test the iterator after dropping one from it
145 it = pickle.loads(d)
146 try:
147 next(it)
148 except StopIteration:
149 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200150 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000151 it = pickle.loads(d)
152 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000153
154 def test_import(self):
155 __import__('sys')
156 __import__('time')
157 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000158 __import__(name='sys')
159 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 self.assertRaises(ImportError, __import__, 'spamspam')
161 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000162 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000163 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000164 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100165 with self.assertWarns(ImportWarning):
166 self.assertRaises(ImportError, __import__, '',
167 {'__package__': None, '__spec__': None, '__name__': '__main__'},
168 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300169 # embedded null character
170 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000171
172 def test_abs(self):
173 # int
174 self.assertEqual(abs(0), 0)
175 self.assertEqual(abs(1234), 1234)
176 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000177 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000178 # float
179 self.assertEqual(abs(0.0), 0.0)
180 self.assertEqual(abs(3.14), 3.14)
181 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 # str
183 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000184 # bool
185 self.assertEqual(abs(True), 1)
186 self.assertEqual(abs(False), 0)
187 # other
188 self.assertRaises(TypeError, abs)
189 self.assertRaises(TypeError, abs, None)
190 class AbsClass(object):
191 def __abs__(self):
192 return -5
193 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000194
Raymond Hettinger96229b12005-03-11 06:49:40 +0000195 def test_all(self):
196 self.assertEqual(all([2, 4, 6]), True)
197 self.assertEqual(all([2, None, 6]), False)
198 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
199 self.assertRaises(RuntimeError, all, TestFailingIter())
200 self.assertRaises(TypeError, all, 10) # Non-iterable
201 self.assertRaises(TypeError, all) # No args
202 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
203 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200204 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000205 S = [50, 60]
206 self.assertEqual(all(x > 42 for x in S), True)
207 S = [50, 40, 60]
208 self.assertEqual(all(x > 42 for x in S), False)
209
210 def test_any(self):
211 self.assertEqual(any([None, None, None]), False)
212 self.assertEqual(any([None, 4, None]), True)
213 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500214 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000215 self.assertRaises(TypeError, any, 10) # Non-iterable
216 self.assertRaises(TypeError, any) # No args
217 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
218 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200219 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000220 S = [40, 60, 30]
221 self.assertEqual(any(x > 42 for x in S), True)
222 S = [10, 20, 30]
223 self.assertEqual(any(x > 42 for x in S), False)
224
Georg Brandl559e5d72008-06-11 18:37:52 +0000225 def test_ascii(self):
226 self.assertEqual(ascii(''), '\'\'')
227 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000228 self.assertEqual(ascii(()), '()')
229 self.assertEqual(ascii([]), '[]')
230 self.assertEqual(ascii({}), '{}')
231 a = []
232 a.append(a)
233 self.assertEqual(ascii(a), '[[...]]')
234 a = {}
235 a[0] = a
236 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000237 # Advanced checks for unicode strings
238 def _check_uni(s):
239 self.assertEqual(ascii(s), repr(s))
240 _check_uni("'")
241 _check_uni('"')
242 _check_uni('"\'')
243 _check_uni('\0')
244 _check_uni('\r\n\t .')
245 # Unprintable non-ASCII characters
246 _check_uni('\x85')
247 _check_uni('\u1fff')
248 _check_uni('\U00012fff')
249 # Lone surrogates
250 _check_uni('\ud800')
251 _check_uni('\udfff')
252 # Issue #9804: surrogates should be joined even for printable
253 # wide characters (UCS-2 builds).
254 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
255 # All together
256 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
257 self.assertEqual(ascii(s),
258 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000259
Thomas Wouters89f507f2006-12-13 04:49:30 +0000260 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000261 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000262 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000263 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000264
Walter Dörwald919497e2003-01-19 16:23:59 +0000265 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000266 self.assertTrue(callable(len))
267 self.assertFalse(callable("a"))
268 self.assertTrue(callable(callable))
269 self.assertTrue(callable(lambda x, y: x + y))
270 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000271 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000272 self.assertTrue(callable(f))
273
274 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000276 self.assertTrue(callable(C1))
277 c = C1()
278 self.assertTrue(callable(c.meth))
279 self.assertFalse(callable(c))
280
281 # __call__ is looked up on the class, not the instance
282 c.__call__ = None
283 self.assertFalse(callable(c))
284 c.__call__ = lambda self: 0
285 self.assertFalse(callable(c))
286 del c.__call__
287 self.assertFalse(callable(c))
288
289 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000290 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000291 c2 = C2()
292 self.assertTrue(callable(c2))
293 c2.__call__ = None
294 self.assertTrue(callable(c2))
295 class C3(C2): pass
296 c3 = C3()
297 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000298
299 def test_chr(self):
300 self.assertEqual(chr(32), ' ')
301 self.assertEqual(chr(65), 'A')
302 self.assertEqual(chr(97), 'a')
303 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000304 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000305 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300306 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000307 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000308 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
309 self.assertEqual(chr(0x00010000), "\U00010000")
310 self.assertEqual(chr(0x00010001), "\U00010001")
311 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
312 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
313 self.assertEqual(chr(0x00100000), "\U00100000")
314 self.assertEqual(chr(0x00100001), "\U00100001")
315 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
316 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
317 self.assertRaises(ValueError, chr, -1)
318 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000319 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000320
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000321 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000322 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000323
Walter Dörwald919497e2003-01-19 16:23:59 +0000324 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000325 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000326 bom = b'\xef\xbb\xbf'
327 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300329 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
330 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000331 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
334 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300335 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
337 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000338 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300339 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000340 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000341
Georg Brandl8334fd92010-12-04 10:26:46 +0000342 # test the optimize argument
343
344 codestr = '''def f():
345 """doc"""
diana543386b2017-10-03 10:46:56 -0600346 debug_enabled = False
347 if __debug__:
348 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000349 try:
350 assert False
351 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200352 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000353 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200354 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000355 '''
356 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200357 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
358 (0, True, 'doc', True, True),
359 (1, False, 'doc', False, False),
360 (2, False, None, False, False)]
361 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000362 # test both direct compilation and compilation via AST
363 codeobjs = []
364 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
365 tree = ast.parse(codestr)
366 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
367 for code in codeobjs:
368 ns = {}
369 exec(code, ns)
370 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200371 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000372
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700373 def test_compile_top_level_await(self):
374 """Test whether code some top level await can be compiled.
375
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400376 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
377 set, and make sure the generated code object has the CO_COROUTINE flag
378 set in order to execute it with `await eval(.....)` instead of exec,
379 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700380 """
381
382 # helper function just to check we can run top=level async-for
383 async def arange(n):
384 for i in range(n):
385 yield i
386
387 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400388 code_samples = [
389 '''a = await asyncio.sleep(0, result=1)''',
390 '''async for i in arange(1):
391 a = 1''',
392 '''async with asyncio.Lock() as l:
393 a = 1'''
394 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700395 policy = maybe_get_event_loop_policy()
396 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400397 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700398 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 with self.assertRaises(
400 SyntaxError, msg=f"source={source} mode={mode}"):
401 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700402
403 co = compile(source,
404 '?',
405 mode,
406 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
407
408 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400409 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700410
411 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 async_f = FunctionType(co, globals_)
414 asyncio.run(async_f())
415 self.assertEqual(globals_['a'], 1)
416
417 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400418 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700419 asyncio.run(eval(co, globals_))
420 self.assertEqual(globals_['a'], 1)
421 finally:
422 asyncio.set_event_loop_policy(policy)
423
424 def test_compile_async_generator(self):
425 """
426 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400427 make sure AsyncGenerators are still properly not marked with the
428 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700429 """
430 code = dedent("""async def ticker():
431 for i in range(10):
432 yield i
433 await asyncio.sleep(0)""")
434
435 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
436 glob = {}
437 exec(co, glob)
438 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
439
Walter Dörwald919497e2003-01-19 16:23:59 +0000440 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000441 sys.spam = 1
442 delattr(sys, 'spam')
443 self.assertRaises(TypeError, delattr)
444
445 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000446 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000447 self.assertRaises(TypeError, dir, 42, 42)
448
Georg Brandle32b4222007-03-10 22:13:27 +0000449 # dir() - local scope
450 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000451 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000452
453 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000454 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000455
456 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000457 class Foo(types.ModuleType):
458 __dict__ = 8
459 f = Foo("foo")
460 self.assertRaises(TypeError, dir, f)
461
462 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000463 self.assertIn("strip", dir(str))
464 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000465
466 # dir(obj)
467 class Foo(object):
468 def __init__(self):
469 self.x = 7
470 self.y = 8
471 self.z = 9
472 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000473 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000474
475 # dir(obj_no__dict__)
476 class Foo(object):
477 __slots__ = []
478 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000479 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000480
481 # dir(obj_no__class__with__dict__)
482 # (an ugly trick to cause getattr(f, "__class__") to fail)
483 class Foo(object):
484 __slots__ = ["__class__", "__dict__"]
485 def __init__(self):
486 self.bar = "wow"
487 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000488 self.assertNotIn("__repr__", dir(f))
489 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000490
491 # dir(obj_using __dir__)
492 class Foo(object):
493 def __dir__(self):
494 return ["kan", "ga", "roo"]
495 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000496 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000497
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500498 # dir(obj__dir__tuple)
499 class Foo(object):
500 def __dir__(self):
501 return ("b", "c", "a")
502 res = dir(Foo())
503 self.assertIsInstance(res, list)
504 self.assertTrue(res == ["a", "b", "c"])
505
506 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000507 class Foo(object):
508 def __dir__(self):
509 return 7
510 f = Foo()
511 self.assertRaises(TypeError, dir, f)
512
Collin Winter3eed7652007-08-14 17:53:54 +0000513 # dir(traceback)
514 try:
515 raise IndexError
516 except:
517 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
518
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500519 # test that object has a __dir__()
520 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000521
Walter Dörwald919497e2003-01-19 16:23:59 +0000522 def test_divmod(self):
523 self.assertEqual(divmod(12, 7), (1, 5))
524 self.assertEqual(divmod(-12, 7), (-2, 2))
525 self.assertEqual(divmod(12, -7), (-2, -2))
526 self.assertEqual(divmod(-12, -7), (1, -5))
527
Mark Dickinson5c2db372009-12-05 20:28:34 +0000528 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000529
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000530 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
531 (-3.25, 1.0, (-4.0, 0.75)),
532 (3.25, -1.0, (-4.0, -0.75)),
533 (-3.25, -1.0, (3.0, -0.25))]:
534 result = divmod(num, denom)
535 self.assertAlmostEqual(result[0], exp_result[0])
536 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000537
538 self.assertRaises(TypeError, divmod)
539
540 def test_eval(self):
541 self.assertEqual(eval('1+1'), 2)
542 self.assertEqual(eval(' 1+1\n'), 2)
543 globals = {'a': 1, 'b': 2}
544 locals = {'b': 200, 'c': 300}
545 self.assertEqual(eval('a', globals) , 1)
546 self.assertEqual(eval('a', globals, locals), 1)
547 self.assertEqual(eval('b', globals, locals), 200)
548 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000549 globals = {'a': 1, 'b': 2}
550 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000551 bom = b'\xef\xbb\xbf'
552 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000553 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000554 self.assertRaises(TypeError, eval)
555 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000556 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000557
Benjamin Peterson92722792012-12-15 12:51:05 -0500558 class X:
559 def __getitem__(self, key):
560 raise ValueError
561 self.assertRaises(ValueError, eval, "foo", {}, X())
562
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000563 def test_general_eval(self):
564 # Tests that general mappings can be used for the locals argument
565
566 class M:
567 "Test mapping interface versus possible calls from eval()."
568 def __getitem__(self, key):
569 if key == 'a':
570 return 12
571 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000572 def keys(self):
573 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000574
575 m = M()
576 g = globals()
577 self.assertEqual(eval('a', g, m), 12)
578 self.assertRaises(NameError, eval, 'b', g, m)
579 self.assertEqual(eval('dir()', g, m), list('xyz'))
580 self.assertEqual(eval('globals()', g, m), g)
581 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000582 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000583 class A:
584 "Non-mapping"
585 pass
586 m = A()
587 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000588
589 # Verify that dict subclasses work as well
590 class D(dict):
591 def __getitem__(self, key):
592 if key == 'a':
593 return 12
594 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000595 def keys(self):
596 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000597
598 d = D()
599 self.assertEqual(eval('a', g, d), 12)
600 self.assertRaises(NameError, eval, 'b', g, d)
601 self.assertEqual(eval('dir()', g, d), list('xyz'))
602 self.assertEqual(eval('globals()', g, d), g)
603 self.assertEqual(eval('locals()', g, d), d)
604
605 # Verify locals stores (used by list comps)
606 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000607 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000608
609 class SpreadSheet:
610 "Sample application showing nested, calculated lookups."
611 _cells = {}
612 def __setitem__(self, key, formula):
613 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000614 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000615 return eval(self._cells[key], globals(), self)
616
617 ss = SpreadSheet()
618 ss['a1'] = '5'
619 ss['a2'] = 'a1*6'
620 ss['a3'] = 'a2*7'
621 self.assertEqual(ss['a3'], 210)
622
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000623 # Verify that dir() catches a non-list returned by eval
624 # SF bug #1004669
625 class C:
626 def __getitem__(self, item):
627 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000628 def keys(self):
629 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000630 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
631
Georg Brandl7cae87c2006-09-06 06:51:57 +0000632 def test_exec(self):
633 g = {}
634 exec('z = 1', g)
635 if '__builtins__' in g:
636 del g['__builtins__']
637 self.assertEqual(g, {'z': 1})
638
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000639 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000640 if '__builtins__' in g:
641 del g['__builtins__']
642 self.assertEqual(g, {'z': 2})
643 g = {}
644 l = {}
645
Brett Cannon77628992010-03-20 20:59:33 +0000646 with check_warnings():
647 warnings.filterwarnings("ignore", "global statement",
648 module="<string>")
649 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000650 if '__builtins__' in g:
651 del g['__builtins__']
652 if '__builtins__' in l:
653 del l['__builtins__']
654 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
655
Victor Stinnerb0b22422012-04-19 00:57:45 +0200656 def test_exec_globals(self):
657 code = compile("print('Hello World!')", "", "exec")
658 # no builtin function
659 self.assertRaisesRegex(NameError, "name 'print' is not defined",
660 exec, code, {'__builtins__': {}})
661 # __builtins__ must be a mapping type
662 self.assertRaises(TypeError,
663 exec, code, {'__builtins__': 123})
664
665 # no __build_class__ function
666 code = compile("class A: pass", "", "exec")
667 self.assertRaisesRegex(NameError, "__build_class__ not found",
668 exec, code, {'__builtins__': {}})
669
670 class frozendict_error(Exception):
671 pass
672
673 class frozendict(dict):
674 def __setitem__(self, key, value):
675 raise frozendict_error("frozendict is readonly")
676
677 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400678 if isinstance(__builtins__, types.ModuleType):
679 frozen_builtins = frozendict(__builtins__.__dict__)
680 else:
681 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200682 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
683 self.assertRaises(frozendict_error,
684 exec, code, {'__builtins__': frozen_builtins})
685
686 # read-only globals
687 namespace = frozendict({})
688 code = compile("x=1", "test", "exec")
689 self.assertRaises(frozendict_error,
690 exec, code, namespace)
691
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000692 def test_exec_redirected(self):
693 savestdout = sys.stdout
694 sys.stdout = None # Whatever that cannot flush()
695 try:
696 # Used to raise SystemError('error return without exception set')
697 exec('a')
698 except NameError:
699 pass
700 finally:
701 sys.stdout = savestdout
702
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000704 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
705 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
706 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
707 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
708 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000709 def identity(item):
710 return 1
711 filter(identity, Squares(5))
712 self.assertRaises(TypeError, filter)
713 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000714 def __getitem__(self, index):
715 if index<4:
716 return 42
717 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000718 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000719 def badfunc():
720 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000721 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000722
Walter Dörwaldbf517072003-01-27 15:57:14 +0000723 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000724 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
725 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
726 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000727
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000728 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200729 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
730 f1 = filter(filter_char, "abcdeabcde")
731 f2 = filter(filter_char, "abcdeabcde")
732 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000733
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000735 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000736 self.assertRaises(TypeError, getattr, sys, 1)
737 self.assertRaises(TypeError, getattr, sys, 1, "foo")
738 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000739 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000740 # unicode surrogates are not encodable to the default encoding (utf8)
741 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000742
743 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000744 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000745 self.assertRaises(TypeError, hasattr, sys, 1)
746 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000747 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000748
Benjamin Peterson17689992010-08-24 03:26:23 +0000749 # Check that hasattr propagates all exceptions outside of
750 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000751 class A:
752 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000753 raise SystemExit
754 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000755 class B:
756 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000757 raise ValueError
758 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000759
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 def test_hash(self):
761 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000762 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000763 self.assertEqual(hash(1), hash(1.0))
764 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000765 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000766 hash((0,1,2,3))
767 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000768 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000769 self.assertRaises(TypeError, hash, [])
770 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771 # Bug 1536021: Allow hash to return long objects
772 class X:
773 def __hash__(self):
774 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000775 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000776 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000777 def __hash__(self):
778 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000779 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000780
781 def test_hex(self):
782 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000783 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000784 self.assertRaises(TypeError, hex, {})
785
786 def test_id(self):
787 id(None)
788 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000789 id(1.0)
790 id('spam')
791 id((0,1,2,3))
792 id([0,1,2,3])
793 id({'spam': 1, 'eggs': 2, 'ham': 3})
794
Guido van Rossuma88a0332007-02-26 16:59:55 +0000795 # Test input() later, alphabetized as if it were raw_input
796
Walter Dörwald919497e2003-01-19 16:23:59 +0000797 def test_iter(self):
798 self.assertRaises(TypeError, iter)
799 self.assertRaises(TypeError, iter, 42, 42)
800 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 for l in lists:
802 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000803 self.assertEqual(next(i), '1')
804 self.assertEqual(next(i), '2')
805 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000806
807 def test_isinstance(self):
808 class C:
809 pass
810 class D(C):
811 pass
812 class E:
813 pass
814 c = C()
815 d = D()
816 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000817 self.assertTrue(isinstance(c, C))
818 self.assertTrue(isinstance(d, C))
819 self.assertTrue(not isinstance(e, C))
820 self.assertTrue(not isinstance(c, D))
821 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000822 self.assertRaises(TypeError, isinstance, E, 'foo')
823 self.assertRaises(TypeError, isinstance)
824
825 def test_issubclass(self):
826 class C:
827 pass
828 class D(C):
829 pass
830 class E:
831 pass
832 c = C()
833 d = D()
834 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000835 self.assertTrue(issubclass(D, C))
836 self.assertTrue(issubclass(C, C))
837 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000838 self.assertRaises(TypeError, issubclass, 'foo', E)
839 self.assertRaises(TypeError, issubclass, E, 'foo')
840 self.assertRaises(TypeError, issubclass)
841
842 def test_len(self):
843 self.assertEqual(len('123'), 3)
844 self.assertEqual(len(()), 0)
845 self.assertEqual(len((1, 2, 3, 4)), 4)
846 self.assertEqual(len([1, 2, 3, 4]), 4)
847 self.assertEqual(len({}), 0)
848 self.assertEqual(len({'a':1, 'b': 2}), 2)
849 class BadSeq:
850 def __len__(self):
851 raise ValueError
852 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000853 class InvalidLen:
854 def __len__(self):
855 return None
856 self.assertRaises(TypeError, len, InvalidLen())
857 class FloatLen:
858 def __len__(self):
859 return 4.5
860 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300861 class NegativeLen:
862 def __len__(self):
863 return -10
864 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000865 class HugeLen:
866 def __len__(self):
867 return sys.maxsize + 1
868 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300869 class HugeNegativeLen:
870 def __len__(self):
871 return -sys.maxsize-10
872 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000873 class NoLenMethod(object): pass
874 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000875
Walter Dörwald919497e2003-01-19 16:23:59 +0000876 def test_map(self):
877 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000878 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000879 [1, 4, 9]
880 )
881 try:
882 from math import sqrt
883 except ImportError:
884 def sqrt(x):
885 return pow(x, 0.5)
886 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000887 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000888 [[4.0, 2.0], [9.0, 3.0]]
889 )
890 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000891 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000892 [10, 4, 6]
893 )
894
895 def plus(*v):
896 accu = 0
897 for i in v: accu = accu + i
898 return accu
899 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000900 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000901 [1, 3, 7]
902 )
903 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000904 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000905 [1+4, 3+9, 7+2]
906 )
907 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000908 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000909 [1+4+1, 3+9+1, 7+2+0]
910 )
911 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000912 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000913 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
914 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000915 def Max(a, b):
916 if a is None:
917 return b
918 if b is None:
919 return a
920 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000921 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000922 list(map(Max, Squares(3), Squares(2))),
923 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000924 )
925 self.assertRaises(TypeError, map)
926 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000927 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000928 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000929 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000930 yield None
931 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000932 def badfunc(x):
933 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000934 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000935
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000936 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200937 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
938 m1 = map(map_char, "Is this the real life?")
939 m2 = map(map_char, "Is this the real life?")
940 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000941
Walter Dörwald919497e2003-01-19 16:23:59 +0000942 def test_max(self):
943 self.assertEqual(max('123123'), '3')
944 self.assertEqual(max(1, 2, 3), 3)
945 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
946 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
947
Guido van Rossume2a383d2007-01-15 16:59:06 +0000948 self.assertEqual(max(1, 2, 3.0), 3.0)
949 self.assertEqual(max(1, 2.0, 3), 3)
950 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000951
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700952 self.assertRaises(TypeError, max)
953 self.assertRaises(TypeError, max, 42)
954 self.assertRaises(ValueError, max, ())
955 class BadSeq:
956 def __getitem__(self, index):
957 raise ValueError
958 self.assertRaises(ValueError, max, BadSeq())
959
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000960 for stmt in (
961 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700962 "max(default=None)",
963 "max(1, 2, default=None)", # require container for default
964 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000965 "max(1, key=int)", # single arg not iterable
966 "max(1, 2, keystone=int)", # wrong keyword
967 "max(1, 2, key=int, abc=int)", # two many keywords
968 "max(1, 2, key=1)", # keyfunc is not callable
969 ):
Tim Peters7f061872004-12-07 21:17:46 +0000970 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000971 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000972 except TypeError:
973 pass
974 else:
975 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000976
977 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
978 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
979 self.assertEqual(max(1, 2, key=neg), 1) # two elems
980
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700981 self.assertEqual(max((), default=None), None) # zero elem iterable
982 self.assertEqual(max((1,), default=None), 1) # one elem iterable
983 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
984
985 self.assertEqual(max((), default=1, key=neg), 1)
986 self.assertEqual(max((1, 2), default=3, key=neg), 1)
987
Alexander Marshalove22072f2018-07-24 10:58:21 +0700988 self.assertEqual(max((1, 2), key=None), 2)
989
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000990 data = [random.randrange(200) for i in range(100)]
991 keys = dict((elem, random.randrange(50)) for elem in data)
992 f = keys.__getitem__
993 self.assertEqual(max(data, key=f),
994 sorted(reversed(data), key=f)[-1])
995
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 def test_min(self):
997 self.assertEqual(min('123123'), '1')
998 self.assertEqual(min(1, 2, 3), 1)
999 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1000 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1001
Guido van Rossume2a383d2007-01-15 16:59:06 +00001002 self.assertEqual(min(1, 2, 3.0), 1)
1003 self.assertEqual(min(1, 2.0, 3), 1)
1004 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001005
1006 self.assertRaises(TypeError, min)
1007 self.assertRaises(TypeError, min, 42)
1008 self.assertRaises(ValueError, min, ())
1009 class BadSeq:
1010 def __getitem__(self, index):
1011 raise ValueError
1012 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001013
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001014 for stmt in (
1015 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001016 "min(default=None)",
1017 "min(1, 2, default=None)", # require container for default
1018 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001019 "min(1, key=int)", # single arg not iterable
1020 "min(1, 2, keystone=int)", # wrong keyword
1021 "min(1, 2, key=int, abc=int)", # two many keywords
1022 "min(1, 2, key=1)", # keyfunc is not callable
1023 ):
Tim Peters7f061872004-12-07 21:17:46 +00001024 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001025 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001026 except TypeError:
1027 pass
1028 else:
1029 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001030
1031 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1032 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1033 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1034
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001035 self.assertEqual(min((), default=None), None) # zero elem iterable
1036 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1037 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1038
1039 self.assertEqual(min((), default=1, key=neg), 1)
1040 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1041
Alexander Marshalove22072f2018-07-24 10:58:21 +07001042 self.assertEqual(min((1, 2), key=None), 1)
1043
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001044 data = [random.randrange(200) for i in range(100)]
1045 keys = dict((elem, random.randrange(50)) for elem in data)
1046 f = keys.__getitem__
1047 self.assertEqual(min(data, key=f),
1048 sorted(data, key=f)[0])
1049
Georg Brandla18af4e2007-04-21 15:47:16 +00001050 def test_next(self):
1051 it = iter(range(2))
1052 self.assertEqual(next(it), 0)
1053 self.assertEqual(next(it), 1)
1054 self.assertRaises(StopIteration, next, it)
1055 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001056 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001057
1058 class Iter(object):
1059 def __iter__(self):
1060 return self
1061 def __next__(self):
1062 raise StopIteration
1063
1064 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001065 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001066 self.assertRaises(StopIteration, next, it)
1067
1068 def gen():
1069 yield 1
1070 return
1071
1072 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001073 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001074 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001075 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001076
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001078 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001079 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 self.assertRaises(TypeError, oct, ())
1081
1082 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001083 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001084 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001085 self.addCleanup(unlink, TESTFN)
1086 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001087 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001088 fp.write('The quick brown fox jumps over the lazy dog')
1089 fp.write('.\n')
1090 fp.write('Dear John\n')
1091 fp.write('XXX'*100)
1092 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001093
1094 def test_open(self):
1095 self.write_testfile()
1096 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001097 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001098 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001099 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1100 self.assertEqual(fp.readline(4), 'Dear')
1101 self.assertEqual(fp.readline(100), ' John\n')
1102 self.assertEqual(fp.read(300), 'XXX'*100)
1103 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001104
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001105 # embedded null bytes and characters
1106 self.assertRaises(ValueError, open, 'a\x00b')
1107 self.assertRaises(ValueError, open, b'a\x00b')
1108
Victor Stinner91106cd2017-12-13 12:29:09 +01001109 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001110 def test_open_default_encoding(self):
1111 old_environ = dict(os.environ)
1112 try:
1113 # try to get a user preferred encoding different than the current
1114 # locale encoding to check that open() uses the current locale
1115 # encoding and not the user preferred encoding
1116 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1117 if key in os.environ:
1118 del os.environ[key]
1119
1120 self.write_testfile()
1121 current_locale_encoding = locale.getpreferredencoding(False)
1122 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001123 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001124 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001125 finally:
1126 os.environ.clear()
1127 os.environ.update(old_environ)
1128
Victor Stinnerdaf45552013-08-28 00:53:59 +02001129 def test_open_non_inheritable(self):
1130 fileobj = open(__file__)
1131 with fileobj:
1132 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1133
Walter Dörwald919497e2003-01-19 16:23:59 +00001134 def test_ord(self):
1135 self.assertEqual(ord(' '), 32)
1136 self.assertEqual(ord('A'), 65)
1137 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001138 self.assertEqual(ord('\x80'), 128)
1139 self.assertEqual(ord('\xff'), 255)
1140
1141 self.assertEqual(ord(b' '), 32)
1142 self.assertEqual(ord(b'A'), 65)
1143 self.assertEqual(ord(b'a'), 97)
1144 self.assertEqual(ord(b'\x80'), 128)
1145 self.assertEqual(ord(b'\xff'), 255)
1146
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001147 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001148 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001150 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1151 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1152 self.assertEqual(ord("\U00010000"), 0x00010000)
1153 self.assertEqual(ord("\U00010001"), 0x00010001)
1154 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1155 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1156 self.assertEqual(ord("\U00100000"), 0x00100000)
1157 self.assertEqual(ord("\U00100001"), 0x00100001)
1158 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1159 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1160
Walter Dörwald919497e2003-01-19 16:23:59 +00001161 def test_pow(self):
1162 self.assertEqual(pow(0,0), 1)
1163 self.assertEqual(pow(0,1), 0)
1164 self.assertEqual(pow(1,0), 1)
1165 self.assertEqual(pow(1,1), 1)
1166
1167 self.assertEqual(pow(2,0), 1)
1168 self.assertEqual(pow(2,10), 1024)
1169 self.assertEqual(pow(2,20), 1024*1024)
1170 self.assertEqual(pow(2,30), 1024*1024*1024)
1171
1172 self.assertEqual(pow(-2,0), 1)
1173 self.assertEqual(pow(-2,1), -2)
1174 self.assertEqual(pow(-2,2), 4)
1175 self.assertEqual(pow(-2,3), -8)
1176
Walter Dörwald919497e2003-01-19 16:23:59 +00001177 self.assertAlmostEqual(pow(0.,0), 1.)
1178 self.assertAlmostEqual(pow(0.,1), 0.)
1179 self.assertAlmostEqual(pow(1.,0), 1.)
1180 self.assertAlmostEqual(pow(1.,1), 1.)
1181
1182 self.assertAlmostEqual(pow(2.,0), 1.)
1183 self.assertAlmostEqual(pow(2.,10), 1024.)
1184 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1185 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1186
1187 self.assertAlmostEqual(pow(-2.,0), 1.)
1188 self.assertAlmostEqual(pow(-2.,1), -2.)
1189 self.assertAlmostEqual(pow(-2.,2), 4.)
1190 self.assertAlmostEqual(pow(-2.,3), -8.)
1191
Mark Dickinson5c2db372009-12-05 20:28:34 +00001192 for x in 2, 2.0:
1193 for y in 10, 10.0:
1194 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001195 if isinstance(x, float) or \
1196 isinstance(y, float) or \
1197 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001198 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 else:
1200 self.assertAlmostEqual(pow(x, y, z), 24.0)
1201
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001202 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1203 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1204
Mark Dickinsonc5299672019-06-02 10:24:06 +01001205 # See test_pow for additional tests for three-argument pow.
1206 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001207 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001208
1209 self.assertRaises(TypeError, pow)
1210
Ammar Askar87d6cd32019-09-21 00:28:49 -04001211 # Test passing in arguments as keywords.
1212 self.assertEqual(pow(0, exp=0), 1)
1213 self.assertEqual(pow(base=2, exp=4), 16)
1214 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1215 twopow = partial(pow, base=2)
1216 self.assertEqual(twopow(exp=5), 32)
1217 fifth_power = partial(pow, exp=5)
1218 self.assertEqual(fifth_power(2), 32)
1219 mod10 = partial(pow, mod=10)
1220 self.assertEqual(mod10(2, 6), 4)
1221 self.assertEqual(mod10(exp=6, base=2), 4)
1222
Guido van Rossuma88a0332007-02-26 16:59:55 +00001223 def test_input(self):
1224 self.write_testfile()
1225 fp = open(TESTFN, 'r')
1226 savestdin = sys.stdin
1227 savestdout = sys.stdout # Eats the echo
1228 try:
1229 sys.stdin = fp
1230 sys.stdout = BitBucket()
1231 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001232 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1233 self.assertEqual(input('testing\n'), 'Dear John')
1234
1235 # SF 1535165: don't segfault on closed stdin
1236 # sys.stdout must be a regular file for triggering
1237 sys.stdout = savestdout
1238 sys.stdin.close()
1239 self.assertRaises(ValueError, input)
1240
1241 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001242 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001243 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001244 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001245 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001246 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001247 self.assertRaises(EOFError, input)
1248
1249 del sys.stdout
1250 self.assertRaises(RuntimeError, input, 'prompt')
1251 del sys.stdin
1252 self.assertRaises(RuntimeError, input, 'prompt')
1253 finally:
1254 sys.stdin = savestdin
1255 sys.stdout = savestdout
1256 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001257
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001258 # test_int(): see test_int.py for tests of built-in function int().
1259
Walter Dörwald919497e2003-01-19 16:23:59 +00001260 def test_repr(self):
1261 self.assertEqual(repr(''), '\'\'')
1262 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001263 self.assertEqual(repr(()), '()')
1264 self.assertEqual(repr([]), '[]')
1265 self.assertEqual(repr({}), '{}')
1266 a = []
1267 a.append(a)
1268 self.assertEqual(repr(a), '[[...]]')
1269 a = {}
1270 a[0] = a
1271 self.assertEqual(repr(a), '{0: {...}}')
1272
1273 def test_round(self):
1274 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001275 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001276 self.assertEqual(round(1.0), 1.0)
1277 self.assertEqual(round(10.0), 10.0)
1278 self.assertEqual(round(1000000000.0), 1000000000.0)
1279 self.assertEqual(round(1e20), 1e20)
1280
1281 self.assertEqual(round(-1.0), -1.0)
1282 self.assertEqual(round(-10.0), -10.0)
1283 self.assertEqual(round(-1000000000.0), -1000000000.0)
1284 self.assertEqual(round(-1e20), -1e20)
1285
1286 self.assertEqual(round(0.1), 0.0)
1287 self.assertEqual(round(1.1), 1.0)
1288 self.assertEqual(round(10.1), 10.0)
1289 self.assertEqual(round(1000000000.1), 1000000000.0)
1290
1291 self.assertEqual(round(-1.1), -1.0)
1292 self.assertEqual(round(-10.1), -10.0)
1293 self.assertEqual(round(-1000000000.1), -1000000000.0)
1294
1295 self.assertEqual(round(0.9), 1.0)
1296 self.assertEqual(round(9.9), 10.0)
1297 self.assertEqual(round(999999999.9), 1000000000.0)
1298
1299 self.assertEqual(round(-0.9), -1.0)
1300 self.assertEqual(round(-9.9), -10.0)
1301 self.assertEqual(round(-999999999.9), -1000000000.0)
1302
1303 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001304 self.assertEqual(type(round(-8.0, -1)), float)
1305
1306 self.assertEqual(type(round(-8.0, 0)), float)
1307 self.assertEqual(type(round(-8.0, 1)), float)
1308
1309 # Check even / odd rounding behaviour
1310 self.assertEqual(round(5.5), 6)
1311 self.assertEqual(round(6.5), 6)
1312 self.assertEqual(round(-5.5), -6)
1313 self.assertEqual(round(-6.5), -6)
1314
1315 # Check behavior on ints
1316 self.assertEqual(round(0), 0)
1317 self.assertEqual(round(8), 8)
1318 self.assertEqual(round(-8), -8)
1319 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001320 self.assertEqual(type(round(-8, -1)), int)
1321 self.assertEqual(type(round(-8, 0)), int)
1322 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001323
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324 # test new kwargs
1325 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1326
Walter Dörwald919497e2003-01-19 16:23:59 +00001327 self.assertRaises(TypeError, round)
1328
Alex Martelliae211f92007-08-22 23:21:33 +00001329 # test generic rounding delegation for reals
1330 class TestRound:
1331 def __round__(self):
1332 return 23
1333
1334 class TestNoRound:
1335 pass
1336
1337 self.assertEqual(round(TestRound()), 23)
1338
1339 self.assertRaises(TypeError, round, 1, 2, 3)
1340 self.assertRaises(TypeError, round, TestNoRound())
1341
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001342 t = TestNoRound()
1343 t.__round__ = lambda *args: args
1344 self.assertRaises(TypeError, round, t)
1345 self.assertRaises(TypeError, round, t, 0)
1346
Mark Dickinsonad731b92009-11-09 17:12:30 +00001347 # Some versions of glibc for alpha have a bug that affects
1348 # float -> integer rounding (floor, ceil, rint, round) for
1349 # values in the range [2**52, 2**53). See:
1350 #
1351 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1352 #
1353 # We skip this test on Linux/alpha if it would fail.
1354 linux_alpha = (platform.system().startswith('Linux') and
1355 platform.machine().startswith('alpha'))
1356 system_round_bug = round(5e15+1) != 5e15+1
1357 @unittest.skipIf(linux_alpha and system_round_bug,
1358 "test will fail; failure is probably due to a "
1359 "buggy system round function")
1360 def test_round_large(self):
1361 # Issue #1869: integral floats should remain unchanged
1362 self.assertEqual(round(5e15-1), 5e15-1)
1363 self.assertEqual(round(5e15), 5e15)
1364 self.assertEqual(round(5e15+1), 5e15+1)
1365 self.assertEqual(round(5e15+2), 5e15+2)
1366 self.assertEqual(round(5e15+3), 5e15+3)
1367
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001368 def test_bug_27936(self):
1369 # Verify that ndigits=None means the same as passing in no argument
1370 for x in [1234,
1371 1234.56,
1372 decimal.Decimal('1234.56'),
1373 fractions.Fraction(123456, 100)]:
1374 self.assertEqual(round(x, None), round(x))
1375 self.assertEqual(type(round(x, None)), type(round(x)))
1376
Walter Dörwald919497e2003-01-19 16:23:59 +00001377 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001378 setattr(sys, 'spam', 1)
1379 self.assertEqual(sys.spam, 1)
1380 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1381 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001382
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001383 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001384
Alex Martellia70b1912003-04-22 08:12:33 +00001385 def test_sum(self):
1386 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001387 self.assertEqual(sum(list(range(2,8))), 27)
1388 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001389 self.assertEqual(sum(Squares(10)), 285)
1390 self.assertEqual(sum(iter(Squares(10))), 285)
1391 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1392
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001393 self.assertEqual(sum(range(10), 1000), 1045)
1394 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001395 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1396 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1397
1398 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1399 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1400 2**31+2)
1401 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1402 2**63+2)
1403 self.assertIs(sum([], False), False)
1404
1405 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1406 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1407 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1408 self.assertEqual(sum([0.5, 1]), 1.5)
1409 self.assertEqual(sum([1, 0.5]), 1.5)
1410 self.assertEqual(repr(sum([-0.0])), '0.0')
1411 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1412 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001413
Alex Martellia70b1912003-04-22 08:12:33 +00001414 self.assertRaises(TypeError, sum)
1415 self.assertRaises(TypeError, sum, 42)
1416 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1417 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001418 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1419 values = [bytearray(b'a'), bytearray(b'b')]
1420 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001421 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1422 self.assertRaises(TypeError, sum, [{2:3}])
1423 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001424 self.assertRaises(TypeError, sum, [], '')
1425 self.assertRaises(TypeError, sum, [], b'')
1426 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001427
1428 class BadSeq:
1429 def __getitem__(self, index):
1430 raise ValueError
1431 self.assertRaises(ValueError, sum, BadSeq())
1432
Mark Dickinson3a22b472009-10-17 21:48:16 +00001433 empty = []
1434 sum(([x] for x in range(10)), empty)
1435 self.assertEqual(empty, [])
1436
Walter Dörwald919497e2003-01-19 16:23:59 +00001437 def test_type(self):
1438 self.assertEqual(type(''), type('123'))
1439 self.assertNotEqual(type(''), type(()))
1440
Guido van Rossumfee7b932005-01-16 00:21:28 +00001441 # We don't want self in vars(), so these are static methods
1442
1443 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001444 def get_vars_f0():
1445 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001446
Guido van Rossumfee7b932005-01-16 00:21:28 +00001447 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001448 def get_vars_f2():
1449 BuiltinTest.get_vars_f0()
1450 a = 1
1451 b = 2
1452 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001453
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001454 class C_get_vars(object):
1455 def getDict(self):
1456 return {'a':2}
1457 __dict__ = property(fget=getDict)
1458
Walter Dörwald919497e2003-01-19 16:23:59 +00001459 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001460 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001462 self.assertEqual(self.get_vars_f0(), {})
1463 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1464 self.assertRaises(TypeError, vars, 42, 42)
1465 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001466 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001467
1468 def test_zip(self):
1469 a = (1, 2, 3)
1470 b = (4, 5, 6)
1471 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001472 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001473 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001474 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001475 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001476 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001477 class I:
1478 def __getitem__(self, i):
1479 if i < 0 or i > 2: raise IndexError
1480 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001481 self.assertEqual(list(zip(a, I())), t)
1482 self.assertEqual(list(zip()), [])
1483 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001484 self.assertRaises(TypeError, zip, None)
1485 class G:
1486 pass
1487 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001488 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001489
1490 # Make sure zip doesn't try to allocate a billion elements for the
1491 # result list when one of its arguments doesn't say how long it is.
1492 # A MemoryError is the most likely failure mode.
1493 class SequenceWithoutALength:
1494 def __getitem__(self, i):
1495 if i == 5:
1496 raise IndexError
1497 else:
1498 return i
1499 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001500 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001501 list(enumerate(range(5)))
1502 )
1503
1504 class BadSeq:
1505 def __getitem__(self, i):
1506 if i == 5:
1507 raise ValueError
1508 else:
1509 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001510 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001511
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001512 def test_zip_pickle(self):
1513 a = (1, 2, 3)
1514 b = (4, 5, 6)
1515 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001516 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1517 z1 = zip(a, b)
1518 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001519
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001520 def test_zip_bad_iterable(self):
1521 exception = TypeError()
1522
1523 class BadIterable:
1524 def __iter__(self):
1525 raise exception
1526
1527 with self.assertRaises(TypeError) as cm:
1528 zip(BadIterable())
1529
1530 self.assertIs(cm.exception, exception)
1531
Eric Smithe4d63172010-09-13 20:48:43 +00001532 def test_format(self):
1533 # Test the basic machinery of the format() builtin. Don't test
1534 # the specifics of the various formatters
1535 self.assertEqual(format(3, ''), '3')
1536
1537 # Returns some classes to use for various tests. There's
1538 # an old-style version, and a new-style version
1539 def classes_new():
1540 class A(object):
1541 def __init__(self, x):
1542 self.x = x
1543 def __format__(self, format_spec):
1544 return str(self.x) + format_spec
1545 class DerivedFromA(A):
1546 pass
1547
1548 class Simple(object): pass
1549 class DerivedFromSimple(Simple):
1550 def __init__(self, x):
1551 self.x = x
1552 def __format__(self, format_spec):
1553 return str(self.x) + format_spec
1554 class DerivedFromSimple2(DerivedFromSimple): pass
1555 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1556
1557 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1558 self.assertEqual(format(A(3), 'spec'), '3spec')
1559 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1560 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1561 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1562 '10abcdef')
1563
1564 class_test(*classes_new())
1565
1566 def empty_format_spec(value):
1567 # test that:
1568 # format(x, '') == str(x)
1569 # format(x) == str(x)
1570 self.assertEqual(format(value, ""), str(value))
1571 self.assertEqual(format(value), str(value))
1572
1573 # for builtin types, format(x, "") == str(x)
1574 empty_format_spec(17**13)
1575 empty_format_spec(1.0)
1576 empty_format_spec(3.1415e104)
1577 empty_format_spec(-3.1415e104)
1578 empty_format_spec(3.1415e-104)
1579 empty_format_spec(-3.1415e-104)
1580 empty_format_spec(object)
1581 empty_format_spec(None)
1582
1583 # TypeError because self.__format__ returns the wrong type
1584 class BadFormatResult:
1585 def __format__(self, format_spec):
1586 return 1.0
1587 self.assertRaises(TypeError, format, BadFormatResult(), "")
1588
1589 # TypeError because format_spec is not unicode or str
1590 self.assertRaises(TypeError, format, object(), 4)
1591 self.assertRaises(TypeError, format, object(), object())
1592
1593 # tests for object.__format__ really belong elsewhere, but
1594 # there's no good place to put them
1595 x = object().__format__('')
1596 self.assertTrue(x.startswith('<object object at'))
1597
1598 # first argument to object.__format__ must be string
1599 self.assertRaises(TypeError, object().__format__, 3)
1600 self.assertRaises(TypeError, object().__format__, object())
1601 self.assertRaises(TypeError, object().__format__, None)
1602
1603 # --------------------------------------------------------------------
1604 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001605 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001606 class A:
1607 def __format__(self, fmt_str):
1608 return format('', fmt_str)
1609
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001610 self.assertEqual(format(A()), '')
1611 self.assertEqual(format(A(), ''), '')
1612 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001613
1614 class B:
1615 pass
1616
1617 class C(object):
1618 pass
1619
1620 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001621 obj = cls()
1622 self.assertEqual(format(obj), str(obj))
1623 self.assertEqual(format(obj, ''), str(obj))
1624 with self.assertRaisesRegex(TypeError,
1625 r'\b%s\b' % re.escape(cls.__name__)):
1626 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001627 # --------------------------------------------------------------------
1628
1629 # make sure we can take a subclass of str as a format spec
1630 class DerivedFromStr(str): pass
1631 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1632
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001633 def test_bin(self):
1634 self.assertEqual(bin(0), '0b0')
1635 self.assertEqual(bin(1), '0b1')
1636 self.assertEqual(bin(-1), '-0b1')
1637 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1638 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1639 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1640 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1641
Georg Brandl953152f2009-07-22 12:03:59 +00001642 def test_bytearray_translate(self):
1643 x = bytearray(b"abc")
1644 self.assertRaises(ValueError, x.translate, b"1", 1)
1645 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1646
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001647 def test_bytearray_extend_error(self):
1648 array = bytearray()
1649 bad_iter = map(int, "X")
1650 self.assertRaises(ValueError, array.extend, bad_iter)
1651
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001652 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001653 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001654 tp = type(const)
1655 self.assertIs(tp(), const)
1656 self.assertRaises(TypeError, tp, 1, 2)
1657 self.assertRaises(TypeError, tp, a=1, b=2)
1658
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001659
1660class TestBreakpoint(unittest.TestCase):
1661 def setUp(self):
1662 # These tests require a clean slate environment. For example, if the
1663 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1664 # will mess up these tests. Similarly for sys.breakpointhook.
1665 # Cleaning the slate here means you can't use breakpoint() to debug
1666 # these tests, but I think that's okay. Just use pdb.set_trace() if
1667 # you must.
1668 self.resources = ExitStack()
1669 self.addCleanup(self.resources.close)
1670 self.env = self.resources.enter_context(EnvironmentVarGuard())
1671 del self.env['PYTHONBREAKPOINT']
1672 self.resources.enter_context(
1673 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1674
1675 def test_breakpoint(self):
1676 with patch('pdb.set_trace') as mock:
1677 breakpoint()
1678 mock.assert_called_once()
1679
1680 def test_breakpoint_with_breakpointhook_set(self):
1681 my_breakpointhook = MagicMock()
1682 sys.breakpointhook = my_breakpointhook
1683 breakpoint()
1684 my_breakpointhook.assert_called_once_with()
1685
1686 def test_breakpoint_with_breakpointhook_reset(self):
1687 my_breakpointhook = MagicMock()
1688 sys.breakpointhook = my_breakpointhook
1689 breakpoint()
1690 my_breakpointhook.assert_called_once_with()
1691 # Reset the hook and it will not be called again.
1692 sys.breakpointhook = sys.__breakpointhook__
1693 with patch('pdb.set_trace') as mock:
1694 breakpoint()
1695 mock.assert_called_once_with()
1696 my_breakpointhook.assert_called_once_with()
1697
1698 def test_breakpoint_with_args_and_keywords(self):
1699 my_breakpointhook = MagicMock()
1700 sys.breakpointhook = my_breakpointhook
1701 breakpoint(1, 2, 3, four=4, five=5)
1702 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1703
1704 def test_breakpoint_with_passthru_error(self):
1705 def my_breakpointhook():
1706 pass
1707 sys.breakpointhook = my_breakpointhook
1708 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1709
1710 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1711 def test_envar_good_path_builtin(self):
1712 self.env['PYTHONBREAKPOINT'] = 'int'
1713 with patch('builtins.int') as mock:
1714 breakpoint('7')
1715 mock.assert_called_once_with('7')
1716
1717 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1718 def test_envar_good_path_other(self):
1719 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1720 with patch('sys.exit') as mock:
1721 breakpoint()
1722 mock.assert_called_once_with()
1723
1724 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1725 def test_envar_good_path_noop_0(self):
1726 self.env['PYTHONBREAKPOINT'] = '0'
1727 with patch('pdb.set_trace') as mock:
1728 breakpoint()
1729 mock.assert_not_called()
1730
1731 def test_envar_good_path_empty_string(self):
1732 # PYTHONBREAKPOINT='' is the same as it not being set.
1733 self.env['PYTHONBREAKPOINT'] = ''
1734 with patch('pdb.set_trace') as mock:
1735 breakpoint()
1736 mock.assert_called_once_with()
1737
1738 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1739 def test_envar_unimportable(self):
1740 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001741 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001742 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001743 'nosuchbuiltin',
1744 'nosuchmodule.nosuchcallable',
1745 ):
1746 with self.subTest(envar=envar):
1747 self.env['PYTHONBREAKPOINT'] = envar
1748 mock = self.resources.enter_context(patch('pdb.set_trace'))
1749 w = self.resources.enter_context(check_warnings(quiet=True))
1750 breakpoint()
1751 self.assertEqual(
1752 str(w.message),
1753 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1754 self.assertEqual(w.category, RuntimeWarning)
1755 mock.assert_not_called()
1756
1757 def test_envar_ignored_when_hook_is_set(self):
1758 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1759 with patch('sys.exit') as mock:
1760 sys.breakpointhook = int
1761 breakpoint()
1762 mock.assert_not_called()
1763
1764
Martin Panterc9a6ab52015-10-10 01:25:38 +00001765@unittest.skipUnless(pty, "the pty and signal modules must be available")
1766class PtyTests(unittest.TestCase):
1767 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1768 terminals in the test environment"""
1769
Martin Pantere44dba32015-10-10 05:27:15 +00001770 def run_child(self, child, terminal_input):
1771 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001772 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001773 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001774 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001775 os.close(r)
1776 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001777 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001778 raise
1779 if pid == 0:
1780 # Child
1781 try:
1782 # Make sure we don't get stuck if there's a problem
1783 signal.alarm(2)
1784 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001785 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001786 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001787 except:
1788 traceback.print_exc()
1789 finally:
1790 # We don't want to return to unittest...
1791 os._exit(0)
1792 # Parent
1793 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001794 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001795 # Get results from the pipe
1796 with open(r, "r") as rpipe:
1797 lines = []
1798 while True:
1799 line = rpipe.readline().strip()
1800 if line == "":
1801 # The other end was closed => the child exited
1802 break
1803 lines.append(line)
1804 # Check the result was got and corresponds to the user's terminal input
1805 if len(lines) != 2:
1806 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001807 # Beware of Linux raising EIO when the slave is closed
1808 child_output = bytearray()
1809 while True:
1810 try:
1811 chunk = os.read(fd, 3000)
1812 except OSError: # Assume EIO
1813 break
1814 if not chunk:
1815 break
1816 child_output.extend(chunk)
1817 os.close(fd)
1818 child_output = child_output.decode("ascii", "ignore")
1819 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1820 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001821 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001822
Victor Stinner3ca9f502017-08-09 23:08:22 +02001823 # Wait until the child process completes
1824 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001825
Martin Pantere44dba32015-10-10 05:27:15 +00001826 return lines
1827
1828 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1829 if not sys.stdin.isatty() or not sys.stdout.isatty():
1830 self.skipTest("stdin and stdout must be ttys")
1831 def child(wpipe):
1832 # Check the error handlers are accounted for
1833 if stdio_encoding:
1834 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1835 encoding=stdio_encoding,
1836 errors='surrogateescape')
1837 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1838 encoding=stdio_encoding,
1839 errors='replace')
1840 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1841 print(ascii(input(prompt)), file=wpipe)
1842 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001843 # Check we did exercise the GNU readline path
1844 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1845 if lines[0] != 'tty = True':
1846 self.skipTest("standard IO in should have been a tty")
1847 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1848 if stdio_encoding:
1849 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1850 else:
1851 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1852 self.assertEqual(input_result, expected)
1853
1854 def test_input_tty(self):
1855 # Test input() functionality when wired to a tty (the code path
1856 # is different and invokes GNU readline if available).
1857 self.check_input_tty("prompt", b"quux")
1858
1859 def test_input_tty_non_ascii(self):
1860 # Check stdin/stdout encoding is used when invoking GNU readline
1861 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1862
1863 def test_input_tty_non_ascii_unicode_errors(self):
1864 # Check stdin/stdout error handler is used when invoking GNU readline
1865 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1866
1867 def test_input_no_stdout_fileno(self):
1868 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1869 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001870 def child(wpipe):
1871 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1872 sys.stdout = io.StringIO() # Does not support fileno()
1873 input("prompt")
1874 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1875 lines = self.run_child(child, b"quux\r")
1876 expected = (
1877 "stdin.isatty(): True",
1878 "captured: 'prompt'",
1879 )
1880 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001881
Raymond Hettinger64958a12003-12-17 20:43:33 +00001882class TestSorted(unittest.TestCase):
1883
1884 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001885 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001886 copy = data[:]
1887 random.shuffle(copy)
1888 self.assertEqual(data, sorted(copy))
1889 self.assertNotEqual(data, copy)
1890
1891 data.reverse()
1892 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001893 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1894 self.assertNotEqual(data, copy)
1895 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001896 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001897 self.assertNotEqual(data, copy)
1898
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001899 def test_bad_arguments(self):
1900 # Issue #29327: The first argument is positional-only.
1901 sorted([])
1902 with self.assertRaises(TypeError):
1903 sorted(iterable=[])
1904 # Other arguments are keyword-only
1905 sorted([], key=None)
1906 with self.assertRaises(TypeError):
1907 sorted([], None)
1908
Raymond Hettinger64958a12003-12-17 20:43:33 +00001909 def test_inputtypes(self):
1910 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001911 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001912 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001913 self.assertEqual(sorted(s), sorted(T(s)))
1914
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001915 s = ''.join(set(s)) # unique letters only
1916 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001917 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001918 self.assertEqual(sorted(s), sorted(T(s)))
1919
1920 def test_baddecorator(self):
1921 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1922 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1923
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001924
1925class ShutdownTest(unittest.TestCase):
1926
1927 def test_cleanup(self):
1928 # Issue #19255: builtins are still available at shutdown
1929 code = """if 1:
1930 import builtins
1931 import sys
1932
1933 class C:
1934 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001935 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001936 # Check that builtins still exist
1937 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001938 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001939
1940 c = C()
1941 # Make this module survive until builtins and sys are cleaned
1942 builtins.here = sys.modules[__name__]
1943 sys.here = sys.modules[__name__]
1944 # Create a reference loop so that this module needs to go
1945 # through a GC phase.
1946 here = sys.modules[__name__]
1947 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001948 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1949 # otherwise the codec may be unloaded before C.__del__() is called, and
1950 # so print("before") fails because the codec cannot be used to encode
1951 # "before" to sys.stdout.encoding. For example, on Windows,
1952 # sys.stdout.encoding is the OEM code page and these code pages are
1953 # implemented in Python
1954 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001955 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001956 self.assertEqual(["before", "after"], out.decode().splitlines())
1957
1958
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001959class TestType(unittest.TestCase):
1960 def test_new_type(self):
1961 A = type('A', (), {})
1962 self.assertEqual(A.__name__, 'A')
1963 self.assertEqual(A.__qualname__, 'A')
1964 self.assertEqual(A.__module__, __name__)
1965 self.assertEqual(A.__bases__, (object,))
1966 self.assertIs(A.__base__, object)
1967 x = A()
1968 self.assertIs(type(x), A)
1969 self.assertIs(x.__class__, A)
1970
1971 class B:
1972 def ham(self):
1973 return 'ham%d' % self
1974 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1975 self.assertEqual(C.__name__, 'C')
1976 self.assertEqual(C.__qualname__, 'C')
1977 self.assertEqual(C.__module__, __name__)
1978 self.assertEqual(C.__bases__, (B, int))
1979 self.assertIs(C.__base__, int)
1980 self.assertIn('spam', C.__dict__)
1981 self.assertNotIn('ham', C.__dict__)
1982 x = C(42)
1983 self.assertEqual(x, 42)
1984 self.assertIs(type(x), C)
1985 self.assertIs(x.__class__, C)
1986 self.assertEqual(x.ham(), 'ham42')
1987 self.assertEqual(x.spam(), 'spam42')
1988 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1989
Nick Coghland78448e2016-07-30 16:26:03 +10001990 def test_type_nokwargs(self):
1991 with self.assertRaises(TypeError):
1992 type('a', (), {}, x=5)
1993 with self.assertRaises(TypeError):
1994 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001995
1996 def test_type_name(self):
1997 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1998 with self.subTest(name=name):
1999 A = type(name, (), {})
2000 self.assertEqual(A.__name__, name)
2001 self.assertEqual(A.__qualname__, name)
2002 self.assertEqual(A.__module__, __name__)
2003 with self.assertRaises(ValueError):
2004 type('A\x00B', (), {})
2005 with self.assertRaises(ValueError):
2006 type('A\udcdcB', (), {})
2007 with self.assertRaises(TypeError):
2008 type(b'A', (), {})
2009
2010 C = type('C', (), {})
2011 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2012 with self.subTest(name=name):
2013 C.__name__ = name
2014 self.assertEqual(C.__name__, name)
2015 self.assertEqual(C.__qualname__, 'C')
2016 self.assertEqual(C.__module__, __name__)
2017
2018 A = type('C', (), {})
2019 with self.assertRaises(ValueError):
2020 A.__name__ = 'A\x00B'
2021 self.assertEqual(A.__name__, 'C')
2022 with self.assertRaises(ValueError):
2023 A.__name__ = 'A\udcdcB'
2024 self.assertEqual(A.__name__, 'C')
2025 with self.assertRaises(TypeError):
2026 A.__name__ = b'A'
2027 self.assertEqual(A.__name__, 'C')
2028
2029 def test_type_qualname(self):
2030 A = type('A', (), {'__qualname__': 'B.C'})
2031 self.assertEqual(A.__name__, 'A')
2032 self.assertEqual(A.__qualname__, 'B.C')
2033 self.assertEqual(A.__module__, __name__)
2034 with self.assertRaises(TypeError):
2035 type('A', (), {'__qualname__': b'B'})
2036 self.assertEqual(A.__qualname__, 'B.C')
2037
2038 A.__qualname__ = 'D.E'
2039 self.assertEqual(A.__name__, 'A')
2040 self.assertEqual(A.__qualname__, 'D.E')
2041 with self.assertRaises(TypeError):
2042 A.__qualname__ = b'B'
2043 self.assertEqual(A.__qualname__, 'D.E')
2044
2045 def test_type_doc(self):
2046 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2047 A = type('A', (), {'__doc__': doc})
2048 self.assertEqual(A.__doc__, doc)
2049 with self.assertRaises(UnicodeEncodeError):
2050 type('A', (), {'__doc__': 'x\udcdcy'})
2051
2052 A = type('A', (), {})
2053 self.assertEqual(A.__doc__, None)
2054 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2055 A.__doc__ = doc
2056 self.assertEqual(A.__doc__, doc)
2057
2058 def test_bad_args(self):
2059 with self.assertRaises(TypeError):
2060 type()
2061 with self.assertRaises(TypeError):
2062 type('A', ())
2063 with self.assertRaises(TypeError):
2064 type('A', (), {}, ())
2065 with self.assertRaises(TypeError):
2066 type('A', (), dict={})
2067 with self.assertRaises(TypeError):
2068 type('A', [], {})
2069 with self.assertRaises(TypeError):
2070 type('A', (), types.MappingProxyType({}))
2071 with self.assertRaises(TypeError):
2072 type('A', (None,), {})
2073 with self.assertRaises(TypeError):
2074 type('A', (bool,), {})
2075 with self.assertRaises(TypeError):
2076 type('A', (int, str), {})
2077
2078 def test_bad_slots(self):
2079 with self.assertRaises(TypeError):
2080 type('A', (), {'__slots__': b'x'})
2081 with self.assertRaises(TypeError):
2082 type('A', (int,), {'__slots__': 'x'})
2083 with self.assertRaises(TypeError):
2084 type('A', (), {'__slots__': ''})
2085 with self.assertRaises(TypeError):
2086 type('A', (), {'__slots__': '42'})
2087 with self.assertRaises(TypeError):
2088 type('A', (), {'__slots__': 'x\x00y'})
2089 with self.assertRaises(ValueError):
2090 type('A', (), {'__slots__': 'x', 'x': 0})
2091 with self.assertRaises(TypeError):
2092 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2093 with self.assertRaises(TypeError):
2094 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2095
2096 class B:
2097 pass
2098 with self.assertRaises(TypeError):
2099 type('A', (B,), {'__slots__': '__dict__'})
2100 with self.assertRaises(TypeError):
2101 type('A', (B,), {'__slots__': '__weakref__'})
2102
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002103 def test_namespace_order(self):
2104 # bpo-34320: namespace should preserve order
2105 od = collections.OrderedDict([('a', 1), ('b', 2)])
2106 od.move_to_end('a')
2107 expected = list(od.items())
2108
2109 C = type('C', (), od)
2110 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2111
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002112
Zachary Warea4b7a752013-11-24 01:19:09 -06002113def load_tests(loader, tests, pattern):
2114 from doctest import DocTestSuite
2115 tests.addTest(DocTestSuite(builtins))
2116 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002117
2118if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002119 unittest.main()