blob: e32fb75d81912d0ab6d8b7ea07cb8f35825bb342 [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')
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300163 # embedded null character
164 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000165
166 def test_abs(self):
167 # int
168 self.assertEqual(abs(0), 0)
169 self.assertEqual(abs(1234), 1234)
170 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000171 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000172 # float
173 self.assertEqual(abs(0.0), 0.0)
174 self.assertEqual(abs(3.14), 3.14)
175 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000176 # str
177 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000178 # bool
179 self.assertEqual(abs(True), 1)
180 self.assertEqual(abs(False), 0)
181 # other
182 self.assertRaises(TypeError, abs)
183 self.assertRaises(TypeError, abs, None)
184 class AbsClass(object):
185 def __abs__(self):
186 return -5
187 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000188
Raymond Hettinger96229b12005-03-11 06:49:40 +0000189 def test_all(self):
190 self.assertEqual(all([2, 4, 6]), True)
191 self.assertEqual(all([2, None, 6]), False)
192 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
193 self.assertRaises(RuntimeError, all, TestFailingIter())
194 self.assertRaises(TypeError, all, 10) # Non-iterable
195 self.assertRaises(TypeError, all) # No args
196 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
197 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200198 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000199 S = [50, 60]
200 self.assertEqual(all(x > 42 for x in S), True)
201 S = [50, 40, 60]
202 self.assertEqual(all(x > 42 for x in S), False)
203
204 def test_any(self):
205 self.assertEqual(any([None, None, None]), False)
206 self.assertEqual(any([None, 4, None]), True)
207 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500208 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000209 self.assertRaises(TypeError, any, 10) # Non-iterable
210 self.assertRaises(TypeError, any) # No args
211 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
212 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200213 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000214 S = [40, 60, 30]
215 self.assertEqual(any(x > 42 for x in S), True)
216 S = [10, 20, 30]
217 self.assertEqual(any(x > 42 for x in S), False)
218
Georg Brandl559e5d72008-06-11 18:37:52 +0000219 def test_ascii(self):
220 self.assertEqual(ascii(''), '\'\'')
221 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000222 self.assertEqual(ascii(()), '()')
223 self.assertEqual(ascii([]), '[]')
224 self.assertEqual(ascii({}), '{}')
225 a = []
226 a.append(a)
227 self.assertEqual(ascii(a), '[[...]]')
228 a = {}
229 a[0] = a
230 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000231 # Advanced checks for unicode strings
232 def _check_uni(s):
233 self.assertEqual(ascii(s), repr(s))
234 _check_uni("'")
235 _check_uni('"')
236 _check_uni('"\'')
237 _check_uni('\0')
238 _check_uni('\r\n\t .')
239 # Unprintable non-ASCII characters
240 _check_uni('\x85')
241 _check_uni('\u1fff')
242 _check_uni('\U00012fff')
243 # Lone surrogates
244 _check_uni('\ud800')
245 _check_uni('\udfff')
246 # Issue #9804: surrogates should be joined even for printable
247 # wide characters (UCS-2 builds).
248 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
249 # All together
250 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
251 self.assertEqual(ascii(s),
252 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000253
Thomas Wouters89f507f2006-12-13 04:49:30 +0000254 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000255 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000257 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258
Walter Dörwald919497e2003-01-19 16:23:59 +0000259 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000260 self.assertTrue(callable(len))
261 self.assertFalse(callable("a"))
262 self.assertTrue(callable(callable))
263 self.assertTrue(callable(lambda x, y: x + y))
264 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000265 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000266 self.assertTrue(callable(f))
267
268 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000269 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000270 self.assertTrue(callable(C1))
271 c = C1()
272 self.assertTrue(callable(c.meth))
273 self.assertFalse(callable(c))
274
275 # __call__ is looked up on the class, not the instance
276 c.__call__ = None
277 self.assertFalse(callable(c))
278 c.__call__ = lambda self: 0
279 self.assertFalse(callable(c))
280 del c.__call__
281 self.assertFalse(callable(c))
282
283 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000284 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000285 c2 = C2()
286 self.assertTrue(callable(c2))
287 c2.__call__ = None
288 self.assertTrue(callable(c2))
289 class C3(C2): pass
290 c3 = C3()
291 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000292
293 def test_chr(self):
294 self.assertEqual(chr(32), ' ')
295 self.assertEqual(chr(65), 'A')
296 self.assertEqual(chr(97), 'a')
297 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000298 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000299 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300300 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000301 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000302 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
303 self.assertEqual(chr(0x00010000), "\U00010000")
304 self.assertEqual(chr(0x00010001), "\U00010001")
305 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
306 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
307 self.assertEqual(chr(0x00100000), "\U00100000")
308 self.assertEqual(chr(0x00100001), "\U00100001")
309 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
310 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
311 self.assertRaises(ValueError, chr, -1)
312 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000313 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000314
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000315 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000316 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000317
Walter Dörwald919497e2003-01-19 16:23:59 +0000318 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000319 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000320 bom = b'\xef\xbb\xbf'
321 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000322 compile(source='pass', filename='?', mode='exec')
323 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
324 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000325 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000326 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000327 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
328 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300329 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
331 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000332 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300333 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000334 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335
Georg Brandl8334fd92010-12-04 10:26:46 +0000336 # test the optimize argument
337
338 codestr = '''def f():
339 """doc"""
diana543386b2017-10-03 10:46:56 -0600340 debug_enabled = False
341 if __debug__:
342 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 try:
344 assert False
345 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200346 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000347 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200348 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000349 '''
350 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200351 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
352 (0, True, 'doc', True, True),
353 (1, False, 'doc', False, False),
354 (2, False, None, False, False)]
355 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000356 # test both direct compilation and compilation via AST
357 codeobjs = []
358 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
359 tree = ast.parse(codestr)
360 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
361 for code in codeobjs:
362 ns = {}
363 exec(code, ns)
364 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200365 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000366
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700367 def test_compile_top_level_await(self):
368 """Test whether code some top level await can be compiled.
369
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400370 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
371 set, and make sure the generated code object has the CO_COROUTINE flag
372 set in order to execute it with `await eval(.....)` instead of exec,
373 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700374 """
375
376 # helper function just to check we can run top=level async-for
377 async def arange(n):
378 for i in range(n):
379 yield i
380
381 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400382 code_samples = [
383 '''a = await asyncio.sleep(0, result=1)''',
384 '''async for i in arange(1):
385 a = 1''',
386 '''async with asyncio.Lock() as l:
387 a = 1'''
388 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700389 policy = maybe_get_event_loop_policy()
390 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400391 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700392 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400393 with self.assertRaises(
394 SyntaxError, msg=f"source={source} mode={mode}"):
395 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700396
397 co = compile(source,
398 '?',
399 mode,
400 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
401
402 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400403 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700404
405 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400406 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700407 async_f = FunctionType(co, globals_)
408 asyncio.run(async_f())
409 self.assertEqual(globals_['a'], 1)
410
411 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400412 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700413 asyncio.run(eval(co, globals_))
414 self.assertEqual(globals_['a'], 1)
415 finally:
416 asyncio.set_event_loop_policy(policy)
417
418 def test_compile_async_generator(self):
419 """
420 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400421 make sure AsyncGenerators are still properly not marked with the
422 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700423 """
424 code = dedent("""async def ticker():
425 for i in range(10):
426 yield i
427 await asyncio.sleep(0)""")
428
429 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
430 glob = {}
431 exec(co, glob)
432 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
433
Walter Dörwald919497e2003-01-19 16:23:59 +0000434 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000435 sys.spam = 1
436 delattr(sys, 'spam')
437 self.assertRaises(TypeError, delattr)
438
439 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000440 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000441 self.assertRaises(TypeError, dir, 42, 42)
442
Georg Brandle32b4222007-03-10 22:13:27 +0000443 # dir() - local scope
444 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000445 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000446
447 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000448 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000449
450 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000451 class Foo(types.ModuleType):
452 __dict__ = 8
453 f = Foo("foo")
454 self.assertRaises(TypeError, dir, f)
455
456 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000457 self.assertIn("strip", dir(str))
458 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000459
460 # dir(obj)
461 class Foo(object):
462 def __init__(self):
463 self.x = 7
464 self.y = 8
465 self.z = 9
466 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000467 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000468
469 # dir(obj_no__dict__)
470 class Foo(object):
471 __slots__ = []
472 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000473 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000474
475 # dir(obj_no__class__with__dict__)
476 # (an ugly trick to cause getattr(f, "__class__") to fail)
477 class Foo(object):
478 __slots__ = ["__class__", "__dict__"]
479 def __init__(self):
480 self.bar = "wow"
481 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000482 self.assertNotIn("__repr__", dir(f))
483 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000484
485 # dir(obj_using __dir__)
486 class Foo(object):
487 def __dir__(self):
488 return ["kan", "ga", "roo"]
489 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000490 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000491
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500492 # dir(obj__dir__tuple)
493 class Foo(object):
494 def __dir__(self):
495 return ("b", "c", "a")
496 res = dir(Foo())
497 self.assertIsInstance(res, list)
498 self.assertTrue(res == ["a", "b", "c"])
499
500 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000501 class Foo(object):
502 def __dir__(self):
503 return 7
504 f = Foo()
505 self.assertRaises(TypeError, dir, f)
506
Collin Winter3eed7652007-08-14 17:53:54 +0000507 # dir(traceback)
508 try:
509 raise IndexError
510 except:
511 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
512
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500513 # test that object has a __dir__()
514 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000515
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 def test_divmod(self):
517 self.assertEqual(divmod(12, 7), (1, 5))
518 self.assertEqual(divmod(-12, 7), (-2, 2))
519 self.assertEqual(divmod(12, -7), (-2, -2))
520 self.assertEqual(divmod(-12, -7), (1, -5))
521
Mark Dickinson5c2db372009-12-05 20:28:34 +0000522 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000523
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000524 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
525 (-3.25, 1.0, (-4.0, 0.75)),
526 (3.25, -1.0, (-4.0, -0.75)),
527 (-3.25, -1.0, (3.0, -0.25))]:
528 result = divmod(num, denom)
529 self.assertAlmostEqual(result[0], exp_result[0])
530 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000531
532 self.assertRaises(TypeError, divmod)
533
534 def test_eval(self):
535 self.assertEqual(eval('1+1'), 2)
536 self.assertEqual(eval(' 1+1\n'), 2)
537 globals = {'a': 1, 'b': 2}
538 locals = {'b': 200, 'c': 300}
539 self.assertEqual(eval('a', globals) , 1)
540 self.assertEqual(eval('a', globals, locals), 1)
541 self.assertEqual(eval('b', globals, locals), 200)
542 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000543 globals = {'a': 1, 'b': 2}
544 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000545 bom = b'\xef\xbb\xbf'
546 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000547 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000548 self.assertRaises(TypeError, eval)
549 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000550 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000551
Benjamin Peterson92722792012-12-15 12:51:05 -0500552 class X:
553 def __getitem__(self, key):
554 raise ValueError
555 self.assertRaises(ValueError, eval, "foo", {}, X())
556
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000557 def test_general_eval(self):
558 # Tests that general mappings can be used for the locals argument
559
560 class M:
561 "Test mapping interface versus possible calls from eval()."
562 def __getitem__(self, key):
563 if key == 'a':
564 return 12
565 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000566 def keys(self):
567 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000568
569 m = M()
570 g = globals()
571 self.assertEqual(eval('a', g, m), 12)
572 self.assertRaises(NameError, eval, 'b', g, m)
573 self.assertEqual(eval('dir()', g, m), list('xyz'))
574 self.assertEqual(eval('globals()', g, m), g)
575 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000576 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000577 class A:
578 "Non-mapping"
579 pass
580 m = A()
581 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000582
583 # Verify that dict subclasses work as well
584 class D(dict):
585 def __getitem__(self, key):
586 if key == 'a':
587 return 12
588 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000589 def keys(self):
590 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000591
592 d = D()
593 self.assertEqual(eval('a', g, d), 12)
594 self.assertRaises(NameError, eval, 'b', g, d)
595 self.assertEqual(eval('dir()', g, d), list('xyz'))
596 self.assertEqual(eval('globals()', g, d), g)
597 self.assertEqual(eval('locals()', g, d), d)
598
599 # Verify locals stores (used by list comps)
600 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000601 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000602
603 class SpreadSheet:
604 "Sample application showing nested, calculated lookups."
605 _cells = {}
606 def __setitem__(self, key, formula):
607 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000608 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000609 return eval(self._cells[key], globals(), self)
610
611 ss = SpreadSheet()
612 ss['a1'] = '5'
613 ss['a2'] = 'a1*6'
614 ss['a3'] = 'a2*7'
615 self.assertEqual(ss['a3'], 210)
616
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000617 # Verify that dir() catches a non-list returned by eval
618 # SF bug #1004669
619 class C:
620 def __getitem__(self, item):
621 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000622 def keys(self):
623 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000624 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
625
Georg Brandl7cae87c2006-09-06 06:51:57 +0000626 def test_exec(self):
627 g = {}
628 exec('z = 1', g)
629 if '__builtins__' in g:
630 del g['__builtins__']
631 self.assertEqual(g, {'z': 1})
632
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000633 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000634 if '__builtins__' in g:
635 del g['__builtins__']
636 self.assertEqual(g, {'z': 2})
637 g = {}
638 l = {}
639
Brett Cannon77628992010-03-20 20:59:33 +0000640 with check_warnings():
641 warnings.filterwarnings("ignore", "global statement",
642 module="<string>")
643 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000644 if '__builtins__' in g:
645 del g['__builtins__']
646 if '__builtins__' in l:
647 del l['__builtins__']
648 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
649
Victor Stinnerb0b22422012-04-19 00:57:45 +0200650 def test_exec_globals(self):
651 code = compile("print('Hello World!')", "", "exec")
652 # no builtin function
653 self.assertRaisesRegex(NameError, "name 'print' is not defined",
654 exec, code, {'__builtins__': {}})
655 # __builtins__ must be a mapping type
656 self.assertRaises(TypeError,
657 exec, code, {'__builtins__': 123})
658
659 # no __build_class__ function
660 code = compile("class A: pass", "", "exec")
661 self.assertRaisesRegex(NameError, "__build_class__ not found",
662 exec, code, {'__builtins__': {}})
663
664 class frozendict_error(Exception):
665 pass
666
667 class frozendict(dict):
668 def __setitem__(self, key, value):
669 raise frozendict_error("frozendict is readonly")
670
671 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400672 if isinstance(__builtins__, types.ModuleType):
673 frozen_builtins = frozendict(__builtins__.__dict__)
674 else:
675 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200676 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
677 self.assertRaises(frozendict_error,
678 exec, code, {'__builtins__': frozen_builtins})
679
680 # read-only globals
681 namespace = frozendict({})
682 code = compile("x=1", "test", "exec")
683 self.assertRaises(frozendict_error,
684 exec, code, namespace)
685
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000686 def test_exec_redirected(self):
687 savestdout = sys.stdout
688 sys.stdout = None # Whatever that cannot flush()
689 try:
690 # Used to raise SystemError('error return without exception set')
691 exec('a')
692 except NameError:
693 pass
694 finally:
695 sys.stdout = savestdout
696
Walter Dörwald919497e2003-01-19 16:23:59 +0000697 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000698 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
699 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
700 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
701 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
702 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 def identity(item):
704 return 1
705 filter(identity, Squares(5))
706 self.assertRaises(TypeError, filter)
707 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000708 def __getitem__(self, index):
709 if index<4:
710 return 42
711 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000712 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000713 def badfunc():
714 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000715 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000716
Walter Dörwaldbf517072003-01-27 15:57:14 +0000717 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000718 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
719 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
720 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000721
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000722 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200723 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
724 f1 = filter(filter_char, "abcdeabcde")
725 f2 = filter(filter_char, "abcdeabcde")
726 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000727
Walter Dörwald919497e2003-01-19 16:23:59 +0000728 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000729 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000730 self.assertRaises(TypeError, getattr, sys, 1)
731 self.assertRaises(TypeError, getattr, sys, 1, "foo")
732 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000733 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000734 # unicode surrogates are not encodable to the default encoding (utf8)
735 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000736
737 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000738 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000739 self.assertRaises(TypeError, hasattr, sys, 1)
740 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000741 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000742
Benjamin Peterson17689992010-08-24 03:26:23 +0000743 # Check that hasattr propagates all exceptions outside of
744 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000745 class A:
746 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000747 raise SystemExit
748 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000749 class B:
750 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000751 raise ValueError
752 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000753
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 def test_hash(self):
755 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000756 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000757 self.assertEqual(hash(1), hash(1.0))
758 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000759 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 hash((0,1,2,3))
761 def f(): pass
762 self.assertRaises(TypeError, hash, [])
763 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000764 # Bug 1536021: Allow hash to return long objects
765 class X:
766 def __hash__(self):
767 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000768 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000769 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000770 def __hash__(self):
771 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000772 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000773
774 def test_hex(self):
775 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000776 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 self.assertRaises(TypeError, hex, {})
778
779 def test_id(self):
780 id(None)
781 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 id(1.0)
783 id('spam')
784 id((0,1,2,3))
785 id([0,1,2,3])
786 id({'spam': 1, 'eggs': 2, 'ham': 3})
787
Guido van Rossuma88a0332007-02-26 16:59:55 +0000788 # Test input() later, alphabetized as if it were raw_input
789
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 def test_iter(self):
791 self.assertRaises(TypeError, iter)
792 self.assertRaises(TypeError, iter, 42, 42)
793 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000794 for l in lists:
795 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000796 self.assertEqual(next(i), '1')
797 self.assertEqual(next(i), '2')
798 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000799
800 def test_isinstance(self):
801 class C:
802 pass
803 class D(C):
804 pass
805 class E:
806 pass
807 c = C()
808 d = D()
809 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000810 self.assertTrue(isinstance(c, C))
811 self.assertTrue(isinstance(d, C))
812 self.assertTrue(not isinstance(e, C))
813 self.assertTrue(not isinstance(c, D))
814 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 self.assertRaises(TypeError, isinstance, E, 'foo')
816 self.assertRaises(TypeError, isinstance)
817
818 def test_issubclass(self):
819 class C:
820 pass
821 class D(C):
822 pass
823 class E:
824 pass
825 c = C()
826 d = D()
827 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000828 self.assertTrue(issubclass(D, C))
829 self.assertTrue(issubclass(C, C))
830 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000831 self.assertRaises(TypeError, issubclass, 'foo', E)
832 self.assertRaises(TypeError, issubclass, E, 'foo')
833 self.assertRaises(TypeError, issubclass)
834
835 def test_len(self):
836 self.assertEqual(len('123'), 3)
837 self.assertEqual(len(()), 0)
838 self.assertEqual(len((1, 2, 3, 4)), 4)
839 self.assertEqual(len([1, 2, 3, 4]), 4)
840 self.assertEqual(len({}), 0)
841 self.assertEqual(len({'a':1, 'b': 2}), 2)
842 class BadSeq:
843 def __len__(self):
844 raise ValueError
845 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000846 class InvalidLen:
847 def __len__(self):
848 return None
849 self.assertRaises(TypeError, len, InvalidLen())
850 class FloatLen:
851 def __len__(self):
852 return 4.5
853 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300854 class NegativeLen:
855 def __len__(self):
856 return -10
857 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000858 class HugeLen:
859 def __len__(self):
860 return sys.maxsize + 1
861 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300862 class HugeNegativeLen:
863 def __len__(self):
864 return -sys.maxsize-10
865 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000866 class NoLenMethod(object): pass
867 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000868
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 def test_map(self):
870 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000871 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000872 [1, 4, 9]
873 )
874 try:
875 from math import sqrt
876 except ImportError:
877 def sqrt(x):
878 return pow(x, 0.5)
879 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000880 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000881 [[4.0, 2.0], [9.0, 3.0]]
882 )
883 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000884 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000885 [10, 4, 6]
886 )
887
888 def plus(*v):
889 accu = 0
890 for i in v: accu = accu + i
891 return accu
892 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000893 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000894 [1, 3, 7]
895 )
896 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000897 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000898 [1+4, 3+9, 7+2]
899 )
900 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000901 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 [1+4+1, 3+9+1, 7+2+0]
903 )
904 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000905 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
907 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000908 def Max(a, b):
909 if a is None:
910 return b
911 if b is None:
912 return a
913 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000915 list(map(Max, Squares(3), Squares(2))),
916 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 )
918 self.assertRaises(TypeError, map)
919 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000920 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000921 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000923 yield None
924 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000925 def badfunc(x):
926 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000927 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000928
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000929 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200930 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
931 m1 = map(map_char, "Is this the real life?")
932 m2 = map(map_char, "Is this the real life?")
933 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000934
Walter Dörwald919497e2003-01-19 16:23:59 +0000935 def test_max(self):
936 self.assertEqual(max('123123'), '3')
937 self.assertEqual(max(1, 2, 3), 3)
938 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
939 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
940
Guido van Rossume2a383d2007-01-15 16:59:06 +0000941 self.assertEqual(max(1, 2, 3.0), 3.0)
942 self.assertEqual(max(1, 2.0, 3), 3)
943 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000944
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700945 self.assertRaises(TypeError, max)
946 self.assertRaises(TypeError, max, 42)
947 self.assertRaises(ValueError, max, ())
948 class BadSeq:
949 def __getitem__(self, index):
950 raise ValueError
951 self.assertRaises(ValueError, max, BadSeq())
952
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000953 for stmt in (
954 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700955 "max(default=None)",
956 "max(1, 2, default=None)", # require container for default
957 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000958 "max(1, key=int)", # single arg not iterable
959 "max(1, 2, keystone=int)", # wrong keyword
960 "max(1, 2, key=int, abc=int)", # two many keywords
961 "max(1, 2, key=1)", # keyfunc is not callable
962 ):
Tim Peters7f061872004-12-07 21:17:46 +0000963 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000964 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000965 except TypeError:
966 pass
967 else:
968 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000969
970 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
971 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
972 self.assertEqual(max(1, 2, key=neg), 1) # two elems
973
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700974 self.assertEqual(max((), default=None), None) # zero elem iterable
975 self.assertEqual(max((1,), default=None), 1) # one elem iterable
976 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
977
978 self.assertEqual(max((), default=1, key=neg), 1)
979 self.assertEqual(max((1, 2), default=3, key=neg), 1)
980
Alexander Marshalove22072f2018-07-24 10:58:21 +0700981 self.assertEqual(max((1, 2), key=None), 2)
982
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000983 data = [random.randrange(200) for i in range(100)]
984 keys = dict((elem, random.randrange(50)) for elem in data)
985 f = keys.__getitem__
986 self.assertEqual(max(data, key=f),
987 sorted(reversed(data), key=f)[-1])
988
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 def test_min(self):
990 self.assertEqual(min('123123'), '1')
991 self.assertEqual(min(1, 2, 3), 1)
992 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
993 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
994
Guido van Rossume2a383d2007-01-15 16:59:06 +0000995 self.assertEqual(min(1, 2, 3.0), 1)
996 self.assertEqual(min(1, 2.0, 3), 1)
997 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000998
999 self.assertRaises(TypeError, min)
1000 self.assertRaises(TypeError, min, 42)
1001 self.assertRaises(ValueError, min, ())
1002 class BadSeq:
1003 def __getitem__(self, index):
1004 raise ValueError
1005 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001006
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001007 for stmt in (
1008 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001009 "min(default=None)",
1010 "min(1, 2, default=None)", # require container for default
1011 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001012 "min(1, key=int)", # single arg not iterable
1013 "min(1, 2, keystone=int)", # wrong keyword
1014 "min(1, 2, key=int, abc=int)", # two many keywords
1015 "min(1, 2, key=1)", # keyfunc is not callable
1016 ):
Tim Peters7f061872004-12-07 21:17:46 +00001017 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001018 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001019 except TypeError:
1020 pass
1021 else:
1022 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001023
1024 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1025 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1026 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1027
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001028 self.assertEqual(min((), default=None), None) # zero elem iterable
1029 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1030 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1031
1032 self.assertEqual(min((), default=1, key=neg), 1)
1033 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1034
Alexander Marshalove22072f2018-07-24 10:58:21 +07001035 self.assertEqual(min((1, 2), key=None), 1)
1036
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001037 data = [random.randrange(200) for i in range(100)]
1038 keys = dict((elem, random.randrange(50)) for elem in data)
1039 f = keys.__getitem__
1040 self.assertEqual(min(data, key=f),
1041 sorted(data, key=f)[0])
1042
Georg Brandla18af4e2007-04-21 15:47:16 +00001043 def test_next(self):
1044 it = iter(range(2))
1045 self.assertEqual(next(it), 0)
1046 self.assertEqual(next(it), 1)
1047 self.assertRaises(StopIteration, next, it)
1048 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001049 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001050
1051 class Iter(object):
1052 def __iter__(self):
1053 return self
1054 def __next__(self):
1055 raise StopIteration
1056
1057 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001058 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001059 self.assertRaises(StopIteration, next, it)
1060
1061 def gen():
1062 yield 1
1063 return
1064
1065 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001067 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001068 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001071 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001072 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001073 self.assertRaises(TypeError, oct, ())
1074
1075 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001076 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001078 self.addCleanup(unlink, TESTFN)
1079 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001081 fp.write('The quick brown fox jumps over the lazy dog')
1082 fp.write('.\n')
1083 fp.write('Dear John\n')
1084 fp.write('XXX'*100)
1085 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001086
1087 def test_open(self):
1088 self.write_testfile()
1089 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001090 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001091 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001092 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1093 self.assertEqual(fp.readline(4), 'Dear')
1094 self.assertEqual(fp.readline(100), ' John\n')
1095 self.assertEqual(fp.read(300), 'XXX'*100)
1096 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001097
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001098 # embedded null bytes and characters
1099 self.assertRaises(ValueError, open, 'a\x00b')
1100 self.assertRaises(ValueError, open, b'a\x00b')
1101
Victor Stinner91106cd2017-12-13 12:29:09 +01001102 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001103 def test_open_default_encoding(self):
1104 old_environ = dict(os.environ)
1105 try:
1106 # try to get a user preferred encoding different than the current
1107 # locale encoding to check that open() uses the current locale
1108 # encoding and not the user preferred encoding
1109 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1110 if key in os.environ:
1111 del os.environ[key]
1112
1113 self.write_testfile()
1114 current_locale_encoding = locale.getpreferredencoding(False)
1115 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001116 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001117 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001118 finally:
1119 os.environ.clear()
1120 os.environ.update(old_environ)
1121
Victor Stinnerdaf45552013-08-28 00:53:59 +02001122 def test_open_non_inheritable(self):
1123 fileobj = open(__file__)
1124 with fileobj:
1125 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1126
Walter Dörwald919497e2003-01-19 16:23:59 +00001127 def test_ord(self):
1128 self.assertEqual(ord(' '), 32)
1129 self.assertEqual(ord('A'), 65)
1130 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001131 self.assertEqual(ord('\x80'), 128)
1132 self.assertEqual(ord('\xff'), 255)
1133
1134 self.assertEqual(ord(b' '), 32)
1135 self.assertEqual(ord(b'A'), 65)
1136 self.assertEqual(ord(b'a'), 97)
1137 self.assertEqual(ord(b'\x80'), 128)
1138 self.assertEqual(ord(b'\xff'), 255)
1139
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001140 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001141 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001142
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001143 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1144 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1145 self.assertEqual(ord("\U00010000"), 0x00010000)
1146 self.assertEqual(ord("\U00010001"), 0x00010001)
1147 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1148 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1149 self.assertEqual(ord("\U00100000"), 0x00100000)
1150 self.assertEqual(ord("\U00100001"), 0x00100001)
1151 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1152 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1153
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 def test_pow(self):
1155 self.assertEqual(pow(0,0), 1)
1156 self.assertEqual(pow(0,1), 0)
1157 self.assertEqual(pow(1,0), 1)
1158 self.assertEqual(pow(1,1), 1)
1159
1160 self.assertEqual(pow(2,0), 1)
1161 self.assertEqual(pow(2,10), 1024)
1162 self.assertEqual(pow(2,20), 1024*1024)
1163 self.assertEqual(pow(2,30), 1024*1024*1024)
1164
1165 self.assertEqual(pow(-2,0), 1)
1166 self.assertEqual(pow(-2,1), -2)
1167 self.assertEqual(pow(-2,2), 4)
1168 self.assertEqual(pow(-2,3), -8)
1169
Walter Dörwald919497e2003-01-19 16:23:59 +00001170 self.assertAlmostEqual(pow(0.,0), 1.)
1171 self.assertAlmostEqual(pow(0.,1), 0.)
1172 self.assertAlmostEqual(pow(1.,0), 1.)
1173 self.assertAlmostEqual(pow(1.,1), 1.)
1174
1175 self.assertAlmostEqual(pow(2.,0), 1.)
1176 self.assertAlmostEqual(pow(2.,10), 1024.)
1177 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1178 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1179
1180 self.assertAlmostEqual(pow(-2.,0), 1.)
1181 self.assertAlmostEqual(pow(-2.,1), -2.)
1182 self.assertAlmostEqual(pow(-2.,2), 4.)
1183 self.assertAlmostEqual(pow(-2.,3), -8.)
1184
Mark Dickinson5c2db372009-12-05 20:28:34 +00001185 for x in 2, 2.0:
1186 for y in 10, 10.0:
1187 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001188 if isinstance(x, float) or \
1189 isinstance(y, float) or \
1190 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001191 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 else:
1193 self.assertAlmostEqual(pow(x, y, z), 24.0)
1194
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001195 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1196 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1197
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001198 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001200
1201 self.assertRaises(TypeError, pow)
1202
Guido van Rossuma88a0332007-02-26 16:59:55 +00001203 def test_input(self):
1204 self.write_testfile()
1205 fp = open(TESTFN, 'r')
1206 savestdin = sys.stdin
1207 savestdout = sys.stdout # Eats the echo
1208 try:
1209 sys.stdin = fp
1210 sys.stdout = BitBucket()
1211 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001212 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1213 self.assertEqual(input('testing\n'), 'Dear John')
1214
1215 # SF 1535165: don't segfault on closed stdin
1216 # sys.stdout must be a regular file for triggering
1217 sys.stdout = savestdout
1218 sys.stdin.close()
1219 self.assertRaises(ValueError, input)
1220
1221 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001222 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001223 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001224 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001225 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001226 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001227 self.assertRaises(EOFError, input)
1228
1229 del sys.stdout
1230 self.assertRaises(RuntimeError, input, 'prompt')
1231 del sys.stdin
1232 self.assertRaises(RuntimeError, input, 'prompt')
1233 finally:
1234 sys.stdin = savestdin
1235 sys.stdout = savestdout
1236 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001237
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001238 # test_int(): see test_int.py for tests of built-in function int().
1239
Walter Dörwald919497e2003-01-19 16:23:59 +00001240 def test_repr(self):
1241 self.assertEqual(repr(''), '\'\'')
1242 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001243 self.assertEqual(repr(()), '()')
1244 self.assertEqual(repr([]), '[]')
1245 self.assertEqual(repr({}), '{}')
1246 a = []
1247 a.append(a)
1248 self.assertEqual(repr(a), '[[...]]')
1249 a = {}
1250 a[0] = a
1251 self.assertEqual(repr(a), '{0: {...}}')
1252
1253 def test_round(self):
1254 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001255 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001256 self.assertEqual(round(1.0), 1.0)
1257 self.assertEqual(round(10.0), 10.0)
1258 self.assertEqual(round(1000000000.0), 1000000000.0)
1259 self.assertEqual(round(1e20), 1e20)
1260
1261 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(0.1), 0.0)
1267 self.assertEqual(round(1.1), 1.0)
1268 self.assertEqual(round(10.1), 10.0)
1269 self.assertEqual(round(1000000000.1), 1000000000.0)
1270
1271 self.assertEqual(round(-1.1), -1.0)
1272 self.assertEqual(round(-10.1), -10.0)
1273 self.assertEqual(round(-1000000000.1), -1000000000.0)
1274
1275 self.assertEqual(round(0.9), 1.0)
1276 self.assertEqual(round(9.9), 10.0)
1277 self.assertEqual(round(999999999.9), 1000000000.0)
1278
1279 self.assertEqual(round(-0.9), -1.0)
1280 self.assertEqual(round(-9.9), -10.0)
1281 self.assertEqual(round(-999999999.9), -1000000000.0)
1282
1283 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001284 self.assertEqual(type(round(-8.0, -1)), float)
1285
1286 self.assertEqual(type(round(-8.0, 0)), float)
1287 self.assertEqual(type(round(-8.0, 1)), float)
1288
1289 # Check even / odd rounding behaviour
1290 self.assertEqual(round(5.5), 6)
1291 self.assertEqual(round(6.5), 6)
1292 self.assertEqual(round(-5.5), -6)
1293 self.assertEqual(round(-6.5), -6)
1294
1295 # Check behavior on ints
1296 self.assertEqual(round(0), 0)
1297 self.assertEqual(round(8), 8)
1298 self.assertEqual(round(-8), -8)
1299 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001300 self.assertEqual(type(round(-8, -1)), int)
1301 self.assertEqual(type(round(-8, 0)), int)
1302 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001303
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001304 # test new kwargs
1305 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1306
Walter Dörwald919497e2003-01-19 16:23:59 +00001307 self.assertRaises(TypeError, round)
1308
Alex Martelliae211f92007-08-22 23:21:33 +00001309 # test generic rounding delegation for reals
1310 class TestRound:
1311 def __round__(self):
1312 return 23
1313
1314 class TestNoRound:
1315 pass
1316
1317 self.assertEqual(round(TestRound()), 23)
1318
1319 self.assertRaises(TypeError, round, 1, 2, 3)
1320 self.assertRaises(TypeError, round, TestNoRound())
1321
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001322 t = TestNoRound()
1323 t.__round__ = lambda *args: args
1324 self.assertRaises(TypeError, round, t)
1325 self.assertRaises(TypeError, round, t, 0)
1326
Mark Dickinsonad731b92009-11-09 17:12:30 +00001327 # Some versions of glibc for alpha have a bug that affects
1328 # float -> integer rounding (floor, ceil, rint, round) for
1329 # values in the range [2**52, 2**53). See:
1330 #
1331 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1332 #
1333 # We skip this test on Linux/alpha if it would fail.
1334 linux_alpha = (platform.system().startswith('Linux') and
1335 platform.machine().startswith('alpha'))
1336 system_round_bug = round(5e15+1) != 5e15+1
1337 @unittest.skipIf(linux_alpha and system_round_bug,
1338 "test will fail; failure is probably due to a "
1339 "buggy system round function")
1340 def test_round_large(self):
1341 # Issue #1869: integral floats should remain unchanged
1342 self.assertEqual(round(5e15-1), 5e15-1)
1343 self.assertEqual(round(5e15), 5e15)
1344 self.assertEqual(round(5e15+1), 5e15+1)
1345 self.assertEqual(round(5e15+2), 5e15+2)
1346 self.assertEqual(round(5e15+3), 5e15+3)
1347
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001348 def test_bug_27936(self):
1349 # Verify that ndigits=None means the same as passing in no argument
1350 for x in [1234,
1351 1234.56,
1352 decimal.Decimal('1234.56'),
1353 fractions.Fraction(123456, 100)]:
1354 self.assertEqual(round(x, None), round(x))
1355 self.assertEqual(type(round(x, None)), type(round(x)))
1356
Walter Dörwald919497e2003-01-19 16:23:59 +00001357 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001358 setattr(sys, 'spam', 1)
1359 self.assertEqual(sys.spam, 1)
1360 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1361 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001362
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001363 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001364
Alex Martellia70b1912003-04-22 08:12:33 +00001365 def test_sum(self):
1366 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001367 self.assertEqual(sum(list(range(2,8))), 27)
1368 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001369 self.assertEqual(sum(Squares(10)), 285)
1370 self.assertEqual(sum(iter(Squares(10))), 285)
1371 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1372
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001373 self.assertEqual(sum(range(10), 1000), 1045)
1374 self.assertEqual(sum(range(10), start=1000), 1045)
1375
Alex Martellia70b1912003-04-22 08:12:33 +00001376 self.assertRaises(TypeError, sum)
1377 self.assertRaises(TypeError, sum, 42)
1378 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1379 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001380 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1381 values = [bytearray(b'a'), bytearray(b'b')]
1382 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001383 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1384 self.assertRaises(TypeError, sum, [{2:3}])
1385 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1386
1387 class BadSeq:
1388 def __getitem__(self, index):
1389 raise ValueError
1390 self.assertRaises(ValueError, sum, BadSeq())
1391
Mark Dickinson3a22b472009-10-17 21:48:16 +00001392 empty = []
1393 sum(([x] for x in range(10)), empty)
1394 self.assertEqual(empty, [])
1395
Walter Dörwald919497e2003-01-19 16:23:59 +00001396 def test_type(self):
1397 self.assertEqual(type(''), type('123'))
1398 self.assertNotEqual(type(''), type(()))
1399
Guido van Rossumfee7b932005-01-16 00:21:28 +00001400 # We don't want self in vars(), so these are static methods
1401
1402 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001403 def get_vars_f0():
1404 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001405
Guido van Rossumfee7b932005-01-16 00:21:28 +00001406 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001407 def get_vars_f2():
1408 BuiltinTest.get_vars_f0()
1409 a = 1
1410 b = 2
1411 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001412
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001413 class C_get_vars(object):
1414 def getDict(self):
1415 return {'a':2}
1416 __dict__ = property(fget=getDict)
1417
Walter Dörwald919497e2003-01-19 16:23:59 +00001418 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001419 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001420 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001421 self.assertEqual(self.get_vars_f0(), {})
1422 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1423 self.assertRaises(TypeError, vars, 42, 42)
1424 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001425 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001426
1427 def test_zip(self):
1428 a = (1, 2, 3)
1429 b = (4, 5, 6)
1430 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001431 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001432 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001433 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001434 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001435 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001436 class I:
1437 def __getitem__(self, i):
1438 if i < 0 or i > 2: raise IndexError
1439 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001440 self.assertEqual(list(zip(a, I())), t)
1441 self.assertEqual(list(zip()), [])
1442 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001443 self.assertRaises(TypeError, zip, None)
1444 class G:
1445 pass
1446 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001447 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001448
1449 # Make sure zip doesn't try to allocate a billion elements for the
1450 # result list when one of its arguments doesn't say how long it is.
1451 # A MemoryError is the most likely failure mode.
1452 class SequenceWithoutALength:
1453 def __getitem__(self, i):
1454 if i == 5:
1455 raise IndexError
1456 else:
1457 return i
1458 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001459 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 list(enumerate(range(5)))
1461 )
1462
1463 class BadSeq:
1464 def __getitem__(self, i):
1465 if i == 5:
1466 raise ValueError
1467 else:
1468 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001469 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001470
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001471 def test_zip_pickle(self):
1472 a = (1, 2, 3)
1473 b = (4, 5, 6)
1474 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001475 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1476 z1 = zip(a, b)
1477 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001478
Eric Smithe4d63172010-09-13 20:48:43 +00001479 def test_format(self):
1480 # Test the basic machinery of the format() builtin. Don't test
1481 # the specifics of the various formatters
1482 self.assertEqual(format(3, ''), '3')
1483
1484 # Returns some classes to use for various tests. There's
1485 # an old-style version, and a new-style version
1486 def classes_new():
1487 class A(object):
1488 def __init__(self, x):
1489 self.x = x
1490 def __format__(self, format_spec):
1491 return str(self.x) + format_spec
1492 class DerivedFromA(A):
1493 pass
1494
1495 class Simple(object): pass
1496 class DerivedFromSimple(Simple):
1497 def __init__(self, x):
1498 self.x = x
1499 def __format__(self, format_spec):
1500 return str(self.x) + format_spec
1501 class DerivedFromSimple2(DerivedFromSimple): pass
1502 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1503
1504 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1505 self.assertEqual(format(A(3), 'spec'), '3spec')
1506 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1507 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1508 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1509 '10abcdef')
1510
1511 class_test(*classes_new())
1512
1513 def empty_format_spec(value):
1514 # test that:
1515 # format(x, '') == str(x)
1516 # format(x) == str(x)
1517 self.assertEqual(format(value, ""), str(value))
1518 self.assertEqual(format(value), str(value))
1519
1520 # for builtin types, format(x, "") == str(x)
1521 empty_format_spec(17**13)
1522 empty_format_spec(1.0)
1523 empty_format_spec(3.1415e104)
1524 empty_format_spec(-3.1415e104)
1525 empty_format_spec(3.1415e-104)
1526 empty_format_spec(-3.1415e-104)
1527 empty_format_spec(object)
1528 empty_format_spec(None)
1529
1530 # TypeError because self.__format__ returns the wrong type
1531 class BadFormatResult:
1532 def __format__(self, format_spec):
1533 return 1.0
1534 self.assertRaises(TypeError, format, BadFormatResult(), "")
1535
1536 # TypeError because format_spec is not unicode or str
1537 self.assertRaises(TypeError, format, object(), 4)
1538 self.assertRaises(TypeError, format, object(), object())
1539
1540 # tests for object.__format__ really belong elsewhere, but
1541 # there's no good place to put them
1542 x = object().__format__('')
1543 self.assertTrue(x.startswith('<object object at'))
1544
1545 # first argument to object.__format__ must be string
1546 self.assertRaises(TypeError, object().__format__, 3)
1547 self.assertRaises(TypeError, object().__format__, object())
1548 self.assertRaises(TypeError, object().__format__, None)
1549
1550 # --------------------------------------------------------------------
1551 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001552 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001553 class A:
1554 def __format__(self, fmt_str):
1555 return format('', fmt_str)
1556
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001557 self.assertEqual(format(A()), '')
1558 self.assertEqual(format(A(), ''), '')
1559 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001560
1561 class B:
1562 pass
1563
1564 class C(object):
1565 pass
1566
1567 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001568 obj = cls()
1569 self.assertEqual(format(obj), str(obj))
1570 self.assertEqual(format(obj, ''), str(obj))
1571 with self.assertRaisesRegex(TypeError,
1572 r'\b%s\b' % re.escape(cls.__name__)):
1573 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001574 # --------------------------------------------------------------------
1575
1576 # make sure we can take a subclass of str as a format spec
1577 class DerivedFromStr(str): pass
1578 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1579
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001580 def test_bin(self):
1581 self.assertEqual(bin(0), '0b0')
1582 self.assertEqual(bin(1), '0b1')
1583 self.assertEqual(bin(-1), '-0b1')
1584 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1585 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1586 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1587 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1588
Georg Brandl953152f2009-07-22 12:03:59 +00001589 def test_bytearray_translate(self):
1590 x = bytearray(b"abc")
1591 self.assertRaises(ValueError, x.translate, b"1", 1)
1592 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1593
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001594 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001595 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001596 tp = type(const)
1597 self.assertIs(tp(), const)
1598 self.assertRaises(TypeError, tp, 1, 2)
1599 self.assertRaises(TypeError, tp, a=1, b=2)
1600
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001601
1602class TestBreakpoint(unittest.TestCase):
1603 def setUp(self):
1604 # These tests require a clean slate environment. For example, if the
1605 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1606 # will mess up these tests. Similarly for sys.breakpointhook.
1607 # Cleaning the slate here means you can't use breakpoint() to debug
1608 # these tests, but I think that's okay. Just use pdb.set_trace() if
1609 # you must.
1610 self.resources = ExitStack()
1611 self.addCleanup(self.resources.close)
1612 self.env = self.resources.enter_context(EnvironmentVarGuard())
1613 del self.env['PYTHONBREAKPOINT']
1614 self.resources.enter_context(
1615 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1616
1617 def test_breakpoint(self):
1618 with patch('pdb.set_trace') as mock:
1619 breakpoint()
1620 mock.assert_called_once()
1621
1622 def test_breakpoint_with_breakpointhook_set(self):
1623 my_breakpointhook = MagicMock()
1624 sys.breakpointhook = my_breakpointhook
1625 breakpoint()
1626 my_breakpointhook.assert_called_once_with()
1627
1628 def test_breakpoint_with_breakpointhook_reset(self):
1629 my_breakpointhook = MagicMock()
1630 sys.breakpointhook = my_breakpointhook
1631 breakpoint()
1632 my_breakpointhook.assert_called_once_with()
1633 # Reset the hook and it will not be called again.
1634 sys.breakpointhook = sys.__breakpointhook__
1635 with patch('pdb.set_trace') as mock:
1636 breakpoint()
1637 mock.assert_called_once_with()
1638 my_breakpointhook.assert_called_once_with()
1639
1640 def test_breakpoint_with_args_and_keywords(self):
1641 my_breakpointhook = MagicMock()
1642 sys.breakpointhook = my_breakpointhook
1643 breakpoint(1, 2, 3, four=4, five=5)
1644 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1645
1646 def test_breakpoint_with_passthru_error(self):
1647 def my_breakpointhook():
1648 pass
1649 sys.breakpointhook = my_breakpointhook
1650 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1651
1652 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1653 def test_envar_good_path_builtin(self):
1654 self.env['PYTHONBREAKPOINT'] = 'int'
1655 with patch('builtins.int') as mock:
1656 breakpoint('7')
1657 mock.assert_called_once_with('7')
1658
1659 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1660 def test_envar_good_path_other(self):
1661 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1662 with patch('sys.exit') as mock:
1663 breakpoint()
1664 mock.assert_called_once_with()
1665
1666 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1667 def test_envar_good_path_noop_0(self):
1668 self.env['PYTHONBREAKPOINT'] = '0'
1669 with patch('pdb.set_trace') as mock:
1670 breakpoint()
1671 mock.assert_not_called()
1672
1673 def test_envar_good_path_empty_string(self):
1674 # PYTHONBREAKPOINT='' is the same as it not being set.
1675 self.env['PYTHONBREAKPOINT'] = ''
1676 with patch('pdb.set_trace') as mock:
1677 breakpoint()
1678 mock.assert_called_once_with()
1679
1680 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1681 def test_envar_unimportable(self):
1682 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001683 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001684 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001685 'nosuchbuiltin',
1686 'nosuchmodule.nosuchcallable',
1687 ):
1688 with self.subTest(envar=envar):
1689 self.env['PYTHONBREAKPOINT'] = envar
1690 mock = self.resources.enter_context(patch('pdb.set_trace'))
1691 w = self.resources.enter_context(check_warnings(quiet=True))
1692 breakpoint()
1693 self.assertEqual(
1694 str(w.message),
1695 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1696 self.assertEqual(w.category, RuntimeWarning)
1697 mock.assert_not_called()
1698
1699 def test_envar_ignored_when_hook_is_set(self):
1700 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1701 with patch('sys.exit') as mock:
1702 sys.breakpointhook = int
1703 breakpoint()
1704 mock.assert_not_called()
1705
1706
Martin Panterc9a6ab52015-10-10 01:25:38 +00001707@unittest.skipUnless(pty, "the pty and signal modules must be available")
1708class PtyTests(unittest.TestCase):
1709 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1710 terminals in the test environment"""
1711
Martin Pantere44dba32015-10-10 05:27:15 +00001712 def run_child(self, child, terminal_input):
1713 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001714 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001715 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001716 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001717 os.close(r)
1718 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001719 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001720 raise
1721 if pid == 0:
1722 # Child
1723 try:
1724 # Make sure we don't get stuck if there's a problem
1725 signal.alarm(2)
1726 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001727 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001728 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001729 except:
1730 traceback.print_exc()
1731 finally:
1732 # We don't want to return to unittest...
1733 os._exit(0)
1734 # Parent
1735 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001736 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001737 # Get results from the pipe
1738 with open(r, "r") as rpipe:
1739 lines = []
1740 while True:
1741 line = rpipe.readline().strip()
1742 if line == "":
1743 # The other end was closed => the child exited
1744 break
1745 lines.append(line)
1746 # Check the result was got and corresponds to the user's terminal input
1747 if len(lines) != 2:
1748 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001749 # Beware of Linux raising EIO when the slave is closed
1750 child_output = bytearray()
1751 while True:
1752 try:
1753 chunk = os.read(fd, 3000)
1754 except OSError: # Assume EIO
1755 break
1756 if not chunk:
1757 break
1758 child_output.extend(chunk)
1759 os.close(fd)
1760 child_output = child_output.decode("ascii", "ignore")
1761 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1762 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001763 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001764
Victor Stinner3ca9f502017-08-09 23:08:22 +02001765 # Wait until the child process completes
1766 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001767
Martin Pantere44dba32015-10-10 05:27:15 +00001768 return lines
1769
1770 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1771 if not sys.stdin.isatty() or not sys.stdout.isatty():
1772 self.skipTest("stdin and stdout must be ttys")
1773 def child(wpipe):
1774 # Check the error handlers are accounted for
1775 if stdio_encoding:
1776 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1777 encoding=stdio_encoding,
1778 errors='surrogateescape')
1779 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1780 encoding=stdio_encoding,
1781 errors='replace')
1782 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1783 print(ascii(input(prompt)), file=wpipe)
1784 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001785 # Check we did exercise the GNU readline path
1786 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1787 if lines[0] != 'tty = True':
1788 self.skipTest("standard IO in should have been a tty")
1789 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1790 if stdio_encoding:
1791 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1792 else:
1793 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1794 self.assertEqual(input_result, expected)
1795
1796 def test_input_tty(self):
1797 # Test input() functionality when wired to a tty (the code path
1798 # is different and invokes GNU readline if available).
1799 self.check_input_tty("prompt", b"quux")
1800
1801 def test_input_tty_non_ascii(self):
1802 # Check stdin/stdout encoding is used when invoking GNU readline
1803 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1804
1805 def test_input_tty_non_ascii_unicode_errors(self):
1806 # Check stdin/stdout error handler is used when invoking GNU readline
1807 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1808
1809 def test_input_no_stdout_fileno(self):
1810 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1811 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001812 def child(wpipe):
1813 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1814 sys.stdout = io.StringIO() # Does not support fileno()
1815 input("prompt")
1816 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1817 lines = self.run_child(child, b"quux\r")
1818 expected = (
1819 "stdin.isatty(): True",
1820 "captured: 'prompt'",
1821 )
1822 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001823
Raymond Hettinger64958a12003-12-17 20:43:33 +00001824class TestSorted(unittest.TestCase):
1825
1826 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001827 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001828 copy = data[:]
1829 random.shuffle(copy)
1830 self.assertEqual(data, sorted(copy))
1831 self.assertNotEqual(data, copy)
1832
1833 data.reverse()
1834 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001835 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1836 self.assertNotEqual(data, copy)
1837 random.shuffle(copy)
1838 self.assertEqual(data, sorted(copy, reverse=1))
1839 self.assertNotEqual(data, copy)
1840
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001841 def test_bad_arguments(self):
1842 # Issue #29327: The first argument is positional-only.
1843 sorted([])
1844 with self.assertRaises(TypeError):
1845 sorted(iterable=[])
1846 # Other arguments are keyword-only
1847 sorted([], key=None)
1848 with self.assertRaises(TypeError):
1849 sorted([], None)
1850
Raymond Hettinger64958a12003-12-17 20:43:33 +00001851 def test_inputtypes(self):
1852 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001853 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001854 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001855 self.assertEqual(sorted(s), sorted(T(s)))
1856
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001857 s = ''.join(set(s)) # unique letters only
1858 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001859 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001860 self.assertEqual(sorted(s), sorted(T(s)))
1861
1862 def test_baddecorator(self):
1863 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1864 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1865
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001866
1867class ShutdownTest(unittest.TestCase):
1868
1869 def test_cleanup(self):
1870 # Issue #19255: builtins are still available at shutdown
1871 code = """if 1:
1872 import builtins
1873 import sys
1874
1875 class C:
1876 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001877 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001878 # Check that builtins still exist
1879 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001880 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001881
1882 c = C()
1883 # Make this module survive until builtins and sys are cleaned
1884 builtins.here = sys.modules[__name__]
1885 sys.here = sys.modules[__name__]
1886 # Create a reference loop so that this module needs to go
1887 # through a GC phase.
1888 here = sys.modules[__name__]
1889 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001890 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1891 # otherwise the codec may be unloaded before C.__del__() is called, and
1892 # so print("before") fails because the codec cannot be used to encode
1893 # "before" to sys.stdout.encoding. For example, on Windows,
1894 # sys.stdout.encoding is the OEM code page and these code pages are
1895 # implemented in Python
1896 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001897 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001898 self.assertEqual(["before", "after"], out.decode().splitlines())
1899
1900
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001901class TestType(unittest.TestCase):
1902 def test_new_type(self):
1903 A = type('A', (), {})
1904 self.assertEqual(A.__name__, 'A')
1905 self.assertEqual(A.__qualname__, 'A')
1906 self.assertEqual(A.__module__, __name__)
1907 self.assertEqual(A.__bases__, (object,))
1908 self.assertIs(A.__base__, object)
1909 x = A()
1910 self.assertIs(type(x), A)
1911 self.assertIs(x.__class__, A)
1912
1913 class B:
1914 def ham(self):
1915 return 'ham%d' % self
1916 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1917 self.assertEqual(C.__name__, 'C')
1918 self.assertEqual(C.__qualname__, 'C')
1919 self.assertEqual(C.__module__, __name__)
1920 self.assertEqual(C.__bases__, (B, int))
1921 self.assertIs(C.__base__, int)
1922 self.assertIn('spam', C.__dict__)
1923 self.assertNotIn('ham', C.__dict__)
1924 x = C(42)
1925 self.assertEqual(x, 42)
1926 self.assertIs(type(x), C)
1927 self.assertIs(x.__class__, C)
1928 self.assertEqual(x.ham(), 'ham42')
1929 self.assertEqual(x.spam(), 'spam42')
1930 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1931
Nick Coghland78448e2016-07-30 16:26:03 +10001932 def test_type_nokwargs(self):
1933 with self.assertRaises(TypeError):
1934 type('a', (), {}, x=5)
1935 with self.assertRaises(TypeError):
1936 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001937
1938 def test_type_name(self):
1939 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1940 with self.subTest(name=name):
1941 A = type(name, (), {})
1942 self.assertEqual(A.__name__, name)
1943 self.assertEqual(A.__qualname__, name)
1944 self.assertEqual(A.__module__, __name__)
1945 with self.assertRaises(ValueError):
1946 type('A\x00B', (), {})
1947 with self.assertRaises(ValueError):
1948 type('A\udcdcB', (), {})
1949 with self.assertRaises(TypeError):
1950 type(b'A', (), {})
1951
1952 C = type('C', (), {})
1953 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1954 with self.subTest(name=name):
1955 C.__name__ = name
1956 self.assertEqual(C.__name__, name)
1957 self.assertEqual(C.__qualname__, 'C')
1958 self.assertEqual(C.__module__, __name__)
1959
1960 A = type('C', (), {})
1961 with self.assertRaises(ValueError):
1962 A.__name__ = 'A\x00B'
1963 self.assertEqual(A.__name__, 'C')
1964 with self.assertRaises(ValueError):
1965 A.__name__ = 'A\udcdcB'
1966 self.assertEqual(A.__name__, 'C')
1967 with self.assertRaises(TypeError):
1968 A.__name__ = b'A'
1969 self.assertEqual(A.__name__, 'C')
1970
1971 def test_type_qualname(self):
1972 A = type('A', (), {'__qualname__': 'B.C'})
1973 self.assertEqual(A.__name__, 'A')
1974 self.assertEqual(A.__qualname__, 'B.C')
1975 self.assertEqual(A.__module__, __name__)
1976 with self.assertRaises(TypeError):
1977 type('A', (), {'__qualname__': b'B'})
1978 self.assertEqual(A.__qualname__, 'B.C')
1979
1980 A.__qualname__ = 'D.E'
1981 self.assertEqual(A.__name__, 'A')
1982 self.assertEqual(A.__qualname__, 'D.E')
1983 with self.assertRaises(TypeError):
1984 A.__qualname__ = b'B'
1985 self.assertEqual(A.__qualname__, 'D.E')
1986
1987 def test_type_doc(self):
1988 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1989 A = type('A', (), {'__doc__': doc})
1990 self.assertEqual(A.__doc__, doc)
1991 with self.assertRaises(UnicodeEncodeError):
1992 type('A', (), {'__doc__': 'x\udcdcy'})
1993
1994 A = type('A', (), {})
1995 self.assertEqual(A.__doc__, None)
1996 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1997 A.__doc__ = doc
1998 self.assertEqual(A.__doc__, doc)
1999
2000 def test_bad_args(self):
2001 with self.assertRaises(TypeError):
2002 type()
2003 with self.assertRaises(TypeError):
2004 type('A', ())
2005 with self.assertRaises(TypeError):
2006 type('A', (), {}, ())
2007 with self.assertRaises(TypeError):
2008 type('A', (), dict={})
2009 with self.assertRaises(TypeError):
2010 type('A', [], {})
2011 with self.assertRaises(TypeError):
2012 type('A', (), types.MappingProxyType({}))
2013 with self.assertRaises(TypeError):
2014 type('A', (None,), {})
2015 with self.assertRaises(TypeError):
2016 type('A', (bool,), {})
2017 with self.assertRaises(TypeError):
2018 type('A', (int, str), {})
2019
2020 def test_bad_slots(self):
2021 with self.assertRaises(TypeError):
2022 type('A', (), {'__slots__': b'x'})
2023 with self.assertRaises(TypeError):
2024 type('A', (int,), {'__slots__': 'x'})
2025 with self.assertRaises(TypeError):
2026 type('A', (), {'__slots__': ''})
2027 with self.assertRaises(TypeError):
2028 type('A', (), {'__slots__': '42'})
2029 with self.assertRaises(TypeError):
2030 type('A', (), {'__slots__': 'x\x00y'})
2031 with self.assertRaises(ValueError):
2032 type('A', (), {'__slots__': 'x', 'x': 0})
2033 with self.assertRaises(TypeError):
2034 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2035 with self.assertRaises(TypeError):
2036 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2037
2038 class B:
2039 pass
2040 with self.assertRaises(TypeError):
2041 type('A', (B,), {'__slots__': '__dict__'})
2042 with self.assertRaises(TypeError):
2043 type('A', (B,), {'__slots__': '__weakref__'})
2044
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002045 def test_namespace_order(self):
2046 # bpo-34320: namespace should preserve order
2047 od = collections.OrderedDict([('a', 1), ('b', 2)])
2048 od.move_to_end('a')
2049 expected = list(od.items())
2050
2051 C = type('C', (), od)
2052 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2053
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002054
Zachary Warea4b7a752013-11-24 01:19:09 -06002055def load_tests(loader, tests, pattern):
2056 from doctest import DocTestSuite
2057 tests.addTest(DocTestSuite(builtins))
2058 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002059
2060if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002061 unittest.main()