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