blob: 0bd4772dbb6e7dfcceab97faab66c4fb18b84c9b [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')
Brett Cannon0a6693a2019-09-11 12:38:22 +0100163 # 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')
327 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
328 compile('pass', '?', dont_inherit=1, 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)
1380
Alex Martellia70b1912003-04-22 08:12:33 +00001381 self.assertRaises(TypeError, sum)
1382 self.assertRaises(TypeError, sum, 42)
1383 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1384 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001385 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1386 values = [bytearray(b'a'), bytearray(b'b')]
1387 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001388 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1389 self.assertRaises(TypeError, sum, [{2:3}])
1390 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1391
1392 class BadSeq:
1393 def __getitem__(self, index):
1394 raise ValueError
1395 self.assertRaises(ValueError, sum, BadSeq())
1396
Mark Dickinson3a22b472009-10-17 21:48:16 +00001397 empty = []
1398 sum(([x] for x in range(10)), empty)
1399 self.assertEqual(empty, [])
1400
Walter Dörwald919497e2003-01-19 16:23:59 +00001401 def test_type(self):
1402 self.assertEqual(type(''), type('123'))
1403 self.assertNotEqual(type(''), type(()))
1404
Guido van Rossumfee7b932005-01-16 00:21:28 +00001405 # We don't want self in vars(), so these are static methods
1406
1407 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001408 def get_vars_f0():
1409 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001410
Guido van Rossumfee7b932005-01-16 00:21:28 +00001411 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001412 def get_vars_f2():
1413 BuiltinTest.get_vars_f0()
1414 a = 1
1415 b = 2
1416 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001417
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001418 class C_get_vars(object):
1419 def getDict(self):
1420 return {'a':2}
1421 __dict__ = property(fget=getDict)
1422
Walter Dörwald919497e2003-01-19 16:23:59 +00001423 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001424 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001425 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001426 self.assertEqual(self.get_vars_f0(), {})
1427 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1428 self.assertRaises(TypeError, vars, 42, 42)
1429 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001430 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001431
1432 def test_zip(self):
1433 a = (1, 2, 3)
1434 b = (4, 5, 6)
1435 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001436 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001437 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001438 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001439 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001440 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001441 class I:
1442 def __getitem__(self, i):
1443 if i < 0 or i > 2: raise IndexError
1444 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001445 self.assertEqual(list(zip(a, I())), t)
1446 self.assertEqual(list(zip()), [])
1447 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001448 self.assertRaises(TypeError, zip, None)
1449 class G:
1450 pass
1451 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001452 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001453
1454 # Make sure zip doesn't try to allocate a billion elements for the
1455 # result list when one of its arguments doesn't say how long it is.
1456 # A MemoryError is the most likely failure mode.
1457 class SequenceWithoutALength:
1458 def __getitem__(self, i):
1459 if i == 5:
1460 raise IndexError
1461 else:
1462 return i
1463 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001464 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001465 list(enumerate(range(5)))
1466 )
1467
1468 class BadSeq:
1469 def __getitem__(self, i):
1470 if i == 5:
1471 raise ValueError
1472 else:
1473 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001474 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001475
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001476 def test_zip_pickle(self):
1477 a = (1, 2, 3)
1478 b = (4, 5, 6)
1479 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001480 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1481 z1 = zip(a, b)
1482 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001483
Miss Islington (bot)27f41862019-08-29 23:23:17 -07001484 def test_zip_bad_iterable(self):
1485 exception = TypeError()
1486
1487 class BadIterable:
1488 def __iter__(self):
1489 raise exception
1490
1491 with self.assertRaises(TypeError) as cm:
1492 zip(BadIterable())
1493
1494 self.assertIs(cm.exception, exception)
1495
Eric Smithe4d63172010-09-13 20:48:43 +00001496 def test_format(self):
1497 # Test the basic machinery of the format() builtin. Don't test
1498 # the specifics of the various formatters
1499 self.assertEqual(format(3, ''), '3')
1500
1501 # Returns some classes to use for various tests. There's
1502 # an old-style version, and a new-style version
1503 def classes_new():
1504 class A(object):
1505 def __init__(self, x):
1506 self.x = x
1507 def __format__(self, format_spec):
1508 return str(self.x) + format_spec
1509 class DerivedFromA(A):
1510 pass
1511
1512 class Simple(object): pass
1513 class DerivedFromSimple(Simple):
1514 def __init__(self, x):
1515 self.x = x
1516 def __format__(self, format_spec):
1517 return str(self.x) + format_spec
1518 class DerivedFromSimple2(DerivedFromSimple): pass
1519 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1520
1521 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1522 self.assertEqual(format(A(3), 'spec'), '3spec')
1523 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1524 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1525 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1526 '10abcdef')
1527
1528 class_test(*classes_new())
1529
1530 def empty_format_spec(value):
1531 # test that:
1532 # format(x, '') == str(x)
1533 # format(x) == str(x)
1534 self.assertEqual(format(value, ""), str(value))
1535 self.assertEqual(format(value), str(value))
1536
1537 # for builtin types, format(x, "") == str(x)
1538 empty_format_spec(17**13)
1539 empty_format_spec(1.0)
1540 empty_format_spec(3.1415e104)
1541 empty_format_spec(-3.1415e104)
1542 empty_format_spec(3.1415e-104)
1543 empty_format_spec(-3.1415e-104)
1544 empty_format_spec(object)
1545 empty_format_spec(None)
1546
1547 # TypeError because self.__format__ returns the wrong type
1548 class BadFormatResult:
1549 def __format__(self, format_spec):
1550 return 1.0
1551 self.assertRaises(TypeError, format, BadFormatResult(), "")
1552
1553 # TypeError because format_spec is not unicode or str
1554 self.assertRaises(TypeError, format, object(), 4)
1555 self.assertRaises(TypeError, format, object(), object())
1556
1557 # tests for object.__format__ really belong elsewhere, but
1558 # there's no good place to put them
1559 x = object().__format__('')
1560 self.assertTrue(x.startswith('<object object at'))
1561
1562 # first argument to object.__format__ must be string
1563 self.assertRaises(TypeError, object().__format__, 3)
1564 self.assertRaises(TypeError, object().__format__, object())
1565 self.assertRaises(TypeError, object().__format__, None)
1566
1567 # --------------------------------------------------------------------
1568 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001569 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001570 class A:
1571 def __format__(self, fmt_str):
1572 return format('', fmt_str)
1573
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001574 self.assertEqual(format(A()), '')
1575 self.assertEqual(format(A(), ''), '')
1576 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001577
1578 class B:
1579 pass
1580
1581 class C(object):
1582 pass
1583
1584 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001585 obj = cls()
1586 self.assertEqual(format(obj), str(obj))
1587 self.assertEqual(format(obj, ''), str(obj))
1588 with self.assertRaisesRegex(TypeError,
1589 r'\b%s\b' % re.escape(cls.__name__)):
1590 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001591 # --------------------------------------------------------------------
1592
1593 # make sure we can take a subclass of str as a format spec
1594 class DerivedFromStr(str): pass
1595 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1596
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001597 def test_bin(self):
1598 self.assertEqual(bin(0), '0b0')
1599 self.assertEqual(bin(1), '0b1')
1600 self.assertEqual(bin(-1), '-0b1')
1601 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1602 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1603 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1604 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1605
Georg Brandl953152f2009-07-22 12:03:59 +00001606 def test_bytearray_translate(self):
1607 x = bytearray(b"abc")
1608 self.assertRaises(ValueError, x.translate, b"1", 1)
1609 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1610
Miss Islington (bot)5c4ce3e2019-06-26 13:17:00 -07001611 def test_bytearray_extend_error(self):
1612 array = bytearray()
1613 bad_iter = map(int, "X")
1614 self.assertRaises(ValueError, array.extend, bad_iter)
1615
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001616 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001617 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001618 tp = type(const)
1619 self.assertIs(tp(), const)
1620 self.assertRaises(TypeError, tp, 1, 2)
1621 self.assertRaises(TypeError, tp, a=1, b=2)
1622
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001623
1624class TestBreakpoint(unittest.TestCase):
1625 def setUp(self):
1626 # These tests require a clean slate environment. For example, if the
1627 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1628 # will mess up these tests. Similarly for sys.breakpointhook.
1629 # Cleaning the slate here means you can't use breakpoint() to debug
1630 # these tests, but I think that's okay. Just use pdb.set_trace() if
1631 # you must.
1632 self.resources = ExitStack()
1633 self.addCleanup(self.resources.close)
1634 self.env = self.resources.enter_context(EnvironmentVarGuard())
1635 del self.env['PYTHONBREAKPOINT']
1636 self.resources.enter_context(
1637 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1638
1639 def test_breakpoint(self):
1640 with patch('pdb.set_trace') as mock:
1641 breakpoint()
1642 mock.assert_called_once()
1643
1644 def test_breakpoint_with_breakpointhook_set(self):
1645 my_breakpointhook = MagicMock()
1646 sys.breakpointhook = my_breakpointhook
1647 breakpoint()
1648 my_breakpointhook.assert_called_once_with()
1649
1650 def test_breakpoint_with_breakpointhook_reset(self):
1651 my_breakpointhook = MagicMock()
1652 sys.breakpointhook = my_breakpointhook
1653 breakpoint()
1654 my_breakpointhook.assert_called_once_with()
1655 # Reset the hook and it will not be called again.
1656 sys.breakpointhook = sys.__breakpointhook__
1657 with patch('pdb.set_trace') as mock:
1658 breakpoint()
1659 mock.assert_called_once_with()
1660 my_breakpointhook.assert_called_once_with()
1661
1662 def test_breakpoint_with_args_and_keywords(self):
1663 my_breakpointhook = MagicMock()
1664 sys.breakpointhook = my_breakpointhook
1665 breakpoint(1, 2, 3, four=4, five=5)
1666 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1667
1668 def test_breakpoint_with_passthru_error(self):
1669 def my_breakpointhook():
1670 pass
1671 sys.breakpointhook = my_breakpointhook
1672 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1673
1674 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1675 def test_envar_good_path_builtin(self):
1676 self.env['PYTHONBREAKPOINT'] = 'int'
1677 with patch('builtins.int') as mock:
1678 breakpoint('7')
1679 mock.assert_called_once_with('7')
1680
1681 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1682 def test_envar_good_path_other(self):
1683 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1684 with patch('sys.exit') as mock:
1685 breakpoint()
1686 mock.assert_called_once_with()
1687
1688 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1689 def test_envar_good_path_noop_0(self):
1690 self.env['PYTHONBREAKPOINT'] = '0'
1691 with patch('pdb.set_trace') as mock:
1692 breakpoint()
1693 mock.assert_not_called()
1694
1695 def test_envar_good_path_empty_string(self):
1696 # PYTHONBREAKPOINT='' is the same as it not being set.
1697 self.env['PYTHONBREAKPOINT'] = ''
1698 with patch('pdb.set_trace') as mock:
1699 breakpoint()
1700 mock.assert_called_once_with()
1701
1702 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1703 def test_envar_unimportable(self):
1704 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001705 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001706 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001707 'nosuchbuiltin',
1708 'nosuchmodule.nosuchcallable',
1709 ):
1710 with self.subTest(envar=envar):
1711 self.env['PYTHONBREAKPOINT'] = envar
1712 mock = self.resources.enter_context(patch('pdb.set_trace'))
1713 w = self.resources.enter_context(check_warnings(quiet=True))
1714 breakpoint()
1715 self.assertEqual(
1716 str(w.message),
1717 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1718 self.assertEqual(w.category, RuntimeWarning)
1719 mock.assert_not_called()
1720
1721 def test_envar_ignored_when_hook_is_set(self):
1722 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1723 with patch('sys.exit') as mock:
1724 sys.breakpointhook = int
1725 breakpoint()
1726 mock.assert_not_called()
1727
1728
Martin Panterc9a6ab52015-10-10 01:25:38 +00001729@unittest.skipUnless(pty, "the pty and signal modules must be available")
1730class PtyTests(unittest.TestCase):
1731 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1732 terminals in the test environment"""
1733
Martin Pantere44dba32015-10-10 05:27:15 +00001734 def run_child(self, child, terminal_input):
1735 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001736 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001737 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001738 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001739 os.close(r)
1740 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001741 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001742 raise
1743 if pid == 0:
1744 # Child
1745 try:
1746 # Make sure we don't get stuck if there's a problem
1747 signal.alarm(2)
1748 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001749 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001750 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001751 except:
1752 traceback.print_exc()
1753 finally:
1754 # We don't want to return to unittest...
1755 os._exit(0)
1756 # Parent
1757 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001758 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001759 # Get results from the pipe
1760 with open(r, "r") as rpipe:
1761 lines = []
1762 while True:
1763 line = rpipe.readline().strip()
1764 if line == "":
1765 # The other end was closed => the child exited
1766 break
1767 lines.append(line)
1768 # Check the result was got and corresponds to the user's terminal input
1769 if len(lines) != 2:
1770 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001771 # Beware of Linux raising EIO when the slave is closed
1772 child_output = bytearray()
1773 while True:
1774 try:
1775 chunk = os.read(fd, 3000)
1776 except OSError: # Assume EIO
1777 break
1778 if not chunk:
1779 break
1780 child_output.extend(chunk)
1781 os.close(fd)
1782 child_output = child_output.decode("ascii", "ignore")
1783 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1784 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001785 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001786
Victor Stinner3ca9f502017-08-09 23:08:22 +02001787 # Wait until the child process completes
1788 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001789
Martin Pantere44dba32015-10-10 05:27:15 +00001790 return lines
1791
1792 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1793 if not sys.stdin.isatty() or not sys.stdout.isatty():
1794 self.skipTest("stdin and stdout must be ttys")
1795 def child(wpipe):
1796 # Check the error handlers are accounted for
1797 if stdio_encoding:
1798 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1799 encoding=stdio_encoding,
1800 errors='surrogateescape')
1801 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1802 encoding=stdio_encoding,
1803 errors='replace')
1804 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1805 print(ascii(input(prompt)), file=wpipe)
1806 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001807 # Check we did exercise the GNU readline path
1808 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1809 if lines[0] != 'tty = True':
1810 self.skipTest("standard IO in should have been a tty")
1811 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1812 if stdio_encoding:
1813 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1814 else:
1815 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1816 self.assertEqual(input_result, expected)
1817
1818 def test_input_tty(self):
1819 # Test input() functionality when wired to a tty (the code path
1820 # is different and invokes GNU readline if available).
1821 self.check_input_tty("prompt", b"quux")
1822
1823 def test_input_tty_non_ascii(self):
1824 # Check stdin/stdout encoding is used when invoking GNU readline
1825 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1826
1827 def test_input_tty_non_ascii_unicode_errors(self):
1828 # Check stdin/stdout error handler is used when invoking GNU readline
1829 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1830
1831 def test_input_no_stdout_fileno(self):
1832 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1833 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001834 def child(wpipe):
1835 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1836 sys.stdout = io.StringIO() # Does not support fileno()
1837 input("prompt")
1838 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1839 lines = self.run_child(child, b"quux\r")
1840 expected = (
1841 "stdin.isatty(): True",
1842 "captured: 'prompt'",
1843 )
1844 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001845
Raymond Hettinger64958a12003-12-17 20:43:33 +00001846class TestSorted(unittest.TestCase):
1847
1848 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001849 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001850 copy = data[:]
1851 random.shuffle(copy)
1852 self.assertEqual(data, sorted(copy))
1853 self.assertNotEqual(data, copy)
1854
1855 data.reverse()
1856 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001857 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1858 self.assertNotEqual(data, copy)
1859 random.shuffle(copy)
1860 self.assertEqual(data, sorted(copy, reverse=1))
1861 self.assertNotEqual(data, copy)
1862
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001863 def test_bad_arguments(self):
1864 # Issue #29327: The first argument is positional-only.
1865 sorted([])
1866 with self.assertRaises(TypeError):
1867 sorted(iterable=[])
1868 # Other arguments are keyword-only
1869 sorted([], key=None)
1870 with self.assertRaises(TypeError):
1871 sorted([], None)
1872
Raymond Hettinger64958a12003-12-17 20:43:33 +00001873 def test_inputtypes(self):
1874 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001875 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001876 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001877 self.assertEqual(sorted(s), sorted(T(s)))
1878
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001879 s = ''.join(set(s)) # unique letters only
1880 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001881 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001882 self.assertEqual(sorted(s), sorted(T(s)))
1883
1884 def test_baddecorator(self):
1885 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1886 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1887
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001888
1889class ShutdownTest(unittest.TestCase):
1890
1891 def test_cleanup(self):
1892 # Issue #19255: builtins are still available at shutdown
1893 code = """if 1:
1894 import builtins
1895 import sys
1896
1897 class C:
1898 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001899 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001900 # Check that builtins still exist
1901 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001902 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001903
1904 c = C()
1905 # Make this module survive until builtins and sys are cleaned
1906 builtins.here = sys.modules[__name__]
1907 sys.here = sys.modules[__name__]
1908 # Create a reference loop so that this module needs to go
1909 # through a GC phase.
1910 here = sys.modules[__name__]
1911 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001912 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1913 # otherwise the codec may be unloaded before C.__del__() is called, and
1914 # so print("before") fails because the codec cannot be used to encode
1915 # "before" to sys.stdout.encoding. For example, on Windows,
1916 # sys.stdout.encoding is the OEM code page and these code pages are
1917 # implemented in Python
1918 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001919 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001920 self.assertEqual(["before", "after"], out.decode().splitlines())
1921
1922
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001923class TestType(unittest.TestCase):
1924 def test_new_type(self):
1925 A = type('A', (), {})
1926 self.assertEqual(A.__name__, 'A')
1927 self.assertEqual(A.__qualname__, 'A')
1928 self.assertEqual(A.__module__, __name__)
1929 self.assertEqual(A.__bases__, (object,))
1930 self.assertIs(A.__base__, object)
1931 x = A()
1932 self.assertIs(type(x), A)
1933 self.assertIs(x.__class__, A)
1934
1935 class B:
1936 def ham(self):
1937 return 'ham%d' % self
1938 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1939 self.assertEqual(C.__name__, 'C')
1940 self.assertEqual(C.__qualname__, 'C')
1941 self.assertEqual(C.__module__, __name__)
1942 self.assertEqual(C.__bases__, (B, int))
1943 self.assertIs(C.__base__, int)
1944 self.assertIn('spam', C.__dict__)
1945 self.assertNotIn('ham', C.__dict__)
1946 x = C(42)
1947 self.assertEqual(x, 42)
1948 self.assertIs(type(x), C)
1949 self.assertIs(x.__class__, C)
1950 self.assertEqual(x.ham(), 'ham42')
1951 self.assertEqual(x.spam(), 'spam42')
1952 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1953
Nick Coghland78448e2016-07-30 16:26:03 +10001954 def test_type_nokwargs(self):
1955 with self.assertRaises(TypeError):
1956 type('a', (), {}, x=5)
1957 with self.assertRaises(TypeError):
1958 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001959
1960 def test_type_name(self):
1961 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1962 with self.subTest(name=name):
1963 A = type(name, (), {})
1964 self.assertEqual(A.__name__, name)
1965 self.assertEqual(A.__qualname__, name)
1966 self.assertEqual(A.__module__, __name__)
1967 with self.assertRaises(ValueError):
1968 type('A\x00B', (), {})
1969 with self.assertRaises(ValueError):
1970 type('A\udcdcB', (), {})
1971 with self.assertRaises(TypeError):
1972 type(b'A', (), {})
1973
1974 C = type('C', (), {})
1975 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1976 with self.subTest(name=name):
1977 C.__name__ = name
1978 self.assertEqual(C.__name__, name)
1979 self.assertEqual(C.__qualname__, 'C')
1980 self.assertEqual(C.__module__, __name__)
1981
1982 A = type('C', (), {})
1983 with self.assertRaises(ValueError):
1984 A.__name__ = 'A\x00B'
1985 self.assertEqual(A.__name__, 'C')
1986 with self.assertRaises(ValueError):
1987 A.__name__ = 'A\udcdcB'
1988 self.assertEqual(A.__name__, 'C')
1989 with self.assertRaises(TypeError):
1990 A.__name__ = b'A'
1991 self.assertEqual(A.__name__, 'C')
1992
1993 def test_type_qualname(self):
1994 A = type('A', (), {'__qualname__': 'B.C'})
1995 self.assertEqual(A.__name__, 'A')
1996 self.assertEqual(A.__qualname__, 'B.C')
1997 self.assertEqual(A.__module__, __name__)
1998 with self.assertRaises(TypeError):
1999 type('A', (), {'__qualname__': b'B'})
2000 self.assertEqual(A.__qualname__, 'B.C')
2001
2002 A.__qualname__ = 'D.E'
2003 self.assertEqual(A.__name__, 'A')
2004 self.assertEqual(A.__qualname__, 'D.E')
2005 with self.assertRaises(TypeError):
2006 A.__qualname__ = b'B'
2007 self.assertEqual(A.__qualname__, 'D.E')
2008
2009 def test_type_doc(self):
2010 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2011 A = type('A', (), {'__doc__': doc})
2012 self.assertEqual(A.__doc__, doc)
2013 with self.assertRaises(UnicodeEncodeError):
2014 type('A', (), {'__doc__': 'x\udcdcy'})
2015
2016 A = type('A', (), {})
2017 self.assertEqual(A.__doc__, None)
2018 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2019 A.__doc__ = doc
2020 self.assertEqual(A.__doc__, doc)
2021
2022 def test_bad_args(self):
2023 with self.assertRaises(TypeError):
2024 type()
2025 with self.assertRaises(TypeError):
2026 type('A', ())
2027 with self.assertRaises(TypeError):
2028 type('A', (), {}, ())
2029 with self.assertRaises(TypeError):
2030 type('A', (), dict={})
2031 with self.assertRaises(TypeError):
2032 type('A', [], {})
2033 with self.assertRaises(TypeError):
2034 type('A', (), types.MappingProxyType({}))
2035 with self.assertRaises(TypeError):
2036 type('A', (None,), {})
2037 with self.assertRaises(TypeError):
2038 type('A', (bool,), {})
2039 with self.assertRaises(TypeError):
2040 type('A', (int, str), {})
2041
2042 def test_bad_slots(self):
2043 with self.assertRaises(TypeError):
2044 type('A', (), {'__slots__': b'x'})
2045 with self.assertRaises(TypeError):
2046 type('A', (int,), {'__slots__': 'x'})
2047 with self.assertRaises(TypeError):
2048 type('A', (), {'__slots__': ''})
2049 with self.assertRaises(TypeError):
2050 type('A', (), {'__slots__': '42'})
2051 with self.assertRaises(TypeError):
2052 type('A', (), {'__slots__': 'x\x00y'})
2053 with self.assertRaises(ValueError):
2054 type('A', (), {'__slots__': 'x', 'x': 0})
2055 with self.assertRaises(TypeError):
2056 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2057 with self.assertRaises(TypeError):
2058 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2059
2060 class B:
2061 pass
2062 with self.assertRaises(TypeError):
2063 type('A', (B,), {'__slots__': '__dict__'})
2064 with self.assertRaises(TypeError):
2065 type('A', (B,), {'__slots__': '__weakref__'})
2066
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002067 def test_namespace_order(self):
2068 # bpo-34320: namespace should preserve order
2069 od = collections.OrderedDict([('a', 1), ('b', 2)])
2070 od.move_to_end('a')
2071 expected = list(od.items())
2072
2073 C = type('C', (), od)
2074 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2075
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002076
Zachary Warea4b7a752013-11-24 01:19:09 -06002077def load_tests(loader, tests, pattern):
2078 from doctest import DocTestSuite
2079 tests.addTest(DocTestSuite(builtins))
2080 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002081
2082if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002083 unittest.main()