blob: 295f0713bfd5977650b5d42c2ad392ec360813f2 [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
Brandt Bucher226a0122020-12-04 19:45:57 -08009import gc
Benjamin Peterson076e0312010-08-23 21:58:59 +000010import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +020011import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010012import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000013import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020014import platform
15import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020016import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020017import sys
18import traceback
19import types
20import unittest
21import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040022from contextlib import ExitStack
Ammar Askar87d6cd32019-09-21 00:28:49 -040023from functools import partial
Matthias Bussonnier565b4f12019-05-21 13:12:03 -070024from inspect import CO_COROUTINE
25from itertools import product
26from textwrap import dedent
27from types import AsyncGeneratorType, FunctionType
Victor Stinnerf86a5e82012-06-05 13:43:22 +020028from operator import neg
Victor Stinner278c1e12020-03-31 20:08:12 +020029from test import support
Hai Shia7f5d932020-08-04 00:41:24 +080030from test.support import (swap_attr, maybe_get_event_loop_policy)
31from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink)
Berker Peksagce643912015-05-06 06:33:17 +030032from test.support.script_helper import assert_python_ok
Hai Shia7f5d932020-08-04 00:41:24 +080033from test.support.warnings_helper import check_warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040034from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010035try:
Antoine Pitrou772add72011-11-06 02:37:42 +010036 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010037except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010038 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000039
Guido van Rossum3bead091992-01-27 17:00:37 +000040
Walter Dörwald919497e2003-01-19 16:23:59 +000041class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000042
Walter Dörwald919497e2003-01-19 16:23:59 +000043 def __init__(self, max):
44 self.max = max
45 self.sofar = []
46
47 def __len__(self): return len(self.sofar)
48
49 def __getitem__(self, i):
50 if not 0 <= i < self.max: raise IndexError
51 n = len(self.sofar)
52 while n <= i:
53 self.sofar.append(n*n)
54 n += 1
55 return self.sofar[i]
56
57class StrSquares:
58
59 def __init__(self, max):
60 self.max = max
61 self.sofar = []
62
63 def __len__(self):
64 return len(self.sofar)
65
66 def __getitem__(self, i):
67 if not 0 <= i < self.max:
68 raise IndexError
69 n = len(self.sofar)
70 while n <= i:
71 self.sofar.append(str(n*n))
72 n += 1
73 return self.sofar[i]
74
75class BitBucket:
76 def write(self, line):
77 pass
78
Facundo Batista2336bdd2008-01-19 19:12:01 +000079test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000080 ('0', 0),
81 ('1', 1),
82 ('9', 9),
83 ('10', 10),
84 ('99', 99),
85 ('100', 100),
86 ('314', 314),
87 (' 314', 314),
88 ('314 ', 314),
89 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000090 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000091 (' 1x', ValueError),
92 (' 1 ', 1),
93 (' 1\02 ', ValueError),
94 ('', ValueError),
95 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000096 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040097 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000098 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000099]
100
Facundo Batista2336bdd2008-01-19 19:12:01 +0000101test_conv_sign = [
102 ('0', 0),
103 ('1', 1),
104 ('9', 9),
105 ('10', 10),
106 ('99', 99),
107 ('100', 100),
108 ('314', 314),
109 (' 314', ValueError),
110 ('314 ', 314),
111 (' \t\t 314 \t\t ', ValueError),
112 (repr(sys.maxsize), sys.maxsize),
113 (' 1x', ValueError),
114 (' 1 ', ValueError),
115 (' 1\02 ', ValueError),
116 ('', ValueError),
117 (' ', ValueError),
118 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400119 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000120 (chr(0x200), ValueError),
121]
122
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000124 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000125 raise RuntimeError
126
127class TestFailingIter:
128 def __iter__(self):
129 raise RuntimeError
130
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000131def filter_char(arg):
132 return ord(arg) > ord("d")
133
134def map_char(arg):
135 return chr(ord(arg)+1)
136
Walter Dörwald919497e2003-01-19 16:23:59 +0000137class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000138 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200139 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000140 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200141 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000142 it = pickle.loads(d)
143 self.assertEqual(type(itorg), type(it))
144 self.assertEqual(list(it), seq)
145
146 #test the iterator after dropping one from it
147 it = pickle.loads(d)
148 try:
149 next(it)
150 except StopIteration:
151 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200152 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000153 it = pickle.loads(d)
154 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000155
156 def test_import(self):
157 __import__('sys')
158 __import__('time')
159 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000160 __import__(name='sys')
161 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000162 self.assertRaises(ImportError, __import__, 'spamspam')
163 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000164 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000165 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Ben Lewis92420b32019-09-11 20:09:47 +1000166 # Relative import outside of a package with no __package__ or __spec__ (bpo-37409).
Xtreak6e1a30b2019-09-12 10:29:36 +0100167 with self.assertWarns(ImportWarning):
168 self.assertRaises(ImportError, __import__, '',
169 {'__package__': None, '__spec__': None, '__name__': '__main__'},
170 locals={}, fromlist=('foo',), level=1)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300171 # embedded null character
172 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000173
174 def test_abs(self):
175 # int
176 self.assertEqual(abs(0), 0)
177 self.assertEqual(abs(1234), 1234)
178 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000179 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000180 # float
181 self.assertEqual(abs(0.0), 0.0)
182 self.assertEqual(abs(3.14), 3.14)
183 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 # str
185 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000186 # bool
187 self.assertEqual(abs(True), 1)
188 self.assertEqual(abs(False), 0)
189 # other
190 self.assertRaises(TypeError, abs)
191 self.assertRaises(TypeError, abs, None)
192 class AbsClass(object):
193 def __abs__(self):
194 return -5
195 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000196
Raymond Hettinger96229b12005-03-11 06:49:40 +0000197 def test_all(self):
198 self.assertEqual(all([2, 4, 6]), True)
199 self.assertEqual(all([2, None, 6]), False)
200 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
201 self.assertRaises(RuntimeError, all, TestFailingIter())
202 self.assertRaises(TypeError, all, 10) # Non-iterable
203 self.assertRaises(TypeError, all) # No args
204 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
205 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200206 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000207 S = [50, 60]
208 self.assertEqual(all(x > 42 for x in S), True)
209 S = [50, 40, 60]
210 self.assertEqual(all(x > 42 for x in S), False)
211
212 def test_any(self):
213 self.assertEqual(any([None, None, None]), False)
214 self.assertEqual(any([None, 4, None]), True)
215 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500216 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000217 self.assertRaises(TypeError, any, 10) # Non-iterable
218 self.assertRaises(TypeError, any) # No args
219 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
220 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200221 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000222 S = [40, 60, 30]
223 self.assertEqual(any(x > 42 for x in S), True)
224 S = [10, 20, 30]
225 self.assertEqual(any(x > 42 for x in S), False)
226
Georg Brandl559e5d72008-06-11 18:37:52 +0000227 def test_ascii(self):
228 self.assertEqual(ascii(''), '\'\'')
229 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000230 self.assertEqual(ascii(()), '()')
231 self.assertEqual(ascii([]), '[]')
232 self.assertEqual(ascii({}), '{}')
233 a = []
234 a.append(a)
235 self.assertEqual(ascii(a), '[[...]]')
236 a = {}
237 a[0] = a
238 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000239 # Advanced checks for unicode strings
240 def _check_uni(s):
241 self.assertEqual(ascii(s), repr(s))
242 _check_uni("'")
243 _check_uni('"')
244 _check_uni('"\'')
245 _check_uni('\0')
246 _check_uni('\r\n\t .')
247 # Unprintable non-ASCII characters
248 _check_uni('\x85')
249 _check_uni('\u1fff')
250 _check_uni('\U00012fff')
251 # Lone surrogates
252 _check_uni('\ud800')
253 _check_uni('\udfff')
254 # Issue #9804: surrogates should be joined even for printable
255 # wide characters (UCS-2 builds).
256 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
257 # All together
258 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
259 self.assertEqual(ascii(s),
260 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000261
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000263 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000264 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000265 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000266
Walter Dörwald919497e2003-01-19 16:23:59 +0000267 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000268 self.assertTrue(callable(len))
269 self.assertFalse(callable("a"))
270 self.assertTrue(callable(callable))
271 self.assertTrue(callable(lambda x, y: x + y))
272 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000273 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000274 self.assertTrue(callable(f))
275
276 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000277 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000278 self.assertTrue(callable(C1))
279 c = C1()
280 self.assertTrue(callable(c.meth))
281 self.assertFalse(callable(c))
282
283 # __call__ is looked up on the class, not the instance
284 c.__call__ = None
285 self.assertFalse(callable(c))
286 c.__call__ = lambda self: 0
287 self.assertFalse(callable(c))
288 del c.__call__
289 self.assertFalse(callable(c))
290
291 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000292 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000293 c2 = C2()
294 self.assertTrue(callable(c2))
295 c2.__call__ = None
296 self.assertTrue(callable(c2))
297 class C3(C2): pass
298 c3 = C3()
299 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000300
301 def test_chr(self):
302 self.assertEqual(chr(32), ' ')
303 self.assertEqual(chr(65), 'A')
304 self.assertEqual(chr(97), 'a')
305 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000306 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000307 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300308 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000309 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000310 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
311 self.assertEqual(chr(0x00010000), "\U00010000")
312 self.assertEqual(chr(0x00010001), "\U00010001")
313 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
314 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
315 self.assertEqual(chr(0x00100000), "\U00100000")
316 self.assertEqual(chr(0x00100001), "\U00100001")
317 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
318 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
319 self.assertRaises(ValueError, chr, -1)
320 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000321 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000322
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000323 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000324 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000325
Walter Dörwald919497e2003-01-19 16:23:59 +0000326 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000327 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000328 bom = b'\xef\xbb\xbf'
329 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330 compile(source='pass', filename='?', mode='exec')
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300331 compile(dont_inherit=False, filename='tmp', source='0', mode='eval')
332 compile('pass', '?', dont_inherit=True, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000333 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000335 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
336 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300337 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
339 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000340 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300341 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000342 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000343
Georg Brandl8334fd92010-12-04 10:26:46 +0000344 # test the optimize argument
345
346 codestr = '''def f():
347 """doc"""
diana543386b2017-10-03 10:46:56 -0600348 debug_enabled = False
349 if __debug__:
350 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000351 try:
352 assert False
353 except AssertionError:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200354 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000355 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200356 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000357 '''
358 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200359 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
360 (0, True, 'doc', True, True),
361 (1, False, 'doc', False, False),
362 (2, False, None, False, False)]
363 for optval, *expected in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000364 # test both direct compilation and compilation via AST
365 codeobjs = []
366 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
367 tree = ast.parse(codestr)
368 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
369 for code in codeobjs:
370 ns = {}
371 exec(code, ns)
372 rv = ns['f']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200373 self.assertEqual(rv, tuple(expected))
Georg Brandl8334fd92010-12-04 10:26:46 +0000374
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700375 def test_compile_top_level_await_no_coro(self):
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100376 """Make sure top level non-await codes get the correct coroutine flags"""
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700377 modes = ('single', 'exec')
378 code_samples = [
379 '''def f():pass\n''',
Pablo Galindoc2c1f1f2020-07-06 23:30:14 +0100380 '''[x for x in l]''',
381 '''{x for x in l}''',
382 '''(x for x in l)''',
383 '''{x:x for x in l}''',
Matthias Bussonnierbd461742020-07-06 14:26:52 -0700384 ]
385 for mode, code_sample in product(modes, code_samples):
386 source = dedent(code_sample)
387 co = compile(source,
388 '?',
389 mode,
390 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
391
392 self.assertNotEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
393 msg=f"source={source} mode={mode}")
394
395
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700396 def test_compile_top_level_await(self):
397 """Test whether code some top level await can be compiled.
398
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400399 Make sure it compiles only with the PyCF_ALLOW_TOP_LEVEL_AWAIT flag
400 set, and make sure the generated code object has the CO_COROUTINE flag
401 set in order to execute it with `await eval(.....)` instead of exec,
402 or via a FunctionType.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700403 """
404
405 # helper function just to check we can run top=level async-for
406 async def arange(n):
407 for i in range(n):
408 yield i
409
410 modes = ('single', 'exec')
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400411 code_samples = [
412 '''a = await asyncio.sleep(0, result=1)''',
413 '''async for i in arange(1):
414 a = 1''',
415 '''async with asyncio.Lock() as l:
Batuhan Taşkaya9052f7a2020-03-19 14:35:44 +0300416 a = 1''',
417 '''a = [x async for x in arange(2)][1]''',
418 '''a = 1 in {x async for x in arange(2)}''',
419 '''a = {x:1 async for x in arange(1)}[0]''',
420 '''a = [x async for x in arange(2) async for x in arange(2)][1]''',
421 '''a = [x async for x in (x async for x in arange(5))][1]''',
422 '''a, = [1 for x in {x async for x in arange(1)}]''',
423 '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]'''
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400424 ]
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700425 policy = maybe_get_event_loop_policy()
426 try:
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400427 for mode, code_sample in product(modes, code_samples):
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700428 source = dedent(code_sample)
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400429 with self.assertRaises(
430 SyntaxError, msg=f"source={source} mode={mode}"):
431 compile(source, '?', mode)
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700432
433 co = compile(source,
434 '?',
435 mode,
436 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
437
438 self.assertEqual(co.co_flags & CO_COROUTINE, CO_COROUTINE,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400439 msg=f"source={source} mode={mode}")
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700440
441 # test we can create and advance a function type
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400442 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700443 async_f = FunctionType(co, globals_)
444 asyncio.run(async_f())
445 self.assertEqual(globals_['a'], 1)
446
447 # test we can await-eval,
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400448 globals_ = {'asyncio': asyncio, 'a': 0, 'arange': arange}
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700449 asyncio.run(eval(co, globals_))
450 self.assertEqual(globals_['a'], 1)
451 finally:
452 asyncio.set_event_loop_policy(policy)
453
Pablo Galindo90235812020-03-15 04:29:22 +0000454 def test_compile_top_level_await_invalid_cases(self):
455 # helper function just to check we can run top=level async-for
456 async def arange(n):
457 for i in range(n):
458 yield i
459
460 modes = ('single', 'exec')
461 code_samples = [
462 '''def f(): await arange(10)\n''',
463 '''def f(): [x async for x in arange(10)]\n''',
464 '''def f(): [await x async for x in arange(10)]\n''',
465 '''def f():
466 async for i in arange(1):
467 a = 1
468 ''',
469 '''def f():
470 async with asyncio.Lock() as l:
471 a = 1
472 '''
473 ]
474 policy = maybe_get_event_loop_policy()
475 try:
476 for mode, code_sample in product(modes, code_samples):
477 source = dedent(code_sample)
478 with self.assertRaises(
479 SyntaxError, msg=f"source={source} mode={mode}"):
480 compile(source, '?', mode)
481
482 with self.assertRaises(
483 SyntaxError, msg=f"source={source} mode={mode}"):
484 co = compile(source,
485 '?',
486 mode,
487 flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
488 finally:
489 asyncio.set_event_loop_policy(policy)
490
491
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700492 def test_compile_async_generator(self):
493 """
494 With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
Yury Selivanoveca18aa2019-05-21 17:20:21 -0400495 make sure AsyncGenerators are still properly not marked with the
496 CO_COROUTINE flag.
Matthias Bussonnier565b4f12019-05-21 13:12:03 -0700497 """
498 code = dedent("""async def ticker():
499 for i in range(10):
500 yield i
501 await asyncio.sleep(0)""")
502
503 co = compile(code, '?', 'exec', flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
504 glob = {}
505 exec(co, glob)
506 self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
507
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000509 sys.spam = 1
510 delattr(sys, 'spam')
511 self.assertRaises(TypeError, delattr)
512
513 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000514 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000515 self.assertRaises(TypeError, dir, 42, 42)
516
Georg Brandle32b4222007-03-10 22:13:27 +0000517 # dir() - local scope
518 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000519 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000520
521 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000522 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000523
524 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000525 class Foo(types.ModuleType):
526 __dict__ = 8
527 f = Foo("foo")
528 self.assertRaises(TypeError, dir, f)
529
530 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000531 self.assertIn("strip", dir(str))
532 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000533
534 # dir(obj)
535 class Foo(object):
536 def __init__(self):
537 self.x = 7
538 self.y = 8
539 self.z = 9
540 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000541 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000542
543 # dir(obj_no__dict__)
544 class Foo(object):
545 __slots__ = []
546 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000547 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000548
549 # dir(obj_no__class__with__dict__)
550 # (an ugly trick to cause getattr(f, "__class__") to fail)
551 class Foo(object):
552 __slots__ = ["__class__", "__dict__"]
553 def __init__(self):
554 self.bar = "wow"
555 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000556 self.assertNotIn("__repr__", dir(f))
557 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000558
559 # dir(obj_using __dir__)
560 class Foo(object):
561 def __dir__(self):
562 return ["kan", "ga", "roo"]
563 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000564 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000565
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500566 # dir(obj__dir__tuple)
567 class Foo(object):
568 def __dir__(self):
569 return ("b", "c", "a")
570 res = dir(Foo())
571 self.assertIsInstance(res, list)
572 self.assertTrue(res == ["a", "b", "c"])
573
574 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000575 class Foo(object):
576 def __dir__(self):
577 return 7
578 f = Foo()
579 self.assertRaises(TypeError, dir, f)
580
Collin Winter3eed7652007-08-14 17:53:54 +0000581 # dir(traceback)
582 try:
583 raise IndexError
584 except:
585 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
586
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500587 # test that object has a __dir__()
588 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000589
Walter Dörwald919497e2003-01-19 16:23:59 +0000590 def test_divmod(self):
591 self.assertEqual(divmod(12, 7), (1, 5))
592 self.assertEqual(divmod(-12, 7), (-2, 2))
593 self.assertEqual(divmod(12, -7), (-2, -2))
594 self.assertEqual(divmod(-12, -7), (1, -5))
595
Mark Dickinson5c2db372009-12-05 20:28:34 +0000596 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000597
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000598 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
599 (-3.25, 1.0, (-4.0, 0.75)),
600 (3.25, -1.0, (-4.0, -0.75)),
601 (-3.25, -1.0, (3.0, -0.25))]:
602 result = divmod(num, denom)
603 self.assertAlmostEqual(result[0], exp_result[0])
604 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000605
606 self.assertRaises(TypeError, divmod)
607
608 def test_eval(self):
609 self.assertEqual(eval('1+1'), 2)
610 self.assertEqual(eval(' 1+1\n'), 2)
611 globals = {'a': 1, 'b': 2}
612 locals = {'b': 200, 'c': 300}
613 self.assertEqual(eval('a', globals) , 1)
614 self.assertEqual(eval('a', globals, locals), 1)
615 self.assertEqual(eval('b', globals, locals), 200)
616 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 globals = {'a': 1, 'b': 2}
618 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000619 bom = b'\xef\xbb\xbf'
620 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000621 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 self.assertRaises(TypeError, eval)
623 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000624 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000625
Benjamin Peterson92722792012-12-15 12:51:05 -0500626 class X:
627 def __getitem__(self, key):
628 raise ValueError
629 self.assertRaises(ValueError, eval, "foo", {}, X())
630
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000631 def test_general_eval(self):
632 # Tests that general mappings can be used for the locals argument
633
634 class M:
635 "Test mapping interface versus possible calls from eval()."
636 def __getitem__(self, key):
637 if key == 'a':
638 return 12
639 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000640 def keys(self):
641 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000642
643 m = M()
644 g = globals()
645 self.assertEqual(eval('a', g, m), 12)
646 self.assertRaises(NameError, eval, 'b', g, m)
647 self.assertEqual(eval('dir()', g, m), list('xyz'))
648 self.assertEqual(eval('globals()', g, m), g)
649 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000650 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000651 class A:
652 "Non-mapping"
653 pass
654 m = A()
655 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000656
657 # Verify that dict subclasses work as well
658 class D(dict):
659 def __getitem__(self, key):
660 if key == 'a':
661 return 12
662 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000663 def keys(self):
664 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000665
666 d = D()
667 self.assertEqual(eval('a', g, d), 12)
668 self.assertRaises(NameError, eval, 'b', g, d)
669 self.assertEqual(eval('dir()', g, d), list('xyz'))
670 self.assertEqual(eval('globals()', g, d), g)
671 self.assertEqual(eval('locals()', g, d), d)
672
673 # Verify locals stores (used by list comps)
674 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000675 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000676
677 class SpreadSheet:
678 "Sample application showing nested, calculated lookups."
679 _cells = {}
680 def __setitem__(self, key, formula):
681 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000682 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000683 return eval(self._cells[key], globals(), self)
684
685 ss = SpreadSheet()
686 ss['a1'] = '5'
687 ss['a2'] = 'a1*6'
688 ss['a3'] = 'a2*7'
689 self.assertEqual(ss['a3'], 210)
690
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000691 # Verify that dir() catches a non-list returned by eval
692 # SF bug #1004669
693 class C:
694 def __getitem__(self, item):
695 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000696 def keys(self):
697 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000698 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
699
Georg Brandl7cae87c2006-09-06 06:51:57 +0000700 def test_exec(self):
701 g = {}
702 exec('z = 1', g)
703 if '__builtins__' in g:
704 del g['__builtins__']
705 self.assertEqual(g, {'z': 1})
706
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000707 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000708 if '__builtins__' in g:
709 del g['__builtins__']
710 self.assertEqual(g, {'z': 2})
711 g = {}
712 l = {}
713
Brett Cannon77628992010-03-20 20:59:33 +0000714 with check_warnings():
715 warnings.filterwarnings("ignore", "global statement",
716 module="<string>")
717 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000718 if '__builtins__' in g:
719 del g['__builtins__']
720 if '__builtins__' in l:
721 del l['__builtins__']
722 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
723
Victor Stinnerb0b22422012-04-19 00:57:45 +0200724 def test_exec_globals(self):
725 code = compile("print('Hello World!')", "", "exec")
726 # no builtin function
727 self.assertRaisesRegex(NameError, "name 'print' is not defined",
728 exec, code, {'__builtins__': {}})
729 # __builtins__ must be a mapping type
730 self.assertRaises(TypeError,
731 exec, code, {'__builtins__': 123})
732
733 # no __build_class__ function
734 code = compile("class A: pass", "", "exec")
735 self.assertRaisesRegex(NameError, "__build_class__ not found",
736 exec, code, {'__builtins__': {}})
737
738 class frozendict_error(Exception):
739 pass
740
741 class frozendict(dict):
742 def __setitem__(self, key, value):
743 raise frozendict_error("frozendict is readonly")
744
745 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400746 if isinstance(__builtins__, types.ModuleType):
747 frozen_builtins = frozendict(__builtins__.__dict__)
748 else:
749 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200750 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
751 self.assertRaises(frozendict_error,
752 exec, code, {'__builtins__': frozen_builtins})
753
754 # read-only globals
755 namespace = frozendict({})
756 code = compile("x=1", "test", "exec")
757 self.assertRaises(frozendict_error,
758 exec, code, namespace)
759
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000760 def test_exec_redirected(self):
761 savestdout = sys.stdout
762 sys.stdout = None # Whatever that cannot flush()
763 try:
764 # Used to raise SystemError('error return without exception set')
765 exec('a')
766 except NameError:
767 pass
768 finally:
769 sys.stdout = savestdout
770
Walter Dörwald919497e2003-01-19 16:23:59 +0000771 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000772 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
773 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
774 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
775 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
776 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 def identity(item):
778 return 1
779 filter(identity, Squares(5))
780 self.assertRaises(TypeError, filter)
781 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000782 def __getitem__(self, index):
783 if index<4:
784 return 42
785 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000786 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000787 def badfunc():
788 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000790
Walter Dörwaldbf517072003-01-27 15:57:14 +0000791 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000792 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
793 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
794 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000795
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000796 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200797 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
798 f1 = filter(filter_char, "abcdeabcde")
799 f2 = filter(filter_char, "abcdeabcde")
800 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000801
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000803 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 self.assertRaises(TypeError, getattr, sys, 1)
805 self.assertRaises(TypeError, getattr, sys, 1, "foo")
806 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000807 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000808 # unicode surrogates are not encodable to the default encoding (utf8)
809 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000810
811 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000812 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 self.assertRaises(TypeError, hasattr, sys, 1)
814 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000815 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000816
Benjamin Peterson17689992010-08-24 03:26:23 +0000817 # Check that hasattr propagates all exceptions outside of
818 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000819 class A:
820 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000821 raise SystemExit
822 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000823 class B:
824 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000825 raise ValueError
826 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000827
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 def test_hash(self):
829 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000830 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000831 self.assertEqual(hash(1), hash(1.0))
832 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000833 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 hash((0,1,2,3))
835 def f(): pass
Adam Johnson892221b2019-11-19 19:45:20 +0000836 hash(f)
Walter Dörwald919497e2003-01-19 16:23:59 +0000837 self.assertRaises(TypeError, hash, [])
838 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000839 # Bug 1536021: Allow hash to return long objects
840 class X:
841 def __hash__(self):
842 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000843 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000844 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000845 def __hash__(self):
846 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000847 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000848
849 def test_hex(self):
850 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000851 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000852 self.assertRaises(TypeError, hex, {})
853
854 def test_id(self):
855 id(None)
856 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000857 id(1.0)
858 id('spam')
859 id((0,1,2,3))
860 id([0,1,2,3])
861 id({'spam': 1, 'eggs': 2, 'ham': 3})
862
Guido van Rossuma88a0332007-02-26 16:59:55 +0000863 # Test input() later, alphabetized as if it were raw_input
864
Walter Dörwald919497e2003-01-19 16:23:59 +0000865 def test_iter(self):
866 self.assertRaises(TypeError, iter)
867 self.assertRaises(TypeError, iter, 42, 42)
868 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 for l in lists:
870 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000871 self.assertEqual(next(i), '1')
872 self.assertEqual(next(i), '2')
873 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000874
875 def test_isinstance(self):
876 class C:
877 pass
878 class D(C):
879 pass
880 class E:
881 pass
882 c = C()
883 d = D()
884 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000885 self.assertTrue(isinstance(c, C))
886 self.assertTrue(isinstance(d, C))
887 self.assertTrue(not isinstance(e, C))
888 self.assertTrue(not isinstance(c, D))
889 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000890 self.assertRaises(TypeError, isinstance, E, 'foo')
891 self.assertRaises(TypeError, isinstance)
892
893 def test_issubclass(self):
894 class C:
895 pass
896 class D(C):
897 pass
898 class E:
899 pass
900 c = C()
901 d = D()
902 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000903 self.assertTrue(issubclass(D, C))
904 self.assertTrue(issubclass(C, C))
905 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 self.assertRaises(TypeError, issubclass, 'foo', E)
907 self.assertRaises(TypeError, issubclass, E, 'foo')
908 self.assertRaises(TypeError, issubclass)
909
910 def test_len(self):
911 self.assertEqual(len('123'), 3)
912 self.assertEqual(len(()), 0)
913 self.assertEqual(len((1, 2, 3, 4)), 4)
914 self.assertEqual(len([1, 2, 3, 4]), 4)
915 self.assertEqual(len({}), 0)
916 self.assertEqual(len({'a':1, 'b': 2}), 2)
917 class BadSeq:
918 def __len__(self):
919 raise ValueError
920 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000921 class InvalidLen:
922 def __len__(self):
923 return None
924 self.assertRaises(TypeError, len, InvalidLen())
925 class FloatLen:
926 def __len__(self):
927 return 4.5
928 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300929 class NegativeLen:
930 def __len__(self):
931 return -10
932 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000933 class HugeLen:
934 def __len__(self):
935 return sys.maxsize + 1
936 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300937 class HugeNegativeLen:
938 def __len__(self):
939 return -sys.maxsize-10
940 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000941 class NoLenMethod(object): pass
942 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000943
Walter Dörwald919497e2003-01-19 16:23:59 +0000944 def test_map(self):
945 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000946 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 [1, 4, 9]
948 )
949 try:
950 from math import sqrt
951 except ImportError:
952 def sqrt(x):
953 return pow(x, 0.5)
954 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000955 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000956 [[4.0, 2.0], [9.0, 3.0]]
957 )
958 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000959 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000960 [10, 4, 6]
961 )
962
963 def plus(*v):
964 accu = 0
965 for i in v: accu = accu + i
966 return accu
967 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000968 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000969 [1, 3, 7]
970 )
971 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000972 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000973 [1+4, 3+9, 7+2]
974 )
975 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000976 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000977 [1+4+1, 3+9+1, 7+2+0]
978 )
979 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000980 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000981 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
982 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000983 def Max(a, b):
984 if a is None:
985 return b
986 if b is None:
987 return a
988 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000990 list(map(Max, Squares(3), Squares(2))),
991 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 )
993 self.assertRaises(TypeError, map)
994 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000995 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000996 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000997 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000998 yield None
999 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001000 def badfunc(x):
1001 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001002 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001003
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001004 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +02001005 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1006 m1 = map(map_char, "Is this the real life?")
1007 m2 = map(map_char, "Is this the real life?")
1008 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001009
Walter Dörwald919497e2003-01-19 16:23:59 +00001010 def test_max(self):
1011 self.assertEqual(max('123123'), '3')
1012 self.assertEqual(max(1, 2, 3), 3)
1013 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1014 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1015
Guido van Rossume2a383d2007-01-15 16:59:06 +00001016 self.assertEqual(max(1, 2, 3.0), 3.0)
1017 self.assertEqual(max(1, 2.0, 3), 3)
1018 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001019
Dong-hee Naabdc6342020-01-11 01:31:43 +09001020 with self.assertRaisesRegex(
1021 TypeError,
1022 'max expected at least 1 argument, got 0'
1023 ):
1024 max()
1025
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001026 self.assertRaises(TypeError, max, 42)
1027 self.assertRaises(ValueError, max, ())
1028 class BadSeq:
1029 def __getitem__(self, index):
1030 raise ValueError
1031 self.assertRaises(ValueError, max, BadSeq())
1032
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001033 for stmt in (
1034 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001035 "max(default=None)",
1036 "max(1, 2, default=None)", # require container for default
1037 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001038 "max(1, key=int)", # single arg not iterable
1039 "max(1, 2, keystone=int)", # wrong keyword
1040 "max(1, 2, key=int, abc=int)", # two many keywords
1041 "max(1, 2, key=1)", # keyfunc is not callable
1042 ):
Tim Peters7f061872004-12-07 21:17:46 +00001043 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001044 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001045 except TypeError:
1046 pass
1047 else:
1048 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001049
1050 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1051 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1052 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1053
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001054 self.assertEqual(max((), default=None), None) # zero elem iterable
1055 self.assertEqual(max((1,), default=None), 1) # one elem iterable
1056 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
1057
1058 self.assertEqual(max((), default=1, key=neg), 1)
1059 self.assertEqual(max((1, 2), default=3, key=neg), 1)
1060
Alexander Marshalove22072f2018-07-24 10:58:21 +07001061 self.assertEqual(max((1, 2), key=None), 2)
1062
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001063 data = [random.randrange(200) for i in range(100)]
1064 keys = dict((elem, random.randrange(50)) for elem in data)
1065 f = keys.__getitem__
1066 self.assertEqual(max(data, key=f),
1067 sorted(reversed(data), key=f)[-1])
1068
Walter Dörwald919497e2003-01-19 16:23:59 +00001069 def test_min(self):
1070 self.assertEqual(min('123123'), '1')
1071 self.assertEqual(min(1, 2, 3), 1)
1072 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1073 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1074
Guido van Rossume2a383d2007-01-15 16:59:06 +00001075 self.assertEqual(min(1, 2, 3.0), 1)
1076 self.assertEqual(min(1, 2.0, 3), 1)
1077 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001078
Dong-hee Naabdc6342020-01-11 01:31:43 +09001079 with self.assertRaisesRegex(
1080 TypeError,
1081 'min expected at least 1 argument, got 0'
1082 ):
1083 min()
1084
Walter Dörwald919497e2003-01-19 16:23:59 +00001085 self.assertRaises(TypeError, min, 42)
1086 self.assertRaises(ValueError, min, ())
1087 class BadSeq:
1088 def __getitem__(self, index):
1089 raise ValueError
1090 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +00001091
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001092 for stmt in (
1093 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001094 "min(default=None)",
1095 "min(1, 2, default=None)", # require container for default
1096 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001097 "min(1, key=int)", # single arg not iterable
1098 "min(1, 2, keystone=int)", # wrong keyword
1099 "min(1, 2, key=int, abc=int)", # two many keywords
1100 "min(1, 2, key=1)", # keyfunc is not callable
1101 ):
Tim Peters7f061872004-12-07 21:17:46 +00001102 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001103 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001104 except TypeError:
1105 pass
1106 else:
1107 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001108
1109 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1110 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1111 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1112
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001113 self.assertEqual(min((), default=None), None) # zero elem iterable
1114 self.assertEqual(min((1,), default=None), 1) # one elem iterable
1115 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
1116
1117 self.assertEqual(min((), default=1, key=neg), 1)
1118 self.assertEqual(min((1, 2), default=1, key=neg), 2)
1119
Alexander Marshalove22072f2018-07-24 10:58:21 +07001120 self.assertEqual(min((1, 2), key=None), 1)
1121
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001122 data = [random.randrange(200) for i in range(100)]
1123 keys = dict((elem, random.randrange(50)) for elem in data)
1124 f = keys.__getitem__
1125 self.assertEqual(min(data, key=f),
1126 sorted(data, key=f)[0])
1127
Georg Brandla18af4e2007-04-21 15:47:16 +00001128 def test_next(self):
1129 it = iter(range(2))
1130 self.assertEqual(next(it), 0)
1131 self.assertEqual(next(it), 1)
1132 self.assertRaises(StopIteration, next, it)
1133 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001134 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001135
1136 class Iter(object):
1137 def __iter__(self):
1138 return self
1139 def __next__(self):
1140 raise StopIteration
1141
1142 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +00001143 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001144 self.assertRaises(StopIteration, next, it)
1145
1146 def gen():
1147 yield 1
1148 return
1149
1150 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +00001151 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +00001152 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001153 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +00001154
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001156 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001157 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001158 self.assertRaises(TypeError, oct, ())
1159
1160 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001161 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001162 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001163 self.addCleanup(unlink, TESTFN)
1164 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 fp.write('The quick brown fox jumps over the lazy dog')
1167 fp.write('.\n')
1168 fp.write('Dear John\n')
1169 fp.write('XXX'*100)
1170 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001171
1172 def test_open(self):
1173 self.write_testfile()
1174 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001175 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001177 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1178 self.assertEqual(fp.readline(4), 'Dear')
1179 self.assertEqual(fp.readline(100), ' John\n')
1180 self.assertEqual(fp.read(300), 'XXX'*100)
1181 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001182
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001183 # embedded null bytes and characters
1184 self.assertRaises(ValueError, open, 'a\x00b')
1185 self.assertRaises(ValueError, open, b'a\x00b')
1186
Victor Stinner91106cd2017-12-13 12:29:09 +01001187 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001188 def test_open_default_encoding(self):
1189 old_environ = dict(os.environ)
1190 try:
1191 # try to get a user preferred encoding different than the current
1192 # locale encoding to check that open() uses the current locale
1193 # encoding and not the user preferred encoding
1194 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1195 if key in os.environ:
1196 del os.environ[key]
1197
1198 self.write_testfile()
1199 current_locale_encoding = locale.getpreferredencoding(False)
1200 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001201 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001202 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001203 finally:
1204 os.environ.clear()
1205 os.environ.update(old_environ)
1206
Victor Stinnerdaf45552013-08-28 00:53:59 +02001207 def test_open_non_inheritable(self):
1208 fileobj = open(__file__)
1209 with fileobj:
1210 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1211
Walter Dörwald919497e2003-01-19 16:23:59 +00001212 def test_ord(self):
1213 self.assertEqual(ord(' '), 32)
1214 self.assertEqual(ord('A'), 65)
1215 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001216 self.assertEqual(ord('\x80'), 128)
1217 self.assertEqual(ord('\xff'), 255)
1218
1219 self.assertEqual(ord(b' '), 32)
1220 self.assertEqual(ord(b'A'), 65)
1221 self.assertEqual(ord(b'a'), 97)
1222 self.assertEqual(ord(b'\x80'), 128)
1223 self.assertEqual(ord(b'\xff'), 255)
1224
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001225 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001226 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001227
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001228 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1229 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1230 self.assertEqual(ord("\U00010000"), 0x00010000)
1231 self.assertEqual(ord("\U00010001"), 0x00010001)
1232 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1233 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1234 self.assertEqual(ord("\U00100000"), 0x00100000)
1235 self.assertEqual(ord("\U00100001"), 0x00100001)
1236 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1237 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1238
Walter Dörwald919497e2003-01-19 16:23:59 +00001239 def test_pow(self):
1240 self.assertEqual(pow(0,0), 1)
1241 self.assertEqual(pow(0,1), 0)
1242 self.assertEqual(pow(1,0), 1)
1243 self.assertEqual(pow(1,1), 1)
1244
1245 self.assertEqual(pow(2,0), 1)
1246 self.assertEqual(pow(2,10), 1024)
1247 self.assertEqual(pow(2,20), 1024*1024)
1248 self.assertEqual(pow(2,30), 1024*1024*1024)
1249
1250 self.assertEqual(pow(-2,0), 1)
1251 self.assertEqual(pow(-2,1), -2)
1252 self.assertEqual(pow(-2,2), 4)
1253 self.assertEqual(pow(-2,3), -8)
1254
Walter Dörwald919497e2003-01-19 16:23:59 +00001255 self.assertAlmostEqual(pow(0.,0), 1.)
1256 self.assertAlmostEqual(pow(0.,1), 0.)
1257 self.assertAlmostEqual(pow(1.,0), 1.)
1258 self.assertAlmostEqual(pow(1.,1), 1.)
1259
1260 self.assertAlmostEqual(pow(2.,0), 1.)
1261 self.assertAlmostEqual(pow(2.,10), 1024.)
1262 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1263 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1264
1265 self.assertAlmostEqual(pow(-2.,0), 1.)
1266 self.assertAlmostEqual(pow(-2.,1), -2.)
1267 self.assertAlmostEqual(pow(-2.,2), 4.)
1268 self.assertAlmostEqual(pow(-2.,3), -8.)
1269
Mark Dickinson5c2db372009-12-05 20:28:34 +00001270 for x in 2, 2.0:
1271 for y in 10, 10.0:
1272 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001273 if isinstance(x, float) or \
1274 isinstance(y, float) or \
1275 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001276 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001277 else:
1278 self.assertAlmostEqual(pow(x, y, z), 24.0)
1279
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001280 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1281 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1282
Mark Dickinsonc5299672019-06-02 10:24:06 +01001283 # See test_pow for additional tests for three-argument pow.
1284 self.assertEqual(pow(-1, -2, 3), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001285 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001286
1287 self.assertRaises(TypeError, pow)
1288
Ammar Askar87d6cd32019-09-21 00:28:49 -04001289 # Test passing in arguments as keywords.
1290 self.assertEqual(pow(0, exp=0), 1)
1291 self.assertEqual(pow(base=2, exp=4), 16)
1292 self.assertEqual(pow(base=5, exp=2, mod=14), 11)
1293 twopow = partial(pow, base=2)
1294 self.assertEqual(twopow(exp=5), 32)
1295 fifth_power = partial(pow, exp=5)
1296 self.assertEqual(fifth_power(2), 32)
1297 mod10 = partial(pow, mod=10)
1298 self.assertEqual(mod10(2, 6), 4)
1299 self.assertEqual(mod10(exp=6, base=2), 4)
1300
Guido van Rossuma88a0332007-02-26 16:59:55 +00001301 def test_input(self):
1302 self.write_testfile()
1303 fp = open(TESTFN, 'r')
1304 savestdin = sys.stdin
1305 savestdout = sys.stdout # Eats the echo
1306 try:
1307 sys.stdin = fp
1308 sys.stdout = BitBucket()
1309 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001310 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1311 self.assertEqual(input('testing\n'), 'Dear John')
1312
1313 # SF 1535165: don't segfault on closed stdin
1314 # sys.stdout must be a regular file for triggering
1315 sys.stdout = savestdout
1316 sys.stdin.close()
1317 self.assertRaises(ValueError, input)
1318
1319 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001320 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001321 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001322 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001323 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001324 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001325 self.assertRaises(EOFError, input)
1326
1327 del sys.stdout
1328 self.assertRaises(RuntimeError, input, 'prompt')
1329 del sys.stdin
1330 self.assertRaises(RuntimeError, input, 'prompt')
1331 finally:
1332 sys.stdin = savestdin
1333 sys.stdout = savestdout
1334 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001335
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001336 # test_int(): see test_int.py for tests of built-in function int().
1337
Walter Dörwald919497e2003-01-19 16:23:59 +00001338 def test_repr(self):
1339 self.assertEqual(repr(''), '\'\'')
1340 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001341 self.assertEqual(repr(()), '()')
1342 self.assertEqual(repr([]), '[]')
1343 self.assertEqual(repr({}), '{}')
1344 a = []
1345 a.append(a)
1346 self.assertEqual(repr(a), '[[...]]')
1347 a = {}
1348 a[0] = a
1349 self.assertEqual(repr(a), '{0: {...}}')
1350
1351 def test_round(self):
1352 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001353 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001354 self.assertEqual(round(1.0), 1.0)
1355 self.assertEqual(round(10.0), 10.0)
1356 self.assertEqual(round(1000000000.0), 1000000000.0)
1357 self.assertEqual(round(1e20), 1e20)
1358
1359 self.assertEqual(round(-1.0), -1.0)
1360 self.assertEqual(round(-10.0), -10.0)
1361 self.assertEqual(round(-1000000000.0), -1000000000.0)
1362 self.assertEqual(round(-1e20), -1e20)
1363
1364 self.assertEqual(round(0.1), 0.0)
1365 self.assertEqual(round(1.1), 1.0)
1366 self.assertEqual(round(10.1), 10.0)
1367 self.assertEqual(round(1000000000.1), 1000000000.0)
1368
1369 self.assertEqual(round(-1.1), -1.0)
1370 self.assertEqual(round(-10.1), -10.0)
1371 self.assertEqual(round(-1000000000.1), -1000000000.0)
1372
1373 self.assertEqual(round(0.9), 1.0)
1374 self.assertEqual(round(9.9), 10.0)
1375 self.assertEqual(round(999999999.9), 1000000000.0)
1376
1377 self.assertEqual(round(-0.9), -1.0)
1378 self.assertEqual(round(-9.9), -10.0)
1379 self.assertEqual(round(-999999999.9), -1000000000.0)
1380
1381 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001382 self.assertEqual(type(round(-8.0, -1)), float)
1383
1384 self.assertEqual(type(round(-8.0, 0)), float)
1385 self.assertEqual(type(round(-8.0, 1)), float)
1386
1387 # Check even / odd rounding behaviour
1388 self.assertEqual(round(5.5), 6)
1389 self.assertEqual(round(6.5), 6)
1390 self.assertEqual(round(-5.5), -6)
1391 self.assertEqual(round(-6.5), -6)
1392
1393 # Check behavior on ints
1394 self.assertEqual(round(0), 0)
1395 self.assertEqual(round(8), 8)
1396 self.assertEqual(round(-8), -8)
1397 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001398 self.assertEqual(type(round(-8, -1)), int)
1399 self.assertEqual(type(round(-8, 0)), int)
1400 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001401
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001402 # test new kwargs
1403 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1404
Walter Dörwald919497e2003-01-19 16:23:59 +00001405 self.assertRaises(TypeError, round)
1406
Alex Martelliae211f92007-08-22 23:21:33 +00001407 # test generic rounding delegation for reals
1408 class TestRound:
1409 def __round__(self):
1410 return 23
1411
1412 class TestNoRound:
1413 pass
1414
1415 self.assertEqual(round(TestRound()), 23)
1416
1417 self.assertRaises(TypeError, round, 1, 2, 3)
1418 self.assertRaises(TypeError, round, TestNoRound())
1419
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001420 t = TestNoRound()
1421 t.__round__ = lambda *args: args
1422 self.assertRaises(TypeError, round, t)
1423 self.assertRaises(TypeError, round, t, 0)
1424
Mark Dickinsonad731b92009-11-09 17:12:30 +00001425 # Some versions of glibc for alpha have a bug that affects
1426 # float -> integer rounding (floor, ceil, rint, round) for
1427 # values in the range [2**52, 2**53). See:
1428 #
1429 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1430 #
1431 # We skip this test on Linux/alpha if it would fail.
1432 linux_alpha = (platform.system().startswith('Linux') and
1433 platform.machine().startswith('alpha'))
1434 system_round_bug = round(5e15+1) != 5e15+1
1435 @unittest.skipIf(linux_alpha and system_round_bug,
1436 "test will fail; failure is probably due to a "
1437 "buggy system round function")
1438 def test_round_large(self):
1439 # Issue #1869: integral floats should remain unchanged
1440 self.assertEqual(round(5e15-1), 5e15-1)
1441 self.assertEqual(round(5e15), 5e15)
1442 self.assertEqual(round(5e15+1), 5e15+1)
1443 self.assertEqual(round(5e15+2), 5e15+2)
1444 self.assertEqual(round(5e15+3), 5e15+3)
1445
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001446 def test_bug_27936(self):
1447 # Verify that ndigits=None means the same as passing in no argument
1448 for x in [1234,
1449 1234.56,
1450 decimal.Decimal('1234.56'),
1451 fractions.Fraction(123456, 100)]:
1452 self.assertEqual(round(x, None), round(x))
1453 self.assertEqual(type(round(x, None)), type(round(x)))
1454
Walter Dörwald919497e2003-01-19 16:23:59 +00001455 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001456 setattr(sys, 'spam', 1)
1457 self.assertEqual(sys.spam, 1)
1458 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1459 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001460
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001461 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001462
Alex Martellia70b1912003-04-22 08:12:33 +00001463 def test_sum(self):
1464 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001465 self.assertEqual(sum(list(range(2,8))), 27)
1466 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001467 self.assertEqual(sum(Squares(10)), 285)
1468 self.assertEqual(sum(iter(Squares(10))), 285)
1469 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1470
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001471 self.assertEqual(sum(range(10), 1000), 1045)
1472 self.assertEqual(sum(range(10), start=1000), 1045)
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001473 self.assertEqual(sum(range(10), 2**31-5), 2**31+40)
1474 self.assertEqual(sum(range(10), 2**63-5), 2**63+40)
1475
1476 self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5)
1477 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3),
1478 2**31+2)
1479 self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3),
1480 2**63+2)
1481 self.assertIs(sum([], False), False)
1482
1483 self.assertEqual(sum(i / 2 for i in range(10)), 22.5)
1484 self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5)
1485 self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75)
1486 self.assertEqual(sum([0.5, 1]), 1.5)
1487 self.assertEqual(sum([1, 0.5]), 1.5)
1488 self.assertEqual(repr(sum([-0.0])), '0.0')
1489 self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0')
1490 self.assertEqual(repr(sum([], -0.0)), '-0.0')
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001491
Alex Martellia70b1912003-04-22 08:12:33 +00001492 self.assertRaises(TypeError, sum)
1493 self.assertRaises(TypeError, sum, 42)
1494 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1495 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001496 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1497 values = [bytearray(b'a'), bytearray(b'b')]
1498 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001499 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1500 self.assertRaises(TypeError, sum, [{2:3}])
1501 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03001502 self.assertRaises(TypeError, sum, [], '')
1503 self.assertRaises(TypeError, sum, [], b'')
1504 self.assertRaises(TypeError, sum, [], bytearray())
Alex Martellia70b1912003-04-22 08:12:33 +00001505
1506 class BadSeq:
1507 def __getitem__(self, index):
1508 raise ValueError
1509 self.assertRaises(ValueError, sum, BadSeq())
1510
Mark Dickinson3a22b472009-10-17 21:48:16 +00001511 empty = []
1512 sum(([x] for x in range(10)), empty)
1513 self.assertEqual(empty, [])
1514
Walter Dörwald919497e2003-01-19 16:23:59 +00001515 def test_type(self):
1516 self.assertEqual(type(''), type('123'))
1517 self.assertNotEqual(type(''), type(()))
1518
Guido van Rossumfee7b932005-01-16 00:21:28 +00001519 # We don't want self in vars(), so these are static methods
1520
1521 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001522 def get_vars_f0():
1523 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001524
Guido van Rossumfee7b932005-01-16 00:21:28 +00001525 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001526 def get_vars_f2():
1527 BuiltinTest.get_vars_f0()
1528 a = 1
1529 b = 2
1530 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001531
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001532 class C_get_vars(object):
1533 def getDict(self):
1534 return {'a':2}
1535 __dict__ = property(fget=getDict)
1536
Walter Dörwald919497e2003-01-19 16:23:59 +00001537 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001538 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001539 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001540 self.assertEqual(self.get_vars_f0(), {})
1541 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1542 self.assertRaises(TypeError, vars, 42, 42)
1543 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001544 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001545
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001546 def iter_error(self, iterable, error):
1547 """Collect `iterable` into a list, catching an expected `error`."""
1548 items = []
1549 with self.assertRaises(error):
1550 for item in iterable:
1551 items.append(item)
1552 return items
1553
Walter Dörwald919497e2003-01-19 16:23:59 +00001554 def test_zip(self):
1555 a = (1, 2, 3)
1556 b = (4, 5, 6)
1557 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001558 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001559 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001560 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001561 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001562 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001563 class I:
1564 def __getitem__(self, i):
1565 if i < 0 or i > 2: raise IndexError
1566 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001567 self.assertEqual(list(zip(a, I())), t)
1568 self.assertEqual(list(zip()), [])
1569 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001570 self.assertRaises(TypeError, zip, None)
1571 class G:
1572 pass
1573 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001574 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001575
1576 # Make sure zip doesn't try to allocate a billion elements for the
1577 # result list when one of its arguments doesn't say how long it is.
1578 # A MemoryError is the most likely failure mode.
1579 class SequenceWithoutALength:
1580 def __getitem__(self, i):
1581 if i == 5:
1582 raise IndexError
1583 else:
1584 return i
1585 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001586 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001587 list(enumerate(range(5)))
1588 )
1589
1590 class BadSeq:
1591 def __getitem__(self, i):
1592 if i == 5:
1593 raise ValueError
1594 else:
1595 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001596 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001597
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001598 def test_zip_pickle(self):
1599 a = (1, 2, 3)
1600 b = (4, 5, 6)
1601 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001602 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1603 z1 = zip(a, b)
1604 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001605
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001606 def test_zip_pickle_strict(self):
1607 a = (1, 2, 3)
1608 b = (4, 5, 6)
1609 t = [(1, 4), (2, 5), (3, 6)]
1610 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1611 z1 = zip(a, b, strict=True)
1612 self.check_iter_pickle(z1, t, proto)
1613
1614 def test_zip_pickle_strict_fail(self):
1615 a = (1, 2, 3)
1616 b = (4, 5, 6, 7)
1617 t = [(1, 4), (2, 5), (3, 6)]
1618 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1619 z1 = zip(a, b, strict=True)
1620 z2 = pickle.loads(pickle.dumps(z1, proto))
1621 self.assertEqual(self.iter_error(z1, ValueError), t)
1622 self.assertEqual(self.iter_error(z2, ValueError), t)
1623
Sergey Fedoseev6a650aa2019-08-30 09:25:48 +05001624 def test_zip_bad_iterable(self):
1625 exception = TypeError()
1626
1627 class BadIterable:
1628 def __iter__(self):
1629 raise exception
1630
1631 with self.assertRaises(TypeError) as cm:
1632 zip(BadIterable())
1633
1634 self.assertIs(cm.exception, exception)
1635
Guido van Rossum310f6aa2020-06-19 03:16:57 -07001636 def test_zip_strict(self):
1637 self.assertEqual(tuple(zip((1, 2, 3), 'abc', strict=True)),
1638 ((1, 'a'), (2, 'b'), (3, 'c')))
1639 self.assertRaises(ValueError, tuple,
1640 zip((1, 2, 3, 4), 'abc', strict=True))
1641 self.assertRaises(ValueError, tuple,
1642 zip((1, 2), 'abc', strict=True))
1643 self.assertRaises(ValueError, tuple,
1644 zip((1, 2), (1, 2), 'abc', strict=True))
1645
1646 def test_zip_strict_iterators(self):
1647 x = iter(range(5))
1648 y = [0]
1649 z = iter(range(5))
1650 self.assertRaises(ValueError, list,
1651 (zip(x, y, z, strict=True)))
1652 self.assertEqual(next(x), 2)
1653 self.assertEqual(next(z), 1)
1654
1655 def test_zip_strict_error_handling(self):
1656
1657 class Error(Exception):
1658 pass
1659
1660 class Iter:
1661 def __init__(self, size):
1662 self.size = size
1663 def __iter__(self):
1664 return self
1665 def __next__(self):
1666 self.size -= 1
1667 if self.size < 0:
1668 raise Error
1669 return self.size
1670
1671 l1 = self.iter_error(zip("AB", Iter(1), strict=True), Error)
1672 self.assertEqual(l1, [("A", 0)])
1673 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1674 self.assertEqual(l2, [("A", 1, "A")])
1675 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), Error)
1676 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1677 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1678 self.assertEqual(l4, [("A", 2), ("B", 1)])
1679 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), Error)
1680 self.assertEqual(l5, [(0, "A")])
1681 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1682 self.assertEqual(l6, [(1, "A")])
1683 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), Error)
1684 self.assertEqual(l7, [(1, "A"), (0, "B")])
1685 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1686 self.assertEqual(l8, [(2, "A"), (1, "B")])
1687
1688 def test_zip_strict_error_handling_stopiteration(self):
1689
1690 class Iter:
1691 def __init__(self, size):
1692 self.size = size
1693 def __iter__(self):
1694 return self
1695 def __next__(self):
1696 self.size -= 1
1697 if self.size < 0:
1698 raise StopIteration
1699 return self.size
1700
1701 l1 = self.iter_error(zip("AB", Iter(1), strict=True), ValueError)
1702 self.assertEqual(l1, [("A", 0)])
1703 l2 = self.iter_error(zip("AB", Iter(2), "A", strict=True), ValueError)
1704 self.assertEqual(l2, [("A", 1, "A")])
1705 l3 = self.iter_error(zip("AB", Iter(2), "ABC", strict=True), ValueError)
1706 self.assertEqual(l3, [("A", 1, "A"), ("B", 0, "B")])
1707 l4 = self.iter_error(zip("AB", Iter(3), strict=True), ValueError)
1708 self.assertEqual(l4, [("A", 2), ("B", 1)])
1709 l5 = self.iter_error(zip(Iter(1), "AB", strict=True), ValueError)
1710 self.assertEqual(l5, [(0, "A")])
1711 l6 = self.iter_error(zip(Iter(2), "A", strict=True), ValueError)
1712 self.assertEqual(l6, [(1, "A")])
1713 l7 = self.iter_error(zip(Iter(2), "ABC", strict=True), ValueError)
1714 self.assertEqual(l7, [(1, "A"), (0, "B")])
1715 l8 = self.iter_error(zip(Iter(3), "AB", strict=True), ValueError)
1716 self.assertEqual(l8, [(2, "A"), (1, "B")])
1717
Brandt Bucher226a0122020-12-04 19:45:57 -08001718 @support.cpython_only
1719 def test_zip_result_gc(self):
1720 # bpo-42536: zip's tuple-reuse speed trick breaks the GC's assumptions
1721 # about what can be untracked. Make sure we re-track result tuples
1722 # whenever we reuse them.
1723 it = zip([[]])
1724 gc.collect()
1725 # That GC collection probably untracked the recycled internal result
1726 # tuple, which is initialized to (None,). Make sure it's re-tracked when
1727 # it's mutated and returned from __next__:
1728 self.assertTrue(gc.is_tracked(next(it)))
1729
Eric Smithe4d63172010-09-13 20:48:43 +00001730 def test_format(self):
1731 # Test the basic machinery of the format() builtin. Don't test
1732 # the specifics of the various formatters
1733 self.assertEqual(format(3, ''), '3')
1734
1735 # Returns some classes to use for various tests. There's
1736 # an old-style version, and a new-style version
1737 def classes_new():
1738 class A(object):
1739 def __init__(self, x):
1740 self.x = x
1741 def __format__(self, format_spec):
1742 return str(self.x) + format_spec
1743 class DerivedFromA(A):
1744 pass
1745
1746 class Simple(object): pass
1747 class DerivedFromSimple(Simple):
1748 def __init__(self, x):
1749 self.x = x
1750 def __format__(self, format_spec):
1751 return str(self.x) + format_spec
1752 class DerivedFromSimple2(DerivedFromSimple): pass
1753 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1754
1755 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1756 self.assertEqual(format(A(3), 'spec'), '3spec')
1757 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1758 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1759 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1760 '10abcdef')
1761
1762 class_test(*classes_new())
1763
1764 def empty_format_spec(value):
1765 # test that:
1766 # format(x, '') == str(x)
1767 # format(x) == str(x)
1768 self.assertEqual(format(value, ""), str(value))
1769 self.assertEqual(format(value), str(value))
1770
1771 # for builtin types, format(x, "") == str(x)
1772 empty_format_spec(17**13)
1773 empty_format_spec(1.0)
1774 empty_format_spec(3.1415e104)
1775 empty_format_spec(-3.1415e104)
1776 empty_format_spec(3.1415e-104)
1777 empty_format_spec(-3.1415e-104)
1778 empty_format_spec(object)
1779 empty_format_spec(None)
1780
1781 # TypeError because self.__format__ returns the wrong type
1782 class BadFormatResult:
1783 def __format__(self, format_spec):
1784 return 1.0
1785 self.assertRaises(TypeError, format, BadFormatResult(), "")
1786
1787 # TypeError because format_spec is not unicode or str
1788 self.assertRaises(TypeError, format, object(), 4)
1789 self.assertRaises(TypeError, format, object(), object())
1790
1791 # tests for object.__format__ really belong elsewhere, but
1792 # there's no good place to put them
1793 x = object().__format__('')
1794 self.assertTrue(x.startswith('<object object at'))
1795
1796 # first argument to object.__format__ must be string
1797 self.assertRaises(TypeError, object().__format__, 3)
1798 self.assertRaises(TypeError, object().__format__, object())
1799 self.assertRaises(TypeError, object().__format__, None)
1800
1801 # --------------------------------------------------------------------
1802 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001803 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001804 class A:
1805 def __format__(self, fmt_str):
1806 return format('', fmt_str)
1807
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001808 self.assertEqual(format(A()), '')
1809 self.assertEqual(format(A(), ''), '')
1810 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001811
1812 class B:
1813 pass
1814
1815 class C(object):
1816 pass
1817
1818 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001819 obj = cls()
1820 self.assertEqual(format(obj), str(obj))
1821 self.assertEqual(format(obj, ''), str(obj))
1822 with self.assertRaisesRegex(TypeError,
1823 r'\b%s\b' % re.escape(cls.__name__)):
1824 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001825 # --------------------------------------------------------------------
1826
1827 # make sure we can take a subclass of str as a format spec
1828 class DerivedFromStr(str): pass
1829 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1830
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001831 def test_bin(self):
1832 self.assertEqual(bin(0), '0b0')
1833 self.assertEqual(bin(1), '0b1')
1834 self.assertEqual(bin(-1), '-0b1')
1835 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1836 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1837 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1838 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1839
Georg Brandl953152f2009-07-22 12:03:59 +00001840 def test_bytearray_translate(self):
1841 x = bytearray(b"abc")
1842 self.assertRaises(ValueError, x.translate, b"1", 1)
1843 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1844
Brandt Bucher2a7d5962019-06-26 12:06:18 -07001845 def test_bytearray_extend_error(self):
1846 array = bytearray()
1847 bad_iter = map(int, "X")
1848 self.assertRaises(ValueError, array.extend, bad_iter)
1849
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001850 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001851 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001852 tp = type(const)
1853 self.assertIs(tp(), const)
1854 self.assertRaises(TypeError, tp, 1, 2)
1855 self.assertRaises(TypeError, tp, a=1, b=2)
1856
MojoVampire469325c2020-03-03 18:50:17 +00001857 def test_warning_notimplemented(self):
1858 # Issue #35712: NotImplemented is a sentinel value that should never
1859 # be evaluated in a boolean context (virtually all such use cases
1860 # are a result of accidental misuse implementing rich comparison
1861 # operations in terms of one another).
1862 # For the time being, it will continue to evaluate as truthy, but
1863 # issue a deprecation warning (with the eventual intent to make it
1864 # a TypeError).
1865 self.assertWarns(DeprecationWarning, bool, NotImplemented)
1866 with self.assertWarns(DeprecationWarning):
1867 self.assertTrue(NotImplemented)
1868 with self.assertWarns(DeprecationWarning):
1869 self.assertFalse(not NotImplemented)
1870
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001871
1872class TestBreakpoint(unittest.TestCase):
1873 def setUp(self):
1874 # These tests require a clean slate environment. For example, if the
1875 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1876 # will mess up these tests. Similarly for sys.breakpointhook.
1877 # Cleaning the slate here means you can't use breakpoint() to debug
1878 # these tests, but I think that's okay. Just use pdb.set_trace() if
1879 # you must.
1880 self.resources = ExitStack()
1881 self.addCleanup(self.resources.close)
1882 self.env = self.resources.enter_context(EnvironmentVarGuard())
1883 del self.env['PYTHONBREAKPOINT']
1884 self.resources.enter_context(
1885 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1886
1887 def test_breakpoint(self):
1888 with patch('pdb.set_trace') as mock:
1889 breakpoint()
1890 mock.assert_called_once()
1891
1892 def test_breakpoint_with_breakpointhook_set(self):
1893 my_breakpointhook = MagicMock()
1894 sys.breakpointhook = my_breakpointhook
1895 breakpoint()
1896 my_breakpointhook.assert_called_once_with()
1897
1898 def test_breakpoint_with_breakpointhook_reset(self):
1899 my_breakpointhook = MagicMock()
1900 sys.breakpointhook = my_breakpointhook
1901 breakpoint()
1902 my_breakpointhook.assert_called_once_with()
1903 # Reset the hook and it will not be called again.
1904 sys.breakpointhook = sys.__breakpointhook__
1905 with patch('pdb.set_trace') as mock:
1906 breakpoint()
1907 mock.assert_called_once_with()
1908 my_breakpointhook.assert_called_once_with()
1909
1910 def test_breakpoint_with_args_and_keywords(self):
1911 my_breakpointhook = MagicMock()
1912 sys.breakpointhook = my_breakpointhook
1913 breakpoint(1, 2, 3, four=4, five=5)
1914 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1915
1916 def test_breakpoint_with_passthru_error(self):
1917 def my_breakpointhook():
1918 pass
1919 sys.breakpointhook = my_breakpointhook
1920 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1921
1922 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1923 def test_envar_good_path_builtin(self):
1924 self.env['PYTHONBREAKPOINT'] = 'int'
1925 with patch('builtins.int') as mock:
1926 breakpoint('7')
1927 mock.assert_called_once_with('7')
1928
1929 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1930 def test_envar_good_path_other(self):
1931 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1932 with patch('sys.exit') as mock:
1933 breakpoint()
1934 mock.assert_called_once_with()
1935
1936 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1937 def test_envar_good_path_noop_0(self):
1938 self.env['PYTHONBREAKPOINT'] = '0'
1939 with patch('pdb.set_trace') as mock:
1940 breakpoint()
1941 mock.assert_not_called()
1942
1943 def test_envar_good_path_empty_string(self):
1944 # PYTHONBREAKPOINT='' is the same as it not being set.
1945 self.env['PYTHONBREAKPOINT'] = ''
1946 with patch('pdb.set_trace') as mock:
1947 breakpoint()
1948 mock.assert_called_once_with()
1949
1950 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1951 def test_envar_unimportable(self):
1952 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001953 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001954 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001955 'nosuchbuiltin',
1956 'nosuchmodule.nosuchcallable',
1957 ):
1958 with self.subTest(envar=envar):
1959 self.env['PYTHONBREAKPOINT'] = envar
1960 mock = self.resources.enter_context(patch('pdb.set_trace'))
1961 w = self.resources.enter_context(check_warnings(quiet=True))
1962 breakpoint()
1963 self.assertEqual(
1964 str(w.message),
1965 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1966 self.assertEqual(w.category, RuntimeWarning)
1967 mock.assert_not_called()
1968
1969 def test_envar_ignored_when_hook_is_set(self):
1970 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1971 with patch('sys.exit') as mock:
1972 sys.breakpointhook = int
1973 breakpoint()
1974 mock.assert_not_called()
1975
1976
Martin Panterc9a6ab52015-10-10 01:25:38 +00001977@unittest.skipUnless(pty, "the pty and signal modules must be available")
1978class PtyTests(unittest.TestCase):
1979 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1980 terminals in the test environment"""
1981
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001982 @staticmethod
1983 def handle_sighup(signum, frame):
1984 # bpo-40140: if the process is the session leader, os.close(fd)
1985 # of "pid, fd = pty.fork()" can raise SIGHUP signal:
1986 # just ignore the signal.
1987 pass
1988
Martin Pantere44dba32015-10-10 05:27:15 +00001989 def run_child(self, child, terminal_input):
Victor Stinner7a51a7e2020-04-03 00:40:25 +02001990 old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup)
1991 try:
1992 return self._run_child(child, terminal_input)
1993 finally:
1994 signal.signal(signal.SIGHUP, old_sighup)
1995
1996 def _run_child(self, child, terminal_input):
Martin Pantere44dba32015-10-10 05:27:15 +00001997 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001998 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001999 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00002000 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00002001 os.close(r)
2002 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002003 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00002004 raise
Victor Stinner16d75672020-04-01 00:27:18 +02002005
Martin Panterc9a6ab52015-10-10 01:25:38 +00002006 if pid == 0:
2007 # Child
2008 try:
2009 # Make sure we don't get stuck if there's a problem
2010 signal.alarm(2)
2011 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002012 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00002013 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002014 except:
2015 traceback.print_exc()
2016 finally:
2017 # We don't want to return to unittest...
2018 os._exit(0)
Victor Stinner16d75672020-04-01 00:27:18 +02002019
Martin Panterc9a6ab52015-10-10 01:25:38 +00002020 # Parent
2021 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00002022 os.write(fd, terminal_input)
Victor Stinner16d75672020-04-01 00:27:18 +02002023
Martin Panterc9a6ab52015-10-10 01:25:38 +00002024 # Get results from the pipe
2025 with open(r, "r") as rpipe:
2026 lines = []
2027 while True:
2028 line = rpipe.readline().strip()
2029 if line == "":
2030 # The other end was closed => the child exited
2031 break
2032 lines.append(line)
Victor Stinner16d75672020-04-01 00:27:18 +02002033
Martin Panterc9a6ab52015-10-10 01:25:38 +00002034 # Check the result was got and corresponds to the user's terminal input
2035 if len(lines) != 2:
2036 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00002037 # Beware of Linux raising EIO when the slave is closed
2038 child_output = bytearray()
2039 while True:
2040 try:
2041 chunk = os.read(fd, 3000)
2042 except OSError: # Assume EIO
2043 break
2044 if not chunk:
2045 break
2046 child_output.extend(chunk)
2047 os.close(fd)
2048 child_output = child_output.decode("ascii", "ignore")
2049 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
2050 % (len(lines), child_output))
Victor Stinner4baca1b2017-08-09 17:44:19 +02002051
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002052 # bpo-40155: Close the PTY before waiting for the child process
2053 # completion, otherwise the child process hangs on AIX.
Victor Stinner16d75672020-04-01 00:27:18 +02002054 os.close(fd)
2055
Victor Stinner7a51a7e2020-04-03 00:40:25 +02002056 support.wait_process(pid, exitcode=0)
2057
Martin Pantere44dba32015-10-10 05:27:15 +00002058 return lines
2059
2060 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
2061 if not sys.stdin.isatty() or not sys.stdout.isatty():
2062 self.skipTest("stdin and stdout must be ttys")
2063 def child(wpipe):
2064 # Check the error handlers are accounted for
2065 if stdio_encoding:
2066 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
2067 encoding=stdio_encoding,
2068 errors='surrogateescape')
2069 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
2070 encoding=stdio_encoding,
2071 errors='replace')
2072 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
2073 print(ascii(input(prompt)), file=wpipe)
2074 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00002075 # Check we did exercise the GNU readline path
2076 self.assertIn(lines[0], {'tty = True', 'tty = False'})
2077 if lines[0] != 'tty = True':
2078 self.skipTest("standard IO in should have been a tty")
2079 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
2080 if stdio_encoding:
2081 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
2082 else:
2083 expected = terminal_input.decode(sys.stdin.encoding) # what else?
2084 self.assertEqual(input_result, expected)
2085
2086 def test_input_tty(self):
2087 # Test input() functionality when wired to a tty (the code path
2088 # is different and invokes GNU readline if available).
2089 self.check_input_tty("prompt", b"quux")
2090
2091 def test_input_tty_non_ascii(self):
2092 # Check stdin/stdout encoding is used when invoking GNU readline
2093 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
2094
2095 def test_input_tty_non_ascii_unicode_errors(self):
2096 # Check stdin/stdout error handler is used when invoking GNU readline
2097 self.check_input_tty("prompté", b"quux\xe9", "ascii")
2098
2099 def test_input_no_stdout_fileno(self):
2100 # Issue #24402: If stdin is the original terminal but stdout.fileno()
2101 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00002102 def child(wpipe):
2103 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
2104 sys.stdout = io.StringIO() # Does not support fileno()
2105 input("prompt")
2106 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
2107 lines = self.run_child(child, b"quux\r")
2108 expected = (
2109 "stdin.isatty(): True",
2110 "captured: 'prompt'",
2111 )
2112 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00002113
Raymond Hettinger64958a12003-12-17 20:43:33 +00002114class TestSorted(unittest.TestCase):
2115
2116 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00002117 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002118 copy = data[:]
2119 random.shuffle(copy)
2120 self.assertEqual(data, sorted(copy))
2121 self.assertNotEqual(data, copy)
2122
2123 data.reverse()
2124 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00002125 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2126 self.assertNotEqual(data, copy)
2127 random.shuffle(copy)
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03002128 self.assertEqual(data, sorted(copy, reverse=True))
Raymond Hettinger64958a12003-12-17 20:43:33 +00002129 self.assertNotEqual(data, copy)
2130
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02002131 def test_bad_arguments(self):
2132 # Issue #29327: The first argument is positional-only.
2133 sorted([])
2134 with self.assertRaises(TypeError):
2135 sorted(iterable=[])
2136 # Other arguments are keyword-only
2137 sorted([], key=None)
2138 with self.assertRaises(TypeError):
2139 sorted([], None)
2140
Raymond Hettinger64958a12003-12-17 20:43:33 +00002141 def test_inputtypes(self):
2142 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002143 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002144 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002145 self.assertEqual(sorted(s), sorted(T(s)))
2146
Walter Dörwald1f5947b2007-05-22 16:52:54 +00002147 s = ''.join(set(s)) # unique letters only
2148 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00002149 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00002150 self.assertEqual(sorted(s), sorted(T(s)))
2151
2152 def test_baddecorator(self):
2153 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2154 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2155
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002156
2157class ShutdownTest(unittest.TestCase):
2158
2159 def test_cleanup(self):
2160 # Issue #19255: builtins are still available at shutdown
2161 code = """if 1:
2162 import builtins
2163 import sys
2164
2165 class C:
2166 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01002167 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002168 # Check that builtins still exist
2169 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01002170 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002171
2172 c = C()
2173 # Make this module survive until builtins and sys are cleaned
2174 builtins.here = sys.modules[__name__]
2175 sys.here = sys.modules[__name__]
2176 # Create a reference loop so that this module needs to go
2177 # through a GC phase.
2178 here = sys.modules[__name__]
2179 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01002180 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
2181 # otherwise the codec may be unloaded before C.__del__() is called, and
2182 # so print("before") fails because the codec cannot be used to encode
2183 # "before" to sys.stdout.encoding. For example, on Windows,
2184 # sys.stdout.encoding is the OEM code page and these code pages are
2185 # implemented in Python
2186 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01002187 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02002188 self.assertEqual(["before", "after"], out.decode().splitlines())
2189
2190
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002191class TestType(unittest.TestCase):
2192 def test_new_type(self):
2193 A = type('A', (), {})
2194 self.assertEqual(A.__name__, 'A')
2195 self.assertEqual(A.__qualname__, 'A')
2196 self.assertEqual(A.__module__, __name__)
2197 self.assertEqual(A.__bases__, (object,))
2198 self.assertIs(A.__base__, object)
2199 x = A()
2200 self.assertIs(type(x), A)
2201 self.assertIs(x.__class__, A)
2202
2203 class B:
2204 def ham(self):
2205 return 'ham%d' % self
2206 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
2207 self.assertEqual(C.__name__, 'C')
2208 self.assertEqual(C.__qualname__, 'C')
2209 self.assertEqual(C.__module__, __name__)
2210 self.assertEqual(C.__bases__, (B, int))
2211 self.assertIs(C.__base__, int)
2212 self.assertIn('spam', C.__dict__)
2213 self.assertNotIn('ham', C.__dict__)
2214 x = C(42)
2215 self.assertEqual(x, 42)
2216 self.assertIs(type(x), C)
2217 self.assertIs(x.__class__, C)
2218 self.assertEqual(x.ham(), 'ham42')
2219 self.assertEqual(x.spam(), 'spam42')
2220 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
2221
Nick Coghland78448e2016-07-30 16:26:03 +10002222 def test_type_nokwargs(self):
2223 with self.assertRaises(TypeError):
2224 type('a', (), {}, x=5)
2225 with self.assertRaises(TypeError):
2226 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002227
2228 def test_type_name(self):
2229 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2230 with self.subTest(name=name):
2231 A = type(name, (), {})
2232 self.assertEqual(A.__name__, name)
2233 self.assertEqual(A.__qualname__, name)
2234 self.assertEqual(A.__module__, __name__)
2235 with self.assertRaises(ValueError):
2236 type('A\x00B', (), {})
2237 with self.assertRaises(ValueError):
2238 type('A\udcdcB', (), {})
2239 with self.assertRaises(TypeError):
2240 type(b'A', (), {})
2241
2242 C = type('C', (), {})
2243 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
2244 with self.subTest(name=name):
2245 C.__name__ = name
2246 self.assertEqual(C.__name__, name)
2247 self.assertEqual(C.__qualname__, 'C')
2248 self.assertEqual(C.__module__, __name__)
2249
2250 A = type('C', (), {})
2251 with self.assertRaises(ValueError):
2252 A.__name__ = 'A\x00B'
2253 self.assertEqual(A.__name__, 'C')
2254 with self.assertRaises(ValueError):
2255 A.__name__ = 'A\udcdcB'
2256 self.assertEqual(A.__name__, 'C')
2257 with self.assertRaises(TypeError):
2258 A.__name__ = b'A'
2259 self.assertEqual(A.__name__, 'C')
2260
2261 def test_type_qualname(self):
2262 A = type('A', (), {'__qualname__': 'B.C'})
2263 self.assertEqual(A.__name__, 'A')
2264 self.assertEqual(A.__qualname__, 'B.C')
2265 self.assertEqual(A.__module__, __name__)
2266 with self.assertRaises(TypeError):
2267 type('A', (), {'__qualname__': b'B'})
2268 self.assertEqual(A.__qualname__, 'B.C')
2269
2270 A.__qualname__ = 'D.E'
2271 self.assertEqual(A.__name__, 'A')
2272 self.assertEqual(A.__qualname__, 'D.E')
2273 with self.assertRaises(TypeError):
2274 A.__qualname__ = b'B'
2275 self.assertEqual(A.__qualname__, 'D.E')
2276
2277 def test_type_doc(self):
2278 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
2279 A = type('A', (), {'__doc__': doc})
2280 self.assertEqual(A.__doc__, doc)
2281 with self.assertRaises(UnicodeEncodeError):
2282 type('A', (), {'__doc__': 'x\udcdcy'})
2283
2284 A = type('A', (), {})
2285 self.assertEqual(A.__doc__, None)
2286 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
2287 A.__doc__ = doc
2288 self.assertEqual(A.__doc__, doc)
2289
2290 def test_bad_args(self):
2291 with self.assertRaises(TypeError):
2292 type()
2293 with self.assertRaises(TypeError):
2294 type('A', ())
2295 with self.assertRaises(TypeError):
2296 type('A', (), {}, ())
2297 with self.assertRaises(TypeError):
2298 type('A', (), dict={})
2299 with self.assertRaises(TypeError):
2300 type('A', [], {})
2301 with self.assertRaises(TypeError):
2302 type('A', (), types.MappingProxyType({}))
2303 with self.assertRaises(TypeError):
2304 type('A', (None,), {})
2305 with self.assertRaises(TypeError):
2306 type('A', (bool,), {})
2307 with self.assertRaises(TypeError):
2308 type('A', (int, str), {})
2309
2310 def test_bad_slots(self):
2311 with self.assertRaises(TypeError):
2312 type('A', (), {'__slots__': b'x'})
2313 with self.assertRaises(TypeError):
2314 type('A', (int,), {'__slots__': 'x'})
2315 with self.assertRaises(TypeError):
2316 type('A', (), {'__slots__': ''})
2317 with self.assertRaises(TypeError):
2318 type('A', (), {'__slots__': '42'})
2319 with self.assertRaises(TypeError):
2320 type('A', (), {'__slots__': 'x\x00y'})
2321 with self.assertRaises(ValueError):
2322 type('A', (), {'__slots__': 'x', 'x': 0})
2323 with self.assertRaises(TypeError):
2324 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2325 with self.assertRaises(TypeError):
2326 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2327
2328 class B:
2329 pass
2330 with self.assertRaises(TypeError):
2331 type('A', (B,), {'__slots__': '__dict__'})
2332 with self.assertRaises(TypeError):
2333 type('A', (B,), {'__slots__': '__weakref__'})
2334
INADA Naoki2aaf98c2018-09-26 12:59:00 +09002335 def test_namespace_order(self):
2336 # bpo-34320: namespace should preserve order
2337 od = collections.OrderedDict([('a', 1), ('b', 2)])
2338 od.move_to_end('a')
2339 expected = list(od.items())
2340
2341 C = type('C', (), od)
2342 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
2343
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02002344
Zachary Warea4b7a752013-11-24 01:19:09 -06002345def load_tests(loader, tests, pattern):
2346 from doctest import DocTestSuite
2347 tests.addTest(DocTestSuite(builtins))
2348 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002349
2350if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002351 unittest.main()