blob: 185d8f794b25f828186056c621e382d1e436b319 [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
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070022from inspect import CO_COROUTINE
23from itertools import product
24from textwrap import dedent
25from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020026from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040027from test.support import (
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070028 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink,
29 maybe_get_event_loop_policy)
Berker Peksagce643912015-05-06 06:33:17 +030030from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040031from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010032try:
Antoine Pitrou772add72011-11-06 02:37:42 +010033 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010034except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010035 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000036
Guido van Rossum3bead091992-01-27 17:00:37 +000037
Walter Dörwald919497e2003-01-19 16:23:59 +000038class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Walter Dörwald919497e2003-01-19 16:23:59 +000040 def __init__(self, max):
41 self.max = max
42 self.sofar = []
43
44 def __len__(self): return len(self.sofar)
45
46 def __getitem__(self, i):
47 if not 0 <= i < self.max: raise IndexError
48 n = len(self.sofar)
49 while n <= i:
50 self.sofar.append(n*n)
51 n += 1
52 return self.sofar[i]
53
54class StrSquares:
55
56 def __init__(self, max):
57 self.max = max
58 self.sofar = []
59
60 def __len__(self):
61 return len(self.sofar)
62
63 def __getitem__(self, i):
64 if not 0 <= i < self.max:
65 raise IndexError
66 n = len(self.sofar)
67 while n <= i:
68 self.sofar.append(str(n*n))
69 n += 1
70 return self.sofar[i]
71
72class BitBucket:
73 def write(self, line):
74 pass
75
Facundo Batista2336bdd2008-01-19 19:12:01 +000076test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000077 ('0', 0),
78 ('1', 1),
79 ('9', 9),
80 ('10', 10),
81 ('99', 99),
82 ('100', 100),
83 ('314', 314),
84 (' 314', 314),
85 ('314 ', 314),
86 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000087 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000088 (' 1x', ValueError),
89 (' 1 ', 1),
90 (' 1\02 ', ValueError),
91 ('', ValueError),
92 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000093 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040094 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000095 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000096]
97
Facundo Batista2336bdd2008-01-19 19:12:01 +000098test_conv_sign = [
99 ('0', 0),
100 ('1', 1),
101 ('9', 9),
102 ('10', 10),
103 ('99', 99),
104 ('100', 100),
105 ('314', 314),
106 (' 314', ValueError),
107 ('314 ', 314),
108 (' \t\t 314 \t\t ', ValueError),
109 (repr(sys.maxsize), sys.maxsize),
110 (' 1x', ValueError),
111 (' 1 ', ValueError),
112 (' 1\02 ', ValueError),
113 ('', ValueError),
114 (' ', ValueError),
115 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400116 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000117 (chr(0x200), ValueError),
118]
119
Raymond Hettinger96229b12005-03-11 06:49:40 +0000120class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000121 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000122 raise RuntimeError
123
124class TestFailingIter:
125 def __iter__(self):
126 raise RuntimeError
127
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000128def filter_char(arg):
129 return ord(arg) > ord("d")
130
131def map_char(arg):
132 return chr(ord(arg)+1)
133
Walter Dörwald919497e2003-01-19 16:23:59 +0000134class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000135 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200136 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000137 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200138 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000139 it = pickle.loads(d)
140 self.assertEqual(type(itorg), type(it))
141 self.assertEqual(list(it), seq)
142
143 #test the iterator after dropping one from it
144 it = pickle.loads(d)
145 try:
146 next(it)
147 except StopIteration:
148 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200149 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000150 it = pickle.loads(d)
151 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000152
153 def test_import(self):
154 __import__('sys')
155 __import__('time')
156 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000157 __import__(name='sys')
158 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000159 self.assertRaises(ImportError, __import__, 'spamspam')
160 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000161 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000162 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000163 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
164 self.assertRaises(ImportError, __import__, '',
165 {'__package__': None, '__spec__': None, '__name__': '__main__'},
166 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300167 # embedded null character
168 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000169
170 def test_abs(self):
171 # int
172 self.assertEqual(abs(0), 0)
173 self.assertEqual(abs(1234), 1234)
174 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000175 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000176 # float
177 self.assertEqual(abs(0.0), 0.0)
178 self.assertEqual(abs(3.14), 3.14)
179 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000180 # str
181 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000182 # bool
183 self.assertEqual(abs(True), 1)
184 self.assertEqual(abs(False), 0)
185 # other
186 self.assertRaises(TypeError, abs)
187 self.assertRaises(TypeError, abs, None)
188 class AbsClass(object):
189 def __abs__(self):
190 return -5
191 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000192
Raymond Hettinger96229b12005-03-11 06:49:40 +0000193 def test_all(self):
194 self.assertEqual(all([2, 4, 6]), True)
195 self.assertEqual(all([2, None, 6]), False)
196 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
197 self.assertRaises(RuntimeError, all, TestFailingIter())
198 self.assertRaises(TypeError, all, 10) # Non-iterable
199 self.assertRaises(TypeError, all) # No args
200 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
201 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200202 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000203 S = [50, 60]
204 self.assertEqual(all(x > 42 for x in S), True)
205 S = [50, 40, 60]
206 self.assertEqual(all(x > 42 for x in S), False)
207
208 def test_any(self):
209 self.assertEqual(any([None, None, None]), False)
210 self.assertEqual(any([None, 4, None]), True)
211 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500212 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000213 self.assertRaises(TypeError, any, 10) # Non-iterable
214 self.assertRaises(TypeError, any) # No args
215 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
216 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200217 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000218 S = [40, 60, 30]
219 self.assertEqual(any(x > 42 for x in S), True)
220 S = [10, 20, 30]
221 self.assertEqual(any(x > 42 for x in S), False)
222
Georg Brandl559e5d72008-06-11 18:37:52 +0000223 def test_ascii(self):
224 self.assertEqual(ascii(''), '\'\'')
225 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000226 self.assertEqual(ascii(()), '()')
227 self.assertEqual(ascii([]), '[]')
228 self.assertEqual(ascii({}), '{}')
229 a = []
230 a.append(a)
231 self.assertEqual(ascii(a), '[[...]]')
232 a = {}
233 a[0] = a
234 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000235 # Advanced checks for unicode strings
236 def _check_uni(s):
237 self.assertEqual(ascii(s), repr(s))
238 _check_uni("'")
239 _check_uni('"')
240 _check_uni('"\'')
241 _check_uni('\0')
242 _check_uni('\r\n\t .')
243 # Unprintable non-ASCII characters
244 _check_uni('\x85')
245 _check_uni('\u1fff')
246 _check_uni('\U00012fff')
247 # Lone surrogates
248 _check_uni('\ud800')
249 _check_uni('\udfff')
250 # Issue #9804: surrogates should be joined even for printable
251 # wide characters (UCS-2 builds).
252 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
253 # All together
254 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
255 self.assertEqual(ascii(s),
256 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000257
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000259 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000260 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000261 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262
Walter Dörwald919497e2003-01-19 16:23:59 +0000263 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000264 self.assertTrue(callable(len))
265 self.assertFalse(callable("a"))
266 self.assertTrue(callable(callable))
267 self.assertTrue(callable(lambda x, y: x + y))
268 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000269 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000270 self.assertTrue(callable(f))
271
272 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000273 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000274 self.assertTrue(callable(C1))
275 c = C1()
276 self.assertTrue(callable(c.meth))
277 self.assertFalse(callable(c))
278
279 # __call__ is looked up on the class, not the instance
280 c.__call__ = None
281 self.assertFalse(callable(c))
282 c.__call__ = lambda self: 0
283 self.assertFalse(callable(c))
284 del c.__call__
285 self.assertFalse(callable(c))
286
287 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000288 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000289 c2 = C2()
290 self.assertTrue(callable(c2))
291 c2.__call__ = None
292 self.assertTrue(callable(c2))
293 class C3(C2): pass
294 c3 = C3()
295 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000296
297 def test_chr(self):
298 self.assertEqual(chr(32), ' ')
299 self.assertEqual(chr(65), 'A')
300 self.assertEqual(chr(97), 'a')
301 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000302 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000303 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300304 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000305 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000306 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
307 self.assertEqual(chr(0x00010000), "\U00010000")
308 self.assertEqual(chr(0x00010001), "\U00010001")
309 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
310 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
311 self.assertEqual(chr(0x00100000), "\U00100000")
312 self.assertEqual(chr(0x00100001), "\U00100001")
313 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
314 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
315 self.assertRaises(ValueError, chr, -1)
316 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000317 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000318
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000319 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000320 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000321
Walter Dörwald919497e2003-01-19 16:23:59 +0000322 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000323 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000324 bom = b'\xef\xbb\xbf'
325 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000326 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300327 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
328 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000329 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000330 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000331 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
332 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300333 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
335 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000336 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300337 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000338 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000339
Georg Brandl8334fd92010-12-04 10:26:46 +0000340 # test the optimize argument
341
342 codestr = '''def f():
343 """doc"""
diana543386b2017-10-03 10:46:56 -0600344 debug_enabled = False
345 if __debug__:
346 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000347 try:
348 assert False
349 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200350 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000351 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200352 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000353 '''
354 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200355 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
356 (0, True, 'doc', True, True),
357 (1, False, 'doc', False, False),
358 (2, False, None, False, False)]
359 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000360 # test both direct compilation and compilation via AST
361 codeobjs = []
362 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
363 tree = ast.parse(codestr)
364 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
365 for code in codeobjs:
366 ns = {}
367 exec(code, ns)
368 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200369 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000370
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700371 def test_compile_top_level_await(self):
372 """Test whether code some top level await can be compiled.
373
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400374 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
375 set, and make sure the generated code object has the CO_COROUTINE flag
376 set in order to execute it with `await eval(.....)` instead of exec,
377 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700378 """
379
380 # helper function just to check we can run top=level async-for
381 async def arange(n):
382 for i in range(n):
383 yield i
384
385 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400386 code_samples = [
387 '''a = await asyncio.sleep(0, result=1)''',
388 '''async for i in arange(1):
389 a = 1''',
390 '''async with asyncio.Lock() as l:
391 a = 1'''
392 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700393 policy = maybe_get_event_loop_policy()
394 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400395 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700396 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400397 with self.assertRaises(
398 SyntaxError, msg=f"source={source} mode={mode}"):
399 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700400
401 co = compile(source,
402 '?',
403 mode,
404 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
405
406 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400407 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700408
409 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400410 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700411 async_f = FunctionType(co, globals_)
412 asyncio.run(async_f())
413 self.assertEqual(globals_['a'], 1)
414
415 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400416 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700417 asyncio.run(eval(co, globals_))
418 self.assertEqual(globals_['a'], 1)
419 finally:
420 asyncio.set_event_loop_policy(policy)
421
422 def test_compile_async_generator(self):
423 """
424 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400425 make sure AsyncGenerators are still properly not marked with the
426 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700427 """
428 code = dedent("""async def ticker():
429 for i in range(10):
430 yield i
431 await asyncio.sleep(0)""")
432
433 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
434 glob = {}
435 exec(co, glob)
436 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
437
Walter Dörwald919497e2003-01-19 16:23:59 +0000438 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000439 sys.spam = 1
440 delattr(sys, 'spam')
441 self.assertRaises(TypeError, delattr)
442
443 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000444 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000445 self.assertRaises(TypeError, dir, 42, 42)
446
Georg Brandle32b4222007-03-10 22:13:27 +0000447 # dir() - local scope
448 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000449 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000450
451 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000452 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000453
454 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000455 class Foo(types.ModuleType):
456 __dict__ = 8
457 f = Foo("foo")
458 self.assertRaises(TypeError, dir, f)
459
460 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000461 self.assertIn("strip", dir(str))
462 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000463
464 # dir(obj)
465 class Foo(object):
466 def __init__(self):
467 self.x = 7
468 self.y = 8
469 self.z = 9
470 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000471 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000472
473 # dir(obj_no__dict__)
474 class Foo(object):
475 __slots__ = []
476 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000477 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000478
479 # dir(obj_no__class__with__dict__)
480 # (an ugly trick to cause getattr(f, "__class__") to fail)
481 class Foo(object):
482 __slots__ = ["__class__", "__dict__"]
483 def __init__(self):
484 self.bar = "wow"
485 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000486 self.assertNotIn("__repr__", dir(f))
487 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000488
489 # dir(obj_using __dir__)
490 class Foo(object):
491 def __dir__(self):
492 return ["kan", "ga", "roo"]
493 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000494 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000495
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500496 # dir(obj__dir__tuple)
497 class Foo(object):
498 def __dir__(self):
499 return ("b", "c", "a")
500 res = dir(Foo())
501 self.assertIsInstance(res, list)
502 self.assertTrue(res == ["a", "b", "c"])
503
504 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000505 class Foo(object):
506 def __dir__(self):
507 return 7
508 f = Foo()
509 self.assertRaises(TypeError, dir, f)
510
Collin Winter3eed7652007-08-14 17:53:54 +0000511 # dir(traceback)
512 try:
513 raise IndexError
514 except:
515 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
516
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500517 # test that object has a __dir__()
518 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000519
Walter Dörwald919497e2003-01-19 16:23:59 +0000520 def test_divmod(self):
521 self.assertEqual(divmod(12, 7), (1, 5))
522 self.assertEqual(divmod(-12, 7), (-2, 2))
523 self.assertEqual(divmod(12, -7), (-2, -2))
524 self.assertEqual(divmod(-12, -7), (1, -5))
525
Mark Dickinson5c2db372009-12-05 20:28:34 +0000526 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000527
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000528 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
529 (-3.25, 1.0, (-4.0, 0.75)),
530 (3.25, -1.0, (-4.0, -0.75)),
531 (-3.25, -1.0, (3.0, -0.25))]:
532 result = divmod(num, denom)
533 self.assertAlmostEqual(result[0], exp_result[0])
534 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000535
536 self.assertRaises(TypeError, divmod)
537
538 def test_eval(self):
539 self.assertEqual(eval('1+1'), 2)
540 self.assertEqual(eval(' 1+1\n'), 2)
541 globals = {'a': 1, 'b': 2}
542 locals = {'b': 200, 'c': 300}
543 self.assertEqual(eval('a', globals) , 1)
544 self.assertEqual(eval('a', globals, locals), 1)
545 self.assertEqual(eval('b', globals, locals), 200)
546 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000547 globals = {'a': 1, 'b': 2}
548 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000549 bom = b'\xef\xbb\xbf'
550 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000551 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000552 self.assertRaises(TypeError, eval)
553 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000554 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000555
Benjamin Peterson92722792012-12-15 12:51:05 -0500556 class X:
557 def __getitem__(self, key):
558 raise ValueError
559 self.assertRaises(ValueError, eval, "foo", {}, X())
560
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000561 def test_general_eval(self):
562 # Tests that general mappings can be used for the locals argument
563
564 class M:
565 "Test mapping interface versus possible calls from eval()."
566 def __getitem__(self, key):
567 if key == 'a':
568 return 12
569 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000570 def keys(self):
571 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000572
573 m = M()
574 g = globals()
575 self.assertEqual(eval('a', g, m), 12)
576 self.assertRaises(NameError, eval, 'b', g, m)
577 self.assertEqual(eval('dir()', g, m), list('xyz'))
578 self.assertEqual(eval('globals()', g, m), g)
579 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000580 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000581 class A:
582 "Non-mapping"
583 pass
584 m = A()
585 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000586
587 # Verify that dict subclasses work as well
588 class D(dict):
589 def __getitem__(self, key):
590 if key == 'a':
591 return 12
592 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000593 def keys(self):
594 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000595
596 d = D()
597 self.assertEqual(eval('a', g, d), 12)
598 self.assertRaises(NameError, eval, 'b', g, d)
599 self.assertEqual(eval('dir()', g, d), list('xyz'))
600 self.assertEqual(eval('globals()', g, d), g)
601 self.assertEqual(eval('locals()', g, d), d)
602
603 # Verify locals stores (used by list comps)
604 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000605 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000606
607 class SpreadSheet:
608 "Sample application showing nested, calculated lookups."
609 _cells = {}
610 def __setitem__(self, key, formula):
611 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000612 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000613 return eval(self._cells[key], globals(), self)
614
615 ss = SpreadSheet()
616 ss['a1'] = '5'
617 ss['a2'] = 'a1*6'
618 ss['a3'] = 'a2*7'
619 self.assertEqual(ss['a3'], 210)
620
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000621 # Verify that dir() catches a non-list returned by eval
622 # SF bug #1004669
623 class C:
624 def __getitem__(self, item):
625 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000626 def keys(self):
627 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000628 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
629
Georg Brandl7cae87c2006-09-06 06:51:57 +0000630 def test_exec(self):
631 g = {}
632 exec('z = 1', g)
633 if '__builtins__' in g:
634 del g['__builtins__']
635 self.assertEqual(g, {'z': 1})
636
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000637 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000638 if '__builtins__' in g:
639 del g['__builtins__']
640 self.assertEqual(g, {'z': 2})
641 g = {}
642 l = {}
643
Brett Cannon77628992010-03-20 20:59:33 +0000644 with check_warnings():
645 warnings.filterwarnings("ignore", "global statement",
646 module="<string>")
647 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000648 if '__builtins__' in g:
649 del g['__builtins__']
650 if '__builtins__' in l:
651 del l['__builtins__']
652 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
653
Victor Stinnerb0b22422012-04-19 00:57:45 +0200654 def test_exec_globals(self):
655 code = compile("print('Hello World!')", "", "exec")
656 # no builtin function
657 self.assertRaisesRegex(NameError, "name 'print' is not defined",
658 exec, code, {'__builtins__': {}})
659 # __builtins__ must be a mapping type
660 self.assertRaises(TypeError,
661 exec, code, {'__builtins__': 123})
662
663 # no __build_class__ function
664 code = compile("class A: pass", "", "exec")
665 self.assertRaisesRegex(NameError, "__build_class__ not found",
666 exec, code, {'__builtins__': {}})
667
668 class frozendict_error(Exception):
669 pass
670
671 class frozendict(dict):
672 def __setitem__(self, key, value):
673 raise frozendict_error("frozendict is readonly")
674
675 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400676 if isinstance(__builtins__, types.ModuleType):
677 frozen_builtins = frozendict(__builtins__.__dict__)
678 else:
679 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200680 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
681 self.assertRaises(frozendict_error,
682 exec, code, {'__builtins__': frozen_builtins})
683
684 # read-only globals
685 namespace = frozendict({})
686 code = compile("x=1", "test", "exec")
687 self.assertRaises(frozendict_error,
688 exec, code, namespace)
689
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000690 def test_exec_redirected(self):
691 savestdout = sys.stdout
692 sys.stdout = None # Whatever that cannot flush()
693 try:
694 # Used to raise SystemError('error return without exception set')
695 exec('a')
696 except NameError:
697 pass
698 finally:
699 sys.stdout = savestdout
700
Walter Dörwald919497e2003-01-19 16:23:59 +0000701 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000702 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
703 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
704 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
705 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
706 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000707 def identity(item):
708 return 1
709 filter(identity, Squares(5))
710 self.assertRaises(TypeError, filter)
711 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000712 def __getitem__(self, index):
713 if index<4:
714 return 42
715 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000716 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000717 def badfunc():
718 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000719 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000720
Walter Dörwaldbf517072003-01-27 15:57:14 +0000721 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000722 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
723 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
724 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000725
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000726 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200727 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
728 f1 = filter(filter_char, "abcdeabcde")
729 f2 = filter(filter_char, "abcdeabcde")
730 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000731
Walter Dörwald919497e2003-01-19 16:23:59 +0000732 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000733 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 self.assertRaises(TypeError, getattr, sys, 1)
735 self.assertRaises(TypeError, getattr, sys, 1, "foo")
736 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000737 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000738 # unicode surrogates are not encodable to the default encoding (utf8)
739 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000740
741 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000742 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000743 self.assertRaises(TypeError, hasattr, sys, 1)
744 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000745 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000746
Benjamin Peterson17689992010-08-24 03:26:23 +0000747 # Check that hasattr propagates all exceptions outside of
748 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000749 class A:
750 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000751 raise SystemExit
752 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000753 class B:
754 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000755 raise ValueError
756 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000757
Walter Dörwald919497e2003-01-19 16:23:59 +0000758 def test_hash(self):
759 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000760 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000761 self.assertEqual(hash(1), hash(1.0))
762 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000763 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000764 hash((0,1,2,3))
765 def f(): pass
766 self.assertRaises(TypeError, hash, [])
767 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000768 # Bug 1536021: Allow hash to return long objects
769 class X:
770 def __hash__(self):
771 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000772 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000773 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000774 def __hash__(self):
775 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000776 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000777
778 def test_hex(self):
779 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000780 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 self.assertRaises(TypeError, hex, {})
782
783 def test_id(self):
784 id(None)
785 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000786 id(1.0)
787 id('spam')
788 id((0,1,2,3))
789 id([0,1,2,3])
790 id({'spam': 1, 'eggs': 2, 'ham': 3})
791
Guido van Rossuma88a0332007-02-26 16:59:55 +0000792 # Test input() later, alphabetized as if it were raw_input
793
Walter Dörwald919497e2003-01-19 16:23:59 +0000794 def test_iter(self):
795 self.assertRaises(TypeError, iter)
796 self.assertRaises(TypeError, iter, 42, 42)
797 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000798 for l in lists:
799 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000800 self.assertEqual(next(i), '1')
801 self.assertEqual(next(i), '2')
802 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000803
804 def test_isinstance(self):
805 class C:
806 pass
807 class D(C):
808 pass
809 class E:
810 pass
811 c = C()
812 d = D()
813 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000814 self.assertTrue(isinstance(c, C))
815 self.assertTrue(isinstance(d, C))
816 self.assertTrue(not isinstance(e, C))
817 self.assertTrue(not isinstance(c, D))
818 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000819 self.assertRaises(TypeError, isinstance, E, 'foo')
820 self.assertRaises(TypeError, isinstance)
821
822 def test_issubclass(self):
823 class C:
824 pass
825 class D(C):
826 pass
827 class E:
828 pass
829 c = C()
830 d = D()
831 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000832 self.assertTrue(issubclass(D, C))
833 self.assertTrue(issubclass(C, C))
834 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 self.assertRaises(TypeError, issubclass, 'foo', E)
836 self.assertRaises(TypeError, issubclass, E, 'foo')
837 self.assertRaises(TypeError, issubclass)
838
839 def test_len(self):
840 self.assertEqual(len('123'), 3)
841 self.assertEqual(len(()), 0)
842 self.assertEqual(len((1, 2, 3, 4)), 4)
843 self.assertEqual(len([1, 2, 3, 4]), 4)
844 self.assertEqual(len({}), 0)
845 self.assertEqual(len({'a':1, 'b': 2}), 2)
846 class BadSeq:
847 def __len__(self):
848 raise ValueError
849 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000850 class InvalidLen:
851 def __len__(self):
852 return None
853 self.assertRaises(TypeError, len, InvalidLen())
854 class FloatLen:
855 def __len__(self):
856 return 4.5
857 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300858 class NegativeLen:
859 def __len__(self):
860 return -10
861 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000862 class HugeLen:
863 def __len__(self):
864 return sys.maxsize + 1
865 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300866 class HugeNegativeLen:
867 def __len__(self):
868 return -sys.maxsize-10
869 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000870 class NoLenMethod(object): pass
871 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000872
Walter Dörwald919497e2003-01-19 16:23:59 +0000873 def test_map(self):
874 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000875 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000876 [1, 4, 9]
877 )
878 try:
879 from math import sqrt
880 except ImportError:
881 def sqrt(x):
882 return pow(x, 0.5)
883 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000884 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000885 [[4.0, 2.0], [9.0, 3.0]]
886 )
887 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000888 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000889 [10, 4, 6]
890 )
891
892 def plus(*v):
893 accu = 0
894 for i in v: accu = accu + i
895 return accu
896 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000897 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000898 [1, 3, 7]
899 )
900 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000901 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 [1+4, 3+9, 7+2]
903 )
904 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000905 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 [1+4+1, 3+9+1, 7+2+0]
907 )
908 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000909 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000910 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
911 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000912 def Max(a, b):
913 if a is None:
914 return b
915 if b is None:
916 return a
917 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000918 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000919 list(map(Max, Squares(3), Squares(2))),
920 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000921 )
922 self.assertRaises(TypeError, map)
923 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000924 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000925 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000926 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000927 yield None
928 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000929 def badfunc(x):
930 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000931 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000932
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000933 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200934 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
935 m1 = map(map_char, "Is this the real life?")
936 m2 = map(map_char, "Is this the real life?")
937 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000938
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 def test_max(self):
940 self.assertEqual(max('123123'), '3')
941 self.assertEqual(max(1, 2, 3), 3)
942 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
943 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
944
Guido van Rossume2a383d2007-01-15 16:59:06 +0000945 self.assertEqual(max(1, 2, 3.0), 3.0)
946 self.assertEqual(max(1, 2.0, 3), 3)
947 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000948
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700949 self.assertRaises(TypeError, max)
950 self.assertRaises(TypeError, max, 42)
951 self.assertRaises(ValueError, max, ())
952 class BadSeq:
953 def __getitem__(self, index):
954 raise ValueError
955 self.assertRaises(ValueError, max, BadSeq())
956
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000957 for stmt in (
958 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700959 "max(default=None)",
960 "max(1, 2, default=None)", # require container for default
961 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000962 "max(1, key=int)", # single arg not iterable
963 "max(1, 2, keystone=int)", # wrong keyword
964 "max(1, 2, key=int, abc=int)", # two many keywords
965 "max(1, 2, key=1)", # keyfunc is not callable
966 ):
Tim Peters7f061872004-12-07 21:17:46 +0000967 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000968 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000969 except TypeError:
970 pass
971 else:
972 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000973
974 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
975 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
976 self.assertEqual(max(1, 2, key=neg), 1) # two elems
977
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700978 self.assertEqual(max((), default=None), None) # zero elem iterable
979 self.assertEqual(max((1,), default=None), 1) # one elem iterable
980 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
981
982 self.assertEqual(max((), default=1, key=neg), 1)
983 self.assertEqual(max((1, 2), default=3, key=neg), 1)
984
Alexander Marshalove22072f2018-07-24 10:58:21 +0700985 self.assertEqual(max((1, 2), key=None), 2)
986
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000987 data = [random.randrange(200) for i in range(100)]
988 keys = dict((elem, random.randrange(50)) for elem in data)
989 f = keys.__getitem__
990 self.assertEqual(max(data, key=f),
991 sorted(reversed(data), key=f)[-1])
992
Walter Dörwald919497e2003-01-19 16:23:59 +0000993 def test_min(self):
994 self.assertEqual(min('123123'), '1')
995 self.assertEqual(min(1, 2, 3), 1)
996 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
997 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
998
Guido van Rossume2a383d2007-01-15 16:59:06 +0000999 self.assertEqual(min(1, 2, 3.0), 1)
1000 self.assertEqual(min(1, 2.0, 3), 1)
1001 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001002
1003 self.assertRaises(TypeError, min)
1004 self.assertRaises(TypeError, min, 42)
1005 self.assertRaises(ValueError, min, ())
1006 class BadSeq:
1007 def __getitem__(self, index):
1008 raise ValueError
1009 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001010
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001011 for stmt in (
1012 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001013 "min(default=None)",
1014 "min(1, 2, default=None)", # require container for default
1015 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001016 "min(1, key=int)", # single arg not iterable
1017 "min(1, 2, keystone=int)", # wrong keyword
1018 "min(1, 2, key=int, abc=int)", # two many keywords
1019 "min(1, 2, key=1)", # keyfunc is not callable
1020 ):
Tim Peters7f061872004-12-07 21:17:46 +00001021 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001022 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001023 except TypeError:
1024 pass
1025 else:
1026 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001027
1028 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1029 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1030 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1031
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001032 self.assertEqual(min((), default=None), None) # zero elem iterable
1033 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1034 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1035
1036 self.assertEqual(min((), default=1, key=neg), 1)
1037 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1038
Alexander Marshalove22072f2018-07-24 10:58:21 +07001039 self.assertEqual(min((1, 2), key=None), 1)
1040
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001041 data = [random.randrange(200) for i in range(100)]
1042 keys = dict((elem, random.randrange(50)) for elem in data)
1043 f = keys.__getitem__
1044 self.assertEqual(min(data, key=f),
1045 sorted(data, key=f)[0])
1046
Georg Brandla18af4e2007-04-21 15:47:16 +00001047 def test_next(self):
1048 it = iter(range(2))
1049 self.assertEqual(next(it), 0)
1050 self.assertEqual(next(it), 1)
1051 self.assertRaises(StopIteration, next, it)
1052 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001053 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001054
1055 class Iter(object):
1056 def __iter__(self):
1057 return self
1058 def __next__(self):
1059 raise StopIteration
1060
1061 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001062 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001063 self.assertRaises(StopIteration, next, it)
1064
1065 def gen():
1066 yield 1
1067 return
1068
1069 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001071 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001072 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001073
Walter Dörwald919497e2003-01-19 16:23:59 +00001074 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001075 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001076 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 self.assertRaises(TypeError, oct, ())
1078
1079 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001080 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001081 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001082 self.addCleanup(unlink, TESTFN)
1083 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001084 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001085 fp.write('The quick brown fox jumps over the lazy dog')
1086 fp.write('.\n')
1087 fp.write('Dear John\n')
1088 fp.write('XXX'*100)
1089 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001090
1091 def test_open(self):
1092 self.write_testfile()
1093 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001094 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001095 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001096 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1097 self.assertEqual(fp.readline(4), 'Dear')
1098 self.assertEqual(fp.readline(100), ' John\n')
1099 self.assertEqual(fp.read(300), 'XXX'*100)
1100 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001101
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001102 # embedded null bytes and characters
1103 self.assertRaises(ValueError, open, 'a\x00b')
1104 self.assertRaises(ValueError, open, b'a\x00b')
1105
Victor Stinner91106cd2017-12-13 12:29:09 +01001106 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001107 def test_open_default_encoding(self):
1108 old_environ = dict(os.environ)
1109 try:
1110 # try to get a user preferred encoding different than the current
1111 # locale encoding to check that open() uses the current locale
1112 # encoding and not the user preferred encoding
1113 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1114 if key in os.environ:
1115 del os.environ[key]
1116
1117 self.write_testfile()
1118 current_locale_encoding = locale.getpreferredencoding(False)
1119 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001120 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001121 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001122 finally:
1123 os.environ.clear()
1124 os.environ.update(old_environ)
1125
Victor Stinnerdaf45552013-08-28 00:53:59 +02001126 def test_open_non_inheritable(self):
1127 fileobj = open(__file__)
1128 with fileobj:
1129 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1130
Walter Dörwald919497e2003-01-19 16:23:59 +00001131 def test_ord(self):
1132 self.assertEqual(ord(' '), 32)
1133 self.assertEqual(ord('A'), 65)
1134 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001135 self.assertEqual(ord('\x80'), 128)
1136 self.assertEqual(ord('\xff'), 255)
1137
1138 self.assertEqual(ord(b' '), 32)
1139 self.assertEqual(ord(b'A'), 65)
1140 self.assertEqual(ord(b'a'), 97)
1141 self.assertEqual(ord(b'\x80'), 128)
1142 self.assertEqual(ord(b'\xff'), 255)
1143
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001144 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001145 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001146
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001147 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1148 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1149 self.assertEqual(ord("\U00010000"), 0x00010000)
1150 self.assertEqual(ord("\U00010001"), 0x00010001)
1151 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1152 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1153 self.assertEqual(ord("\U00100000"), 0x00100000)
1154 self.assertEqual(ord("\U00100001"), 0x00100001)
1155 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1156 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1157
Walter Dörwald919497e2003-01-19 16:23:59 +00001158 def test_pow(self):
1159 self.assertEqual(pow(0,0), 1)
1160 self.assertEqual(pow(0,1), 0)
1161 self.assertEqual(pow(1,0), 1)
1162 self.assertEqual(pow(1,1), 1)
1163
1164 self.assertEqual(pow(2,0), 1)
1165 self.assertEqual(pow(2,10), 1024)
1166 self.assertEqual(pow(2,20), 1024*1024)
1167 self.assertEqual(pow(2,30), 1024*1024*1024)
1168
1169 self.assertEqual(pow(-2,0), 1)
1170 self.assertEqual(pow(-2,1), -2)
1171 self.assertEqual(pow(-2,2), 4)
1172 self.assertEqual(pow(-2,3), -8)
1173
Walter Dörwald919497e2003-01-19 16:23:59 +00001174 self.assertAlmostEqual(pow(0.,0), 1.)
1175 self.assertAlmostEqual(pow(0.,1), 0.)
1176 self.assertAlmostEqual(pow(1.,0), 1.)
1177 self.assertAlmostEqual(pow(1.,1), 1.)
1178
1179 self.assertAlmostEqual(pow(2.,0), 1.)
1180 self.assertAlmostEqual(pow(2.,10), 1024.)
1181 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1182 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1183
1184 self.assertAlmostEqual(pow(-2.,0), 1.)
1185 self.assertAlmostEqual(pow(-2.,1), -2.)
1186 self.assertAlmostEqual(pow(-2.,2), 4.)
1187 self.assertAlmostEqual(pow(-2.,3), -8.)
1188
Mark Dickinson5c2db372009-12-05 20:28:34 +00001189 for x in 2, 2.0:
1190 for y in 10, 10.0:
1191 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 if isinstance(x, float) or \
1193 isinstance(y, float) or \
1194 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001195 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001196 else:
1197 self.assertAlmostEqual(pow(x, y, z), 24.0)
1198
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001199 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1200 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1201
Mark Dickinsonc5299672019-06-02 10:24:06 +01001202 # See test_pow for additional tests for three-argument pow.
1203 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001204 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001205
1206 self.assertRaises(TypeError, pow)
1207
Guido van Rossuma88a0332007-02-26 16:59:55 +00001208 def test_input(self):
1209 self.write_testfile()
1210 fp = open(TESTFN, 'r')
1211 savestdin = sys.stdin
1212 savestdout = sys.stdout # Eats the echo
1213 try:
1214 sys.stdin = fp
1215 sys.stdout = BitBucket()
1216 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001217 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1218 self.assertEqual(input('testing\n'), 'Dear John')
1219
1220 # SF 1535165: don't segfault on closed stdin
1221 # sys.stdout must be a regular file for triggering
1222 sys.stdout = savestdout
1223 sys.stdin.close()
1224 self.assertRaises(ValueError, input)
1225
1226 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001227 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001228 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001229 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001230 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001231 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001232 self.assertRaises(EOFError, input)
1233
1234 del sys.stdout
1235 self.assertRaises(RuntimeError, input, 'prompt')
1236 del sys.stdin
1237 self.assertRaises(RuntimeError, input, 'prompt')
1238 finally:
1239 sys.stdin = savestdin
1240 sys.stdout = savestdout
1241 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001242
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001243 # test_int(): see test_int.py for tests of built-in function int().
1244
Walter Dörwald919497e2003-01-19 16:23:59 +00001245 def test_repr(self):
1246 self.assertEqual(repr(''), '\'\'')
1247 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001248 self.assertEqual(repr(()), '()')
1249 self.assertEqual(repr([]), '[]')
1250 self.assertEqual(repr({}), '{}')
1251 a = []
1252 a.append(a)
1253 self.assertEqual(repr(a), '[[...]]')
1254 a = {}
1255 a[0] = a
1256 self.assertEqual(repr(a), '{0: {...}}')
1257
1258 def test_round(self):
1259 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001260 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001261 self.assertEqual(round(1.0), 1.0)
1262 self.assertEqual(round(10.0), 10.0)
1263 self.assertEqual(round(1000000000.0), 1000000000.0)
1264 self.assertEqual(round(1e20), 1e20)
1265
1266 self.assertEqual(round(-1.0), -1.0)
1267 self.assertEqual(round(-10.0), -10.0)
1268 self.assertEqual(round(-1000000000.0), -1000000000.0)
1269 self.assertEqual(round(-1e20), -1e20)
1270
1271 self.assertEqual(round(0.1), 0.0)
1272 self.assertEqual(round(1.1), 1.0)
1273 self.assertEqual(round(10.1), 10.0)
1274 self.assertEqual(round(1000000000.1), 1000000000.0)
1275
1276 self.assertEqual(round(-1.1), -1.0)
1277 self.assertEqual(round(-10.1), -10.0)
1278 self.assertEqual(round(-1000000000.1), -1000000000.0)
1279
1280 self.assertEqual(round(0.9), 1.0)
1281 self.assertEqual(round(9.9), 10.0)
1282 self.assertEqual(round(999999999.9), 1000000000.0)
1283
1284 self.assertEqual(round(-0.9), -1.0)
1285 self.assertEqual(round(-9.9), -10.0)
1286 self.assertEqual(round(-999999999.9), -1000000000.0)
1287
1288 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001289 self.assertEqual(type(round(-8.0, -1)), float)
1290
1291 self.assertEqual(type(round(-8.0, 0)), float)
1292 self.assertEqual(type(round(-8.0, 1)), float)
1293
1294 # Check even / odd rounding behaviour
1295 self.assertEqual(round(5.5), 6)
1296 self.assertEqual(round(6.5), 6)
1297 self.assertEqual(round(-5.5), -6)
1298 self.assertEqual(round(-6.5), -6)
1299
1300 # Check behavior on ints
1301 self.assertEqual(round(0), 0)
1302 self.assertEqual(round(8), 8)
1303 self.assertEqual(round(-8), -8)
1304 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001305 self.assertEqual(type(round(-8, -1)), int)
1306 self.assertEqual(type(round(-8, 0)), int)
1307 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 # test new kwargs
1310 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1311
Walter Dörwald919497e2003-01-19 16:23:59 +00001312 self.assertRaises(TypeError, round)
1313
Alex Martelliae211f92007-08-22 23:21:33 +00001314 # test generic rounding delegation for reals
1315 class TestRound:
1316 def __round__(self):
1317 return 23
1318
1319 class TestNoRound:
1320 pass
1321
1322 self.assertEqual(round(TestRound()), 23)
1323
1324 self.assertRaises(TypeError, round, 1, 2, 3)
1325 self.assertRaises(TypeError, round, TestNoRound())
1326
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001327 t = TestNoRound()
1328 t.__round__ = lambda *args: args
1329 self.assertRaises(TypeError, round, t)
1330 self.assertRaises(TypeError, round, t, 0)
1331
Mark Dickinsonad731b92009-11-09 17:12:30 +00001332 # Some versions of glibc for alpha have a bug that affects
1333 # float -> integer rounding (floor, ceil, rint, round) for
1334 # values in the range [2**52, 2**53). See:
1335 #
1336 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1337 #
1338 # We skip this test on Linux/alpha if it would fail.
1339 linux_alpha = (platform.system().startswith('Linux') and
1340 platform.machine().startswith('alpha'))
1341 system_round_bug = round(5e15+1) != 5e15+1
1342 @unittest.skipIf(linux_alpha and system_round_bug,
1343 "test will fail; failure is probably due to a "
1344 "buggy system round function")
1345 def test_round_large(self):
1346 # Issue #1869: integral floats should remain unchanged
1347 self.assertEqual(round(5e15-1), 5e15-1)
1348 self.assertEqual(round(5e15), 5e15)
1349 self.assertEqual(round(5e15+1), 5e15+1)
1350 self.assertEqual(round(5e15+2), 5e15+2)
1351 self.assertEqual(round(5e15+3), 5e15+3)
1352
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001353 def test_bug_27936(self):
1354 # Verify that ndigits=None means the same as passing in no argument
1355 for x in [1234,
1356 1234.56,
1357 decimal.Decimal('1234.56'),
1358 fractions.Fraction(123456, 100)]:
1359 self.assertEqual(round(x, None), round(x))
1360 self.assertEqual(type(round(x, None)), type(round(x)))
1361
Walter Dörwald919497e2003-01-19 16:23:59 +00001362 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001363 setattr(sys, 'spam', 1)
1364 self.assertEqual(sys.spam, 1)
1365 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1366 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001367
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001368 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001369
Alex Martellia70b1912003-04-22 08:12:33 +00001370 def test_sum(self):
1371 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001372 self.assertEqual(sum(list(range(2,8))), 27)
1373 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001374 self.assertEqual(sum(Squares(10)), 285)
1375 self.assertEqual(sum(iter(Squares(10))), 285)
1376 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1377
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001378 self.assertEqual(sum(range(10), 1000), 1045)
1379 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001380 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1381 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1382
1383 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1384 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1385 2**31+2)
1386 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1387 2**63+2)
1388 self.assertIs(sum([], False), False)
1389
1390 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1391 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1392 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1393 self.assertEqual(sum([0.5, 1]), 1.5)
1394 self.assertEqual(sum([1, 0.5]), 1.5)
1395 self.assertEqual(repr(sum([-0.0])), '0.0')
1396 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1397 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001398
Alex Martellia70b1912003-04-22 08:12:33 +00001399 self.assertRaises(TypeError, sum)
1400 self.assertRaises(TypeError, sum, 42)
1401 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1402 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001403 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1404 values = [bytearray(b'a'), bytearray(b'b')]
1405 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001406 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1407 self.assertRaises(TypeError, sum, [{2:3}])
1408 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001409 self.assertRaises(TypeError, sum, [], '')
1410 self.assertRaises(TypeError, sum, [], b'')
1411 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001412
1413 class BadSeq:
1414 def __getitem__(self, index):
1415 raise ValueError
1416 self.assertRaises(ValueError, sum, BadSeq())
1417
Mark Dickinson3a22b472009-10-17 21:48:16 +00001418 empty = []
1419 sum(([x] for x in range(10)), empty)
1420 self.assertEqual(empty, [])
1421
Walter Dörwald919497e2003-01-19 16:23:59 +00001422 def test_type(self):
1423 self.assertEqual(type(''), type('123'))
1424 self.assertNotEqual(type(''), type(()))
1425
Guido van Rossumfee7b932005-01-16 00:21:28 +00001426 # We don't want self in vars(), so these are static methods
1427
1428 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001429 def get_vars_f0():
1430 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001431
Guido van Rossumfee7b932005-01-16 00:21:28 +00001432 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001433 def get_vars_f2():
1434 BuiltinTest.get_vars_f0()
1435 a = 1
1436 b = 2
1437 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001438
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001439 class C_get_vars(object):
1440 def getDict(self):
1441 return {'a':2}
1442 __dict__ = property(fget=getDict)
1443
Walter Dörwald919497e2003-01-19 16:23:59 +00001444 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001445 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001446 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001447 self.assertEqual(self.get_vars_f0(), {})
1448 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1449 self.assertRaises(TypeError, vars, 42, 42)
1450 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001451 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001452
1453 def test_zip(self):
1454 a = (1, 2, 3)
1455 b = (4, 5, 6)
1456 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001457 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001458 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001459 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001461 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001462 class I:
1463 def __getitem__(self, i):
1464 if i < 0 or i > 2: raise IndexError
1465 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001466 self.assertEqual(list(zip(a, I())), t)
1467 self.assertEqual(list(zip()), [])
1468 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001469 self.assertRaises(TypeError, zip, None)
1470 class G:
1471 pass
1472 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001473 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001474
1475 # Make sure zip doesn't try to allocate a billion elements for the
1476 # result list when one of its arguments doesn't say how long it is.
1477 # A MemoryError is the most likely failure mode.
1478 class SequenceWithoutALength:
1479 def __getitem__(self, i):
1480 if i == 5:
1481 raise IndexError
1482 else:
1483 return i
1484 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001485 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001486 list(enumerate(range(5)))
1487 )
1488
1489 class BadSeq:
1490 def __getitem__(self, i):
1491 if i == 5:
1492 raise ValueError
1493 else:
1494 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001495 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001496
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001497 def test_zip_pickle(self):
1498 a = (1, 2, 3)
1499 b = (4, 5, 6)
1500 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001501 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1502 z1 = zip(a, b)
1503 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001504
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001505 def test_zip_bad_iterable(self):
1506 exception = TypeError()
1507
1508 class BadIterable:
1509 def __iter__(self):
1510 raise exception
1511
1512 with self.assertRaises(TypeError) as cm:
1513 zip(BadIterable())
1514
1515 self.assertIs(cm.exception, exception)
1516
Eric Smithe4d63172010-09-13 20:48:43 +00001517 def test_format(self):
1518 # Test the basic machinery of the format() builtin. Don't test
1519 # the specifics of the various formatters
1520 self.assertEqual(format(3, ''), '3')
1521
1522 # Returns some classes to use for various tests. There's
1523 # an old-style version, and a new-style version
1524 def classes_new():
1525 class A(object):
1526 def __init__(self, x):
1527 self.x = x
1528 def __format__(self, format_spec):
1529 return str(self.x) + format_spec
1530 class DerivedFromA(A):
1531 pass
1532
1533 class Simple(object): pass
1534 class DerivedFromSimple(Simple):
1535 def __init__(self, x):
1536 self.x = x
1537 def __format__(self, format_spec):
1538 return str(self.x) + format_spec
1539 class DerivedFromSimple2(DerivedFromSimple): pass
1540 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1541
1542 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1543 self.assertEqual(format(A(3), 'spec'), '3spec')
1544 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1545 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1546 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1547 '10abcdef')
1548
1549 class_test(*classes_new())
1550
1551 def empty_format_spec(value):
1552 # test that:
1553 # format(x, '') == str(x)
1554 # format(x) == str(x)
1555 self.assertEqual(format(value, ""), str(value))
1556 self.assertEqual(format(value), str(value))
1557
1558 # for builtin types, format(x, "") == str(x)
1559 empty_format_spec(17**13)
1560 empty_format_spec(1.0)
1561 empty_format_spec(3.1415e104)
1562 empty_format_spec(-3.1415e104)
1563 empty_format_spec(3.1415e-104)
1564 empty_format_spec(-3.1415e-104)
1565 empty_format_spec(object)
1566 empty_format_spec(None)
1567
1568 # TypeError because self.__format__ returns the wrong type
1569 class BadFormatResult:
1570 def __format__(self, format_spec):
1571 return 1.0
1572 self.assertRaises(TypeError, format, BadFormatResult(), "")
1573
1574 # TypeError because format_spec is not unicode or str
1575 self.assertRaises(TypeError, format, object(), 4)
1576 self.assertRaises(TypeError, format, object(), object())
1577
1578 # tests for object.__format__ really belong elsewhere, but
1579 # there's no good place to put them
1580 x = object().__format__('')
1581 self.assertTrue(x.startswith('<object object at'))
1582
1583 # first argument to object.__format__ must be string
1584 self.assertRaises(TypeError, object().__format__, 3)
1585 self.assertRaises(TypeError, object().__format__, object())
1586 self.assertRaises(TypeError, object().__format__, None)
1587
1588 # --------------------------------------------------------------------
1589 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001590 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001591 class A:
1592 def __format__(self, fmt_str):
1593 return format('', fmt_str)
1594
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001595 self.assertEqual(format(A()), '')
1596 self.assertEqual(format(A(), ''), '')
1597 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001598
1599 class B:
1600 pass
1601
1602 class C(object):
1603 pass
1604
1605 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001606 obj = cls()
1607 self.assertEqual(format(obj), str(obj))
1608 self.assertEqual(format(obj, ''), str(obj))
1609 with self.assertRaisesRegex(TypeError,
1610 r'\b%s\b' % re.escape(cls.__name__)):
1611 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001612 # --------------------------------------------------------------------
1613
1614 # make sure we can take a subclass of str as a format spec
1615 class DerivedFromStr(str): pass
1616 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1617
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001618 def test_bin(self):
1619 self.assertEqual(bin(0), '0b0')
1620 self.assertEqual(bin(1), '0b1')
1621 self.assertEqual(bin(-1), '-0b1')
1622 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1623 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1624 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1625 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1626
Georg Brandl953152f2009-07-22 12:03:59 +00001627 def test_bytearray_translate(self):
1628 x = bytearray(b"abc")
1629 self.assertRaises(ValueError, x.translate, b"1", 1)
1630 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1631
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001632 def test_bytearray_extend_error(self):
1633 array = bytearray()
1634 bad_iter = map(int, "X")
1635 self.assertRaises(ValueError, array.extend, bad_iter)
1636
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001637 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001638 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001639 tp = type(const)
1640 self.assertIs(tp(), const)
1641 self.assertRaises(TypeError, tp, 1, 2)
1642 self.assertRaises(TypeError, tp, a=1, b=2)
1643
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001644
1645class TestBreakpoint(unittest.TestCase):
1646 def setUp(self):
1647 # These tests require a clean slate environment. For example, if the
1648 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1649 # will mess up these tests. Similarly for sys.breakpointhook.
1650 # Cleaning the slate here means you can't use breakpoint() to debug
1651 # these tests, but I think that's okay. Just use pdb.set_trace() if
1652 # you must.
1653 self.resources = ExitStack()
1654 self.addCleanup(self.resources.close)
1655 self.env = self.resources.enter_context(EnvironmentVarGuard())
1656 del self.env['PYTHONBREAKPOINT']
1657 self.resources.enter_context(
1658 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1659
1660 def test_breakpoint(self):
1661 with patch('pdb.set_trace') as mock:
1662 breakpoint()
1663 mock.assert_called_once()
1664
1665 def test_breakpoint_with_breakpointhook_set(self):
1666 my_breakpointhook = MagicMock()
1667 sys.breakpointhook = my_breakpointhook
1668 breakpoint()
1669 my_breakpointhook.assert_called_once_with()
1670
1671 def test_breakpoint_with_breakpointhook_reset(self):
1672 my_breakpointhook = MagicMock()
1673 sys.breakpointhook = my_breakpointhook
1674 breakpoint()
1675 my_breakpointhook.assert_called_once_with()
1676 # Reset the hook and it will not be called again.
1677 sys.breakpointhook = sys.__breakpointhook__
1678 with patch('pdb.set_trace') as mock:
1679 breakpoint()
1680 mock.assert_called_once_with()
1681 my_breakpointhook.assert_called_once_with()
1682
1683 def test_breakpoint_with_args_and_keywords(self):
1684 my_breakpointhook = MagicMock()
1685 sys.breakpointhook = my_breakpointhook
1686 breakpoint(1, 2, 3, four=4, five=5)
1687 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1688
1689 def test_breakpoint_with_passthru_error(self):
1690 def my_breakpointhook():
1691 pass
1692 sys.breakpointhook = my_breakpointhook
1693 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1694
1695 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1696 def test_envar_good_path_builtin(self):
1697 self.env['PYTHONBREAKPOINT'] = 'int'
1698 with patch('builtins.int') as mock:
1699 breakpoint('7')
1700 mock.assert_called_once_with('7')
1701
1702 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1703 def test_envar_good_path_other(self):
1704 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1705 with patch('sys.exit') as mock:
1706 breakpoint()
1707 mock.assert_called_once_with()
1708
1709 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1710 def test_envar_good_path_noop_0(self):
1711 self.env['PYTHONBREAKPOINT'] = '0'
1712 with patch('pdb.set_trace') as mock:
1713 breakpoint()
1714 mock.assert_not_called()
1715
1716 def test_envar_good_path_empty_string(self):
1717 # PYTHONBREAKPOINT='' is the same as it not being set.
1718 self.env['PYTHONBREAKPOINT'] = ''
1719 with patch('pdb.set_trace') as mock:
1720 breakpoint()
1721 mock.assert_called_once_with()
1722
1723 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1724 def test_envar_unimportable(self):
1725 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001726 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001727 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001728 'nosuchbuiltin',
1729 'nosuchmodule.nosuchcallable',
1730 ):
1731 with self.subTest(envar=envar):
1732 self.env['PYTHONBREAKPOINT'] = envar
1733 mock = self.resources.enter_context(patch('pdb.set_trace'))
1734 w = self.resources.enter_context(check_warnings(quiet=True))
1735 breakpoint()
1736 self.assertEqual(
1737 str(w.message),
1738 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1739 self.assertEqual(w.category, RuntimeWarning)
1740 mock.assert_not_called()
1741
1742 def test_envar_ignored_when_hook_is_set(self):
1743 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1744 with patch('sys.exit') as mock:
1745 sys.breakpointhook = int
1746 breakpoint()
1747 mock.assert_not_called()
1748
1749
Martin Panterc9a6ab52015-10-10 01:25:38 +00001750@unittest.skipUnless(pty, "the pty and signal modules must be available")
1751class PtyTests(unittest.TestCase):
1752 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1753 terminals in the test environment"""
1754
Martin Pantere44dba32015-10-10 05:27:15 +00001755 def run_child(self, child, terminal_input):
1756 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001757 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001758 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001759 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001760 os.close(r)
1761 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001762 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001763 raise
1764 if pid == 0:
1765 # Child
1766 try:
1767 # Make sure we don't get stuck if there's a problem
1768 signal.alarm(2)
1769 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001770 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001771 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001772 except:
1773 traceback.print_exc()
1774 finally:
1775 # We don't want to return to unittest...
1776 os._exit(0)
1777 # Parent
1778 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001779 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001780 # Get results from the pipe
1781 with open(r, "r") as rpipe:
1782 lines = []
1783 while True:
1784 line = rpipe.readline().strip()
1785 if line == "":
1786 # The other end was closed => the child exited
1787 break
1788 lines.append(line)
1789 # Check the result was got and corresponds to the user's terminal input
1790 if len(lines) != 2:
1791 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001792 # Beware of Linux raising EIO when the slave is closed
1793 child_output = bytearray()
1794 while True:
1795 try:
1796 chunk = os.read(fd, 3000)
1797 except OSError: # Assume EIO
1798 break
1799 if not chunk:
1800 break
1801 child_output.extend(chunk)
1802 os.close(fd)
1803 child_output = child_output.decode("ascii", "ignore")
1804 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1805 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001806 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001807
Victor Stinner3ca9f502017-08-09 23:08:22 +02001808 # Wait until the child process completes
1809 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001810
Martin Pantere44dba32015-10-10 05:27:15 +00001811 return lines
1812
1813 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1814 if not sys.stdin.isatty() or not sys.stdout.isatty():
1815 self.skipTest("stdin and stdout must be ttys")
1816 def child(wpipe):
1817 # Check the error handlers are accounted for
1818 if stdio_encoding:
1819 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1820 encoding=stdio_encoding,
1821 errors='surrogateescape')
1822 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1823 encoding=stdio_encoding,
1824 errors='replace')
1825 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1826 print(ascii(input(prompt)), file=wpipe)
1827 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001828 # Check we did exercise the GNU readline path
1829 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1830 if lines[0] != 'tty = True':
1831 self.skipTest("standard IO in should have been a tty")
1832 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1833 if stdio_encoding:
1834 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1835 else:
1836 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1837 self.assertEqual(input_result, expected)
1838
1839 def test_input_tty(self):
1840 # Test input() functionality when wired to a tty (the code path
1841 # is different and invokes GNU readline if available).
1842 self.check_input_tty("prompt", b"quux")
1843
1844 def test_input_tty_non_ascii(self):
1845 # Check stdin/stdout encoding is used when invoking GNU readline
1846 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1847
1848 def test_input_tty_non_ascii_unicode_errors(self):
1849 # Check stdin/stdout error handler is used when invoking GNU readline
1850 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1851
1852 def test_input_no_stdout_fileno(self):
1853 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1854 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001855 def child(wpipe):
1856 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1857 sys.stdout = io.StringIO() # Does not support fileno()
1858 input("prompt")
1859 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1860 lines = self.run_child(child, b"quux\r")
1861 expected = (
1862 "stdin.isatty(): True",
1863 "captured: 'prompt'",
1864 )
1865 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001866
Raymond Hettinger64958a12003-12-17 20:43:33 +00001867class TestSorted(unittest.TestCase):
1868
1869 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001870 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001871 copy = data[:]
1872 random.shuffle(copy)
1873 self.assertEqual(data, sorted(copy))
1874 self.assertNotEqual(data, copy)
1875
1876 data.reverse()
1877 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001878 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1879 self.assertNotEqual(data, copy)
1880 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001881 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001882 self.assertNotEqual(data, copy)
1883
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001884 def test_bad_arguments(self):
1885 # Issue #29327: The first argument is positional-only.
1886 sorted([])
1887 with self.assertRaises(TypeError):
1888 sorted(iterable=[])
1889 # Other arguments are keyword-only
1890 sorted([], key=None)
1891 with self.assertRaises(TypeError):
1892 sorted([], None)
1893
Raymond Hettinger64958a12003-12-17 20:43:33 +00001894 def test_inputtypes(self):
1895 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001896 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001897 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001898 self.assertEqual(sorted(s), sorted(T(s)))
1899
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001900 s = ''.join(set(s)) # unique letters only
1901 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001902 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001903 self.assertEqual(sorted(s), sorted(T(s)))
1904
1905 def test_baddecorator(self):
1906 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1907 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1908
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001909
1910class ShutdownTest(unittest.TestCase):
1911
1912 def test_cleanup(self):
1913 # Issue #19255: builtins are still available at shutdown
1914 code = """if 1:
1915 import builtins
1916 import sys
1917
1918 class C:
1919 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001920 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001921 # Check that builtins still exist
1922 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001923 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001924
1925 c = C()
1926 # Make this module survive until builtins and sys are cleaned
1927 builtins.here = sys.modules[__name__]
1928 sys.here = sys.modules[__name__]
1929 # Create a reference loop so that this module needs to go
1930 # through a GC phase.
1931 here = sys.modules[__name__]
1932 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001933 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1934 # otherwise the codec may be unloaded before C.__del__() is called, and
1935 # so print("before") fails because the codec cannot be used to encode
1936 # "before" to sys.stdout.encoding. For example, on Windows,
1937 # sys.stdout.encoding is the OEM code page and these code pages are
1938 # implemented in Python
1939 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001940 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001941 self.assertEqual(["before", "after"], out.decode().splitlines())
1942
1943
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001944class TestType(unittest.TestCase):
1945 def test_new_type(self):
1946 A = type('A', (), {})
1947 self.assertEqual(A.__name__, 'A')
1948 self.assertEqual(A.__qualname__, 'A')
1949 self.assertEqual(A.__module__, __name__)
1950 self.assertEqual(A.__bases__, (object,))
1951 self.assertIs(A.__base__, object)
1952 x = A()
1953 self.assertIs(type(x), A)
1954 self.assertIs(x.__class__, A)
1955
1956 class B:
1957 def ham(self):
1958 return 'ham%d' % self
1959 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1960 self.assertEqual(C.__name__, 'C')
1961 self.assertEqual(C.__qualname__, 'C')
1962 self.assertEqual(C.__module__, __name__)
1963 self.assertEqual(C.__bases__, (B, int))
1964 self.assertIs(C.__base__, int)
1965 self.assertIn('spam', C.__dict__)
1966 self.assertNotIn('ham', C.__dict__)
1967 x = C(42)
1968 self.assertEqual(x, 42)
1969 self.assertIs(type(x), C)
1970 self.assertIs(x.__class__, C)
1971 self.assertEqual(x.ham(), 'ham42')
1972 self.assertEqual(x.spam(), 'spam42')
1973 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1974
Nick Coghland78448e2016-07-30 16:26:03 +10001975 def test_type_nokwargs(self):
1976 with self.assertRaises(TypeError):
1977 type('a', (), {}, x=5)
1978 with self.assertRaises(TypeError):
1979 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001980
1981 def test_type_name(self):
1982 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1983 with self.subTest(name=name):
1984 A = type(name, (), {})
1985 self.assertEqual(A.__name__, name)
1986 self.assertEqual(A.__qualname__, name)
1987 self.assertEqual(A.__module__, __name__)
1988 with self.assertRaises(ValueError):
1989 type('A\x00B', (), {})
1990 with self.assertRaises(ValueError):
1991 type('A\udcdcB', (), {})
1992 with self.assertRaises(TypeError):
1993 type(b'A', (), {})
1994
1995 C = type('C', (), {})
1996 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1997 with self.subTest(name=name):
1998 C.__name__ = name
1999 self.assertEqual(C.__name__, name)
2000 self.assertEqual(C.__qualname__, 'C')
2001 self.assertEqual(C.__module__, __name__)
2002
2003 A = type('C', (), {})
2004 with self.assertRaises(ValueError):
2005 A.__name__ = 'A\x00B'
2006 self.assertEqual(A.__name__, 'C')
2007 with self.assertRaises(ValueError):
2008 A.__name__ = 'A\udcdcB'
2009 self.assertEqual(A.__name__, 'C')
2010 with self.assertRaises(TypeError):
2011 A.__name__ = b'A'
2012 self.assertEqual(A.__name__, 'C')
2013
2014 def test_type_qualname(self):
2015 A = type('A', (), {'__qualname__': 'B.C'})
2016 self.assertEqual(A.__name__, 'A')
2017 self.assertEqual(A.__qualname__, 'B.C')
2018 self.assertEqual(A.__module__, __name__)
2019 with self.assertRaises(TypeError):
2020 type('A', (), {'__qualname__': b'B'})
2021 self.assertEqual(A.__qualname__, 'B.C')
2022
2023 A.__qualname__ = 'D.E'
2024 self.assertEqual(A.__name__, 'A')
2025 self.assertEqual(A.__qualname__, 'D.E')
2026 with self.assertRaises(TypeError):
2027 A.__qualname__ = b'B'
2028 self.assertEqual(A.__qualname__, 'D.E')
2029
2030 def test_type_doc(self):
2031 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2032 A = type('A', (), {'__doc__': doc})
2033 self.assertEqual(A.__doc__, doc)
2034 with self.assertRaises(UnicodeEncodeError):
2035 type('A', (), {'__doc__': 'x\udcdcy'})
2036
2037 A = type('A', (), {})
2038 self.assertEqual(A.__doc__, None)
2039 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2040 A.__doc__ = doc
2041 self.assertEqual(A.__doc__, doc)
2042
2043 def test_bad_args(self):
2044 with self.assertRaises(TypeError):
2045 type()
2046 with self.assertRaises(TypeError):
2047 type('A', ())
2048 with self.assertRaises(TypeError):
2049 type('A', (), {}, ())
2050 with self.assertRaises(TypeError):
2051 type('A', (), dict={})
2052 with self.assertRaises(TypeError):
2053 type('A', [], {})
2054 with self.assertRaises(TypeError):
2055 type('A', (), types.MappingProxyType({}))
2056 with self.assertRaises(TypeError):
2057 type('A', (None,), {})
2058 with self.assertRaises(TypeError):
2059 type('A', (bool,), {})
2060 with self.assertRaises(TypeError):
2061 type('A', (int, str), {})
2062
2063 def test_bad_slots(self):
2064 with self.assertRaises(TypeError):
2065 type('A', (), {'__slots__': b'x'})
2066 with self.assertRaises(TypeError):
2067 type('A', (int,), {'__slots__': 'x'})
2068 with self.assertRaises(TypeError):
2069 type('A', (), {'__slots__': ''})
2070 with self.assertRaises(TypeError):
2071 type('A', (), {'__slots__': '42'})
2072 with self.assertRaises(TypeError):
2073 type('A', (), {'__slots__': 'x\x00y'})
2074 with self.assertRaises(ValueError):
2075 type('A', (), {'__slots__': 'x', 'x': 0})
2076 with self.assertRaises(TypeError):
2077 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2078 with self.assertRaises(TypeError):
2079 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2080
2081 class B:
2082 pass
2083 with self.assertRaises(TypeError):
2084 type('A', (B,), {'__slots__': '__dict__'})
2085 with self.assertRaises(TypeError):
2086 type('A', (B,), {'__slots__': '__weakref__'})
2087
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002088 def test_namespace_order(self):
2089 # bpo-34320: namespace should preserve order
2090 od = collections.OrderedDict([('a', 1), ('b', 2)])
2091 od.move_to_end('a')
2092 expected = list(od.items())
2093
2094 C = type('C', (), od)
2095 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2096
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002097
Zachary Warea4b7a752013-11-24 01:19:09 -06002098def load_tests(loader, tests, pattern):
2099 from doctest import DocTestSuite
2100 tests.addTest(DocTestSuite(builtins))
2101 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002102
2103if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002104 unittest.main()