blob: 0a61c054444fc1247631d2cb7429941c10d0b00f [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
4import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00005import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07006import decimal
7import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00008import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +02009import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010010import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000011import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020012import platform
13import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020014import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020015import sys
16import traceback
17import types
18import unittest
19import warnings
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040020from contextlib import ExitStack
Victor Stinnerf86a5e82012-06-05 13:43:22 +020021from operator import neg
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040022from test.support import (
23 EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink)
Berker Peksagce643912015-05-06 06:33:17 +030024from test.support.script_helper import assert_python_ok
Barry Warsaw36c1d1f2017-10-05 12:11:18 -040025from unittest.mock import MagicMock, patch
Antoine Pitrou0d776b12011-11-06 00:34:26 +010026try:
Antoine Pitrou772add72011-11-06 02:37:42 +010027 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010028except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010029 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000030
Guido van Rossum3bead091992-01-27 17:00:37 +000031
Walter Dörwald919497e2003-01-19 16:23:59 +000032class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000033
Walter Dörwald919497e2003-01-19 16:23:59 +000034 def __init__(self, max):
35 self.max = max
36 self.sofar = []
37
38 def __len__(self): return len(self.sofar)
39
40 def __getitem__(self, i):
41 if not 0 <= i < self.max: raise IndexError
42 n = len(self.sofar)
43 while n <= i:
44 self.sofar.append(n*n)
45 n += 1
46 return self.sofar[i]
47
48class StrSquares:
49
50 def __init__(self, max):
51 self.max = max
52 self.sofar = []
53
54 def __len__(self):
55 return len(self.sofar)
56
57 def __getitem__(self, i):
58 if not 0 <= i < self.max:
59 raise IndexError
60 n = len(self.sofar)
61 while n <= i:
62 self.sofar.append(str(n*n))
63 n += 1
64 return self.sofar[i]
65
66class BitBucket:
67 def write(self, line):
68 pass
69
Facundo Batista2336bdd2008-01-19 19:12:01 +000070test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000071 ('0', 0),
72 ('1', 1),
73 ('9', 9),
74 ('10', 10),
75 ('99', 99),
76 ('100', 100),
77 ('314', 314),
78 (' 314', 314),
79 ('314 ', 314),
80 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000081 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000082 (' 1x', ValueError),
83 (' 1 ', 1),
84 (' 1\02 ', ValueError),
85 ('', ValueError),
86 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000087 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040088 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000089 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000090]
91
Facundo Batista2336bdd2008-01-19 19:12:01 +000092test_conv_sign = [
93 ('0', 0),
94 ('1', 1),
95 ('9', 9),
96 ('10', 10),
97 ('99', 99),
98 ('100', 100),
99 ('314', 314),
100 (' 314', ValueError),
101 ('314 ', 314),
102 (' \t\t 314 \t\t ', ValueError),
103 (repr(sys.maxsize), sys.maxsize),
104 (' 1x', ValueError),
105 (' 1 ', ValueError),
106 (' 1\02 ', ValueError),
107 ('', ValueError),
108 (' ', ValueError),
109 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400110 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000111 (chr(0x200), ValueError),
112]
113
Raymond Hettinger96229b12005-03-11 06:49:40 +0000114class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000115 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000116 raise RuntimeError
117
118class TestFailingIter:
119 def __iter__(self):
120 raise RuntimeError
121
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000122def filter_char(arg):
123 return ord(arg) > ord("d")
124
125def map_char(arg):
126 return chr(ord(arg)+1)
127
Walter Dörwald919497e2003-01-19 16:23:59 +0000128class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000129 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200130 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000131 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200132 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000133 it = pickle.loads(d)
134 self.assertEqual(type(itorg), type(it))
135 self.assertEqual(list(it), seq)
136
137 #test the iterator after dropping one from it
138 it = pickle.loads(d)
139 try:
140 next(it)
141 except StopIteration:
142 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200143 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000144 it = pickle.loads(d)
145 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000146
147 def test_import(self):
148 __import__('sys')
149 __import__('time')
150 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000151 __import__(name='sys')
152 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000153 self.assertRaises(ImportError, __import__, 'spamspam')
154 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000155 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000156 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300157 # embedded null character
158 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000159
160 def test_abs(self):
161 # int
162 self.assertEqual(abs(0), 0)
163 self.assertEqual(abs(1234), 1234)
164 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000165 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000166 # float
167 self.assertEqual(abs(0.0), 0.0)
168 self.assertEqual(abs(3.14), 3.14)
169 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 # str
171 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000172 # bool
173 self.assertEqual(abs(True), 1)
174 self.assertEqual(abs(False), 0)
175 # other
176 self.assertRaises(TypeError, abs)
177 self.assertRaises(TypeError, abs, None)
178 class AbsClass(object):
179 def __abs__(self):
180 return -5
181 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000182
Raymond Hettinger96229b12005-03-11 06:49:40 +0000183 def test_all(self):
184 self.assertEqual(all([2, 4, 6]), True)
185 self.assertEqual(all([2, None, 6]), False)
186 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
187 self.assertRaises(RuntimeError, all, TestFailingIter())
188 self.assertRaises(TypeError, all, 10) # Non-iterable
189 self.assertRaises(TypeError, all) # No args
190 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
191 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200192 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000193 S = [50, 60]
194 self.assertEqual(all(x > 42 for x in S), True)
195 S = [50, 40, 60]
196 self.assertEqual(all(x > 42 for x in S), False)
197
198 def test_any(self):
199 self.assertEqual(any([None, None, None]), False)
200 self.assertEqual(any([None, 4, None]), True)
201 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500202 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000203 self.assertRaises(TypeError, any, 10) # Non-iterable
204 self.assertRaises(TypeError, any) # No args
205 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
206 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200207 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000208 S = [40, 60, 30]
209 self.assertEqual(any(x > 42 for x in S), True)
210 S = [10, 20, 30]
211 self.assertEqual(any(x > 42 for x in S), False)
212
Georg Brandl559e5d72008-06-11 18:37:52 +0000213 def test_ascii(self):
214 self.assertEqual(ascii(''), '\'\'')
215 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000216 self.assertEqual(ascii(()), '()')
217 self.assertEqual(ascii([]), '[]')
218 self.assertEqual(ascii({}), '{}')
219 a = []
220 a.append(a)
221 self.assertEqual(ascii(a), '[[...]]')
222 a = {}
223 a[0] = a
224 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000225 # Advanced checks for unicode strings
226 def _check_uni(s):
227 self.assertEqual(ascii(s), repr(s))
228 _check_uni("'")
229 _check_uni('"')
230 _check_uni('"\'')
231 _check_uni('\0')
232 _check_uni('\r\n\t .')
233 # Unprintable non-ASCII characters
234 _check_uni('\x85')
235 _check_uni('\u1fff')
236 _check_uni('\U00012fff')
237 # Lone surrogates
238 _check_uni('\ud800')
239 _check_uni('\udfff')
240 # Issue #9804: surrogates should be joined even for printable
241 # wide characters (UCS-2 builds).
242 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
243 # All together
244 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
245 self.assertEqual(ascii(s),
246 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000247
Thomas Wouters89f507f2006-12-13 04:49:30 +0000248 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000249 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000250 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000251 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000252
Walter Dörwald919497e2003-01-19 16:23:59 +0000253 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000254 self.assertTrue(callable(len))
255 self.assertFalse(callable("a"))
256 self.assertTrue(callable(callable))
257 self.assertTrue(callable(lambda x, y: x + y))
258 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000259 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000260 self.assertTrue(callable(f))
261
262 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000263 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000264 self.assertTrue(callable(C1))
265 c = C1()
266 self.assertTrue(callable(c.meth))
267 self.assertFalse(callable(c))
268
269 # __call__ is looked up on the class, not the instance
270 c.__call__ = None
271 self.assertFalse(callable(c))
272 c.__call__ = lambda self: 0
273 self.assertFalse(callable(c))
274 del c.__call__
275 self.assertFalse(callable(c))
276
277 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000278 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000279 c2 = C2()
280 self.assertTrue(callable(c2))
281 c2.__call__ = None
282 self.assertTrue(callable(c2))
283 class C3(C2): pass
284 c3 = C3()
285 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000286
287 def test_chr(self):
288 self.assertEqual(chr(32), ' ')
289 self.assertEqual(chr(65), 'A')
290 self.assertEqual(chr(97), 'a')
291 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000292 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000293 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300294 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000295 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000296 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
297 self.assertEqual(chr(0x00010000), "\U00010000")
298 self.assertEqual(chr(0x00010001), "\U00010001")
299 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
300 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
301 self.assertEqual(chr(0x00100000), "\U00100000")
302 self.assertEqual(chr(0x00100001), "\U00100001")
303 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
304 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
305 self.assertRaises(ValueError, chr, -1)
306 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000307 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000308
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000309 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000310 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000311
Walter Dörwald919497e2003-01-19 16:23:59 +0000312 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000313 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000314 bom = b'\xef\xbb\xbf'
315 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000316 compile(source='pass', filename='?', mode='exec')
317 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
318 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000319 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000320 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000321 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
322 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300323 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000324 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
325 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000326 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300327 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000328 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000329
Georg Brandl8334fd92010-12-04 10:26:46 +0000330 # test the optimize argument
331
332 codestr = '''def f():
333 """doc"""
diana543386b2017-10-03 10:46:56 -0600334 debug_enabled = False
335 if __debug__:
336 debug_enabled = True
Georg Brandl8334fd92010-12-04 10:26:46 +0000337 try:
338 assert False
339 except AssertionError:
diana543386b2017-10-03 10:46:56 -0600340 return (True, f.__doc__, debug_enabled)
Georg Brandl8334fd92010-12-04 10:26:46 +0000341 else:
diana543386b2017-10-03 10:46:56 -0600342 return (False, f.__doc__, debug_enabled)
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 '''
344 def f(): """doc"""
diana543386b2017-10-03 10:46:56 -0600345 values = [(-1, __debug__, f.__doc__, __debug__),
346 (0, True, 'doc', True),
347 (1, False, 'doc', False),
348 (2, False, None, False)]
349 for optval, assertval, docstring, debugval in values:
Georg Brandl8334fd92010-12-04 10:26:46 +0000350 # test both direct compilation and compilation via AST
351 codeobjs = []
352 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
353 tree = ast.parse(codestr)
354 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
355 for code in codeobjs:
356 ns = {}
357 exec(code, ns)
358 rv = ns['f']()
diana543386b2017-10-03 10:46:56 -0600359 self.assertEqual(rv, (assertval, docstring, debugval))
Georg Brandl8334fd92010-12-04 10:26:46 +0000360
Walter Dörwald919497e2003-01-19 16:23:59 +0000361 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000362 sys.spam = 1
363 delattr(sys, 'spam')
364 self.assertRaises(TypeError, delattr)
365
366 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000367 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000368 self.assertRaises(TypeError, dir, 42, 42)
369
Georg Brandle32b4222007-03-10 22:13:27 +0000370 # dir() - local scope
371 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000372 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000373
374 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000375 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000376
377 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000378 class Foo(types.ModuleType):
379 __dict__ = 8
380 f = Foo("foo")
381 self.assertRaises(TypeError, dir, f)
382
383 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000384 self.assertIn("strip", dir(str))
385 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000386
387 # dir(obj)
388 class Foo(object):
389 def __init__(self):
390 self.x = 7
391 self.y = 8
392 self.z = 9
393 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000394 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000395
396 # dir(obj_no__dict__)
397 class Foo(object):
398 __slots__ = []
399 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000400 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000401
402 # dir(obj_no__class__with__dict__)
403 # (an ugly trick to cause getattr(f, "__class__") to fail)
404 class Foo(object):
405 __slots__ = ["__class__", "__dict__"]
406 def __init__(self):
407 self.bar = "wow"
408 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000409 self.assertNotIn("__repr__", dir(f))
410 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000411
412 # dir(obj_using __dir__)
413 class Foo(object):
414 def __dir__(self):
415 return ["kan", "ga", "roo"]
416 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000417 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000418
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500419 # dir(obj__dir__tuple)
420 class Foo(object):
421 def __dir__(self):
422 return ("b", "c", "a")
423 res = dir(Foo())
424 self.assertIsInstance(res, list)
425 self.assertTrue(res == ["a", "b", "c"])
426
427 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000428 class Foo(object):
429 def __dir__(self):
430 return 7
431 f = Foo()
432 self.assertRaises(TypeError, dir, f)
433
Collin Winter3eed7652007-08-14 17:53:54 +0000434 # dir(traceback)
435 try:
436 raise IndexError
437 except:
438 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
439
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500440 # test that object has a __dir__()
441 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000442
Walter Dörwald919497e2003-01-19 16:23:59 +0000443 def test_divmod(self):
444 self.assertEqual(divmod(12, 7), (1, 5))
445 self.assertEqual(divmod(-12, 7), (-2, 2))
446 self.assertEqual(divmod(12, -7), (-2, -2))
447 self.assertEqual(divmod(-12, -7), (1, -5))
448
Mark Dickinson5c2db372009-12-05 20:28:34 +0000449 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000450
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000451 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
452 (-3.25, 1.0, (-4.0, 0.75)),
453 (3.25, -1.0, (-4.0, -0.75)),
454 (-3.25, -1.0, (3.0, -0.25))]:
455 result = divmod(num, denom)
456 self.assertAlmostEqual(result[0], exp_result[0])
457 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000458
459 self.assertRaises(TypeError, divmod)
460
461 def test_eval(self):
462 self.assertEqual(eval('1+1'), 2)
463 self.assertEqual(eval(' 1+1\n'), 2)
464 globals = {'a': 1, 'b': 2}
465 locals = {'b': 200, 'c': 300}
466 self.assertEqual(eval('a', globals) , 1)
467 self.assertEqual(eval('a', globals, locals), 1)
468 self.assertEqual(eval('b', globals, locals), 200)
469 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000470 globals = {'a': 1, 'b': 2}
471 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000472 bom = b'\xef\xbb\xbf'
473 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000474 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000475 self.assertRaises(TypeError, eval)
476 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000477 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000478
Benjamin Peterson92722792012-12-15 12:51:05 -0500479 class X:
480 def __getitem__(self, key):
481 raise ValueError
482 self.assertRaises(ValueError, eval, "foo", {}, X())
483
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000484 def test_general_eval(self):
485 # Tests that general mappings can be used for the locals argument
486
487 class M:
488 "Test mapping interface versus possible calls from eval()."
489 def __getitem__(self, key):
490 if key == 'a':
491 return 12
492 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000493 def keys(self):
494 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000495
496 m = M()
497 g = globals()
498 self.assertEqual(eval('a', g, m), 12)
499 self.assertRaises(NameError, eval, 'b', g, m)
500 self.assertEqual(eval('dir()', g, m), list('xyz'))
501 self.assertEqual(eval('globals()', g, m), g)
502 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000503 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000504 class A:
505 "Non-mapping"
506 pass
507 m = A()
508 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000509
510 # Verify that dict subclasses work as well
511 class D(dict):
512 def __getitem__(self, key):
513 if key == 'a':
514 return 12
515 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000516 def keys(self):
517 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000518
519 d = D()
520 self.assertEqual(eval('a', g, d), 12)
521 self.assertRaises(NameError, eval, 'b', g, d)
522 self.assertEqual(eval('dir()', g, d), list('xyz'))
523 self.assertEqual(eval('globals()', g, d), g)
524 self.assertEqual(eval('locals()', g, d), d)
525
526 # Verify locals stores (used by list comps)
527 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000528 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000529
530 class SpreadSheet:
531 "Sample application showing nested, calculated lookups."
532 _cells = {}
533 def __setitem__(self, key, formula):
534 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000535 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000536 return eval(self._cells[key], globals(), self)
537
538 ss = SpreadSheet()
539 ss['a1'] = '5'
540 ss['a2'] = 'a1*6'
541 ss['a3'] = 'a2*7'
542 self.assertEqual(ss['a3'], 210)
543
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000544 # Verify that dir() catches a non-list returned by eval
545 # SF bug #1004669
546 class C:
547 def __getitem__(self, item):
548 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000549 def keys(self):
550 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000551 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
552
Georg Brandl7cae87c2006-09-06 06:51:57 +0000553 def test_exec(self):
554 g = {}
555 exec('z = 1', g)
556 if '__builtins__' in g:
557 del g['__builtins__']
558 self.assertEqual(g, {'z': 1})
559
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000560 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000561 if '__builtins__' in g:
562 del g['__builtins__']
563 self.assertEqual(g, {'z': 2})
564 g = {}
565 l = {}
566
Brett Cannon77628992010-03-20 20:59:33 +0000567 with check_warnings():
568 warnings.filterwarnings("ignore", "global statement",
569 module="<string>")
570 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000571 if '__builtins__' in g:
572 del g['__builtins__']
573 if '__builtins__' in l:
574 del l['__builtins__']
575 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
576
Victor Stinnerb0b22422012-04-19 00:57:45 +0200577 def test_exec_globals(self):
578 code = compile("print('Hello World!')", "", "exec")
579 # no builtin function
580 self.assertRaisesRegex(NameError, "name 'print' is not defined",
581 exec, code, {'__builtins__': {}})
582 # __builtins__ must be a mapping type
583 self.assertRaises(TypeError,
584 exec, code, {'__builtins__': 123})
585
586 # no __build_class__ function
587 code = compile("class A: pass", "", "exec")
588 self.assertRaisesRegex(NameError, "__build_class__ not found",
589 exec, code, {'__builtins__': {}})
590
591 class frozendict_error(Exception):
592 pass
593
594 class frozendict(dict):
595 def __setitem__(self, key, value):
596 raise frozendict_error("frozendict is readonly")
597
598 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400599 if isinstance(__builtins__, types.ModuleType):
600 frozen_builtins = frozendict(__builtins__.__dict__)
601 else:
602 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200603 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
604 self.assertRaises(frozendict_error,
605 exec, code, {'__builtins__': frozen_builtins})
606
607 # read-only globals
608 namespace = frozendict({})
609 code = compile("x=1", "test", "exec")
610 self.assertRaises(frozendict_error,
611 exec, code, namespace)
612
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000613 def test_exec_redirected(self):
614 savestdout = sys.stdout
615 sys.stdout = None # Whatever that cannot flush()
616 try:
617 # Used to raise SystemError('error return without exception set')
618 exec('a')
619 except NameError:
620 pass
621 finally:
622 sys.stdout = savestdout
623
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000625 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
626 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
627 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
628 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
629 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000630 def identity(item):
631 return 1
632 filter(identity, Squares(5))
633 self.assertRaises(TypeError, filter)
634 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000635 def __getitem__(self, index):
636 if index<4:
637 return 42
638 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000639 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000640 def badfunc():
641 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000642 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000643
Walter Dörwaldbf517072003-01-27 15:57:14 +0000644 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000645 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
646 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
647 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000648
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000649 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200650 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
651 f1 = filter(filter_char, "abcdeabcde")
652 f2 = filter(filter_char, "abcdeabcde")
653 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000654
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000656 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000657 self.assertRaises(TypeError, getattr, sys, 1)
658 self.assertRaises(TypeError, getattr, sys, 1, "foo")
659 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000660 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000661 # unicode surrogates are not encodable to the default encoding (utf8)
662 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000663
664 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000665 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000666 self.assertRaises(TypeError, hasattr, sys, 1)
667 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000668 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000669
Benjamin Peterson17689992010-08-24 03:26:23 +0000670 # Check that hasattr propagates all exceptions outside of
671 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000672 class A:
673 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000674 raise SystemExit
675 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000676 class B:
677 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000678 raise ValueError
679 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000680
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 def test_hash(self):
682 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000683 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000684 self.assertEqual(hash(1), hash(1.0))
685 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000686 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000687 hash((0,1,2,3))
688 def f(): pass
689 self.assertRaises(TypeError, hash, [])
690 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691 # Bug 1536021: Allow hash to return long objects
692 class X:
693 def __hash__(self):
694 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000695 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000696 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000697 def __hash__(self):
698 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000699 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000700
701 def test_hex(self):
702 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000703 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000704 self.assertRaises(TypeError, hex, {})
705
706 def test_id(self):
707 id(None)
708 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000709 id(1.0)
710 id('spam')
711 id((0,1,2,3))
712 id([0,1,2,3])
713 id({'spam': 1, 'eggs': 2, 'ham': 3})
714
Guido van Rossuma88a0332007-02-26 16:59:55 +0000715 # Test input() later, alphabetized as if it were raw_input
716
Walter Dörwald919497e2003-01-19 16:23:59 +0000717 def test_iter(self):
718 self.assertRaises(TypeError, iter)
719 self.assertRaises(TypeError, iter, 42, 42)
720 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000721 for l in lists:
722 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000723 self.assertEqual(next(i), '1')
724 self.assertEqual(next(i), '2')
725 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000726
727 def test_isinstance(self):
728 class C:
729 pass
730 class D(C):
731 pass
732 class E:
733 pass
734 c = C()
735 d = D()
736 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000737 self.assertTrue(isinstance(c, C))
738 self.assertTrue(isinstance(d, C))
739 self.assertTrue(not isinstance(e, C))
740 self.assertTrue(not isinstance(c, D))
741 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000742 self.assertRaises(TypeError, isinstance, E, 'foo')
743 self.assertRaises(TypeError, isinstance)
744
745 def test_issubclass(self):
746 class C:
747 pass
748 class D(C):
749 pass
750 class E:
751 pass
752 c = C()
753 d = D()
754 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000755 self.assertTrue(issubclass(D, C))
756 self.assertTrue(issubclass(C, C))
757 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000758 self.assertRaises(TypeError, issubclass, 'foo', E)
759 self.assertRaises(TypeError, issubclass, E, 'foo')
760 self.assertRaises(TypeError, issubclass)
761
762 def test_len(self):
763 self.assertEqual(len('123'), 3)
764 self.assertEqual(len(()), 0)
765 self.assertEqual(len((1, 2, 3, 4)), 4)
766 self.assertEqual(len([1, 2, 3, 4]), 4)
767 self.assertEqual(len({}), 0)
768 self.assertEqual(len({'a':1, 'b': 2}), 2)
769 class BadSeq:
770 def __len__(self):
771 raise ValueError
772 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000773 class InvalidLen:
774 def __len__(self):
775 return None
776 self.assertRaises(TypeError, len, InvalidLen())
777 class FloatLen:
778 def __len__(self):
779 return 4.5
780 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300781 class NegativeLen:
782 def __len__(self):
783 return -10
784 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000785 class HugeLen:
786 def __len__(self):
787 return sys.maxsize + 1
788 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300789 class HugeNegativeLen:
790 def __len__(self):
791 return -sys.maxsize-10
792 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000793 class NoLenMethod(object): pass
794 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000795
Walter Dörwald919497e2003-01-19 16:23:59 +0000796 def test_map(self):
797 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000798 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 [1, 4, 9]
800 )
801 try:
802 from math import sqrt
803 except ImportError:
804 def sqrt(x):
805 return pow(x, 0.5)
806 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000807 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000808 [[4.0, 2.0], [9.0, 3.0]]
809 )
810 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000811 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000812 [10, 4, 6]
813 )
814
815 def plus(*v):
816 accu = 0
817 for i in v: accu = accu + i
818 return accu
819 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000820 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 [1, 3, 7]
822 )
823 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000824 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000825 [1+4, 3+9, 7+2]
826 )
827 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000828 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000829 [1+4+1, 3+9+1, 7+2+0]
830 )
831 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000832 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
834 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000835 def Max(a, b):
836 if a is None:
837 return b
838 if b is None:
839 return a
840 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000842 list(map(Max, Squares(3), Squares(2))),
843 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000844 )
845 self.assertRaises(TypeError, map)
846 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000848 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000849 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000850 yield None
851 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000852 def badfunc(x):
853 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000854 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000855
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000856 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200857 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
858 m1 = map(map_char, "Is this the real life?")
859 m2 = map(map_char, "Is this the real life?")
860 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000861
Walter Dörwald919497e2003-01-19 16:23:59 +0000862 def test_max(self):
863 self.assertEqual(max('123123'), '3')
864 self.assertEqual(max(1, 2, 3), 3)
865 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
866 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
867
Guido van Rossume2a383d2007-01-15 16:59:06 +0000868 self.assertEqual(max(1, 2, 3.0), 3.0)
869 self.assertEqual(max(1, 2.0, 3), 3)
870 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000871
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700872 self.assertRaises(TypeError, max)
873 self.assertRaises(TypeError, max, 42)
874 self.assertRaises(ValueError, max, ())
875 class BadSeq:
876 def __getitem__(self, index):
877 raise ValueError
878 self.assertRaises(ValueError, max, BadSeq())
879
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000880 for stmt in (
881 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700882 "max(default=None)",
883 "max(1, 2, default=None)", # require container for default
884 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000885 "max(1, key=int)", # single arg not iterable
886 "max(1, 2, keystone=int)", # wrong keyword
887 "max(1, 2, key=int, abc=int)", # two many keywords
888 "max(1, 2, key=1)", # keyfunc is not callable
889 ):
Tim Peters7f061872004-12-07 21:17:46 +0000890 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000891 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000892 except TypeError:
893 pass
894 else:
895 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000896
897 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
898 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
899 self.assertEqual(max(1, 2, key=neg), 1) # two elems
900
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700901 self.assertEqual(max((), default=None), None) # zero elem iterable
902 self.assertEqual(max((1,), default=None), 1) # one elem iterable
903 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
904
905 self.assertEqual(max((), default=1, key=neg), 1)
906 self.assertEqual(max((1, 2), default=3, key=neg), 1)
907
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000908 data = [random.randrange(200) for i in range(100)]
909 keys = dict((elem, random.randrange(50)) for elem in data)
910 f = keys.__getitem__
911 self.assertEqual(max(data, key=f),
912 sorted(reversed(data), key=f)[-1])
913
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 def test_min(self):
915 self.assertEqual(min('123123'), '1')
916 self.assertEqual(min(1, 2, 3), 1)
917 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
918 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
919
Guido van Rossume2a383d2007-01-15 16:59:06 +0000920 self.assertEqual(min(1, 2, 3.0), 1)
921 self.assertEqual(min(1, 2.0, 3), 1)
922 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000923
924 self.assertRaises(TypeError, min)
925 self.assertRaises(TypeError, min, 42)
926 self.assertRaises(ValueError, min, ())
927 class BadSeq:
928 def __getitem__(self, index):
929 raise ValueError
930 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000931
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000932 for stmt in (
933 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700934 "min(default=None)",
935 "min(1, 2, default=None)", # require container for default
936 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000937 "min(1, key=int)", # single arg not iterable
938 "min(1, 2, keystone=int)", # wrong keyword
939 "min(1, 2, key=int, abc=int)", # two many keywords
940 "min(1, 2, key=1)", # keyfunc is not callable
941 ):
Tim Peters7f061872004-12-07 21:17:46 +0000942 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000943 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000944 except TypeError:
945 pass
946 else:
947 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000948
949 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
950 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
951 self.assertEqual(min(1, 2, key=neg), 2) # two elems
952
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700953 self.assertEqual(min((), default=None), None) # zero elem iterable
954 self.assertEqual(min((1,), default=None), 1) # one elem iterable
955 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
956
957 self.assertEqual(min((), default=1, key=neg), 1)
958 self.assertEqual(min((1, 2), default=1, key=neg), 2)
959
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000960 data = [random.randrange(200) for i in range(100)]
961 keys = dict((elem, random.randrange(50)) for elem in data)
962 f = keys.__getitem__
963 self.assertEqual(min(data, key=f),
964 sorted(data, key=f)[0])
965
Georg Brandla18af4e2007-04-21 15:47:16 +0000966 def test_next(self):
967 it = iter(range(2))
968 self.assertEqual(next(it), 0)
969 self.assertEqual(next(it), 1)
970 self.assertRaises(StopIteration, next, it)
971 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000972 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000973
974 class Iter(object):
975 def __iter__(self):
976 return self
977 def __next__(self):
978 raise StopIteration
979
980 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000981 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000982 self.assertRaises(StopIteration, next, it)
983
984 def gen():
985 yield 1
986 return
987
988 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000990 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000991 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000992
Walter Dörwald919497e2003-01-19 16:23:59 +0000993 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000994 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000995 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 self.assertRaises(TypeError, oct, ())
997
998 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000999 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001001 self.addCleanup(unlink, TESTFN)
1002 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001003 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001004 fp.write('The quick brown fox jumps over the lazy dog')
1005 fp.write('.\n')
1006 fp.write('Dear John\n')
1007 fp.write('XXX'*100)
1008 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001009
1010 def test_open(self):
1011 self.write_testfile()
1012 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001013 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001014 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1016 self.assertEqual(fp.readline(4), 'Dear')
1017 self.assertEqual(fp.readline(100), ' John\n')
1018 self.assertEqual(fp.read(300), 'XXX'*100)
1019 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001020
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001021 # embedded null bytes and characters
1022 self.assertRaises(ValueError, open, 'a\x00b')
1023 self.assertRaises(ValueError, open, b'a\x00b')
1024
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001025 def test_open_default_encoding(self):
1026 old_environ = dict(os.environ)
1027 try:
1028 # try to get a user preferred encoding different than the current
1029 # locale encoding to check that open() uses the current locale
1030 # encoding and not the user preferred encoding
1031 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1032 if key in os.environ:
1033 del os.environ[key]
1034
1035 self.write_testfile()
1036 current_locale_encoding = locale.getpreferredencoding(False)
1037 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001038 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001039 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001040 finally:
1041 os.environ.clear()
1042 os.environ.update(old_environ)
1043
Victor Stinnerdaf45552013-08-28 00:53:59 +02001044 def test_open_non_inheritable(self):
1045 fileobj = open(__file__)
1046 with fileobj:
1047 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1048
Walter Dörwald919497e2003-01-19 16:23:59 +00001049 def test_ord(self):
1050 self.assertEqual(ord(' '), 32)
1051 self.assertEqual(ord('A'), 65)
1052 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001053 self.assertEqual(ord('\x80'), 128)
1054 self.assertEqual(ord('\xff'), 255)
1055
1056 self.assertEqual(ord(b' '), 32)
1057 self.assertEqual(ord(b'A'), 65)
1058 self.assertEqual(ord(b'a'), 97)
1059 self.assertEqual(ord(b'\x80'), 128)
1060 self.assertEqual(ord(b'\xff'), 255)
1061
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001062 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001064
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001065 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1066 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1067 self.assertEqual(ord("\U00010000"), 0x00010000)
1068 self.assertEqual(ord("\U00010001"), 0x00010001)
1069 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1070 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1071 self.assertEqual(ord("\U00100000"), 0x00100000)
1072 self.assertEqual(ord("\U00100001"), 0x00100001)
1073 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1074 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 def test_pow(self):
1077 self.assertEqual(pow(0,0), 1)
1078 self.assertEqual(pow(0,1), 0)
1079 self.assertEqual(pow(1,0), 1)
1080 self.assertEqual(pow(1,1), 1)
1081
1082 self.assertEqual(pow(2,0), 1)
1083 self.assertEqual(pow(2,10), 1024)
1084 self.assertEqual(pow(2,20), 1024*1024)
1085 self.assertEqual(pow(2,30), 1024*1024*1024)
1086
1087 self.assertEqual(pow(-2,0), 1)
1088 self.assertEqual(pow(-2,1), -2)
1089 self.assertEqual(pow(-2,2), 4)
1090 self.assertEqual(pow(-2,3), -8)
1091
Walter Dörwald919497e2003-01-19 16:23:59 +00001092 self.assertAlmostEqual(pow(0.,0), 1.)
1093 self.assertAlmostEqual(pow(0.,1), 0.)
1094 self.assertAlmostEqual(pow(1.,0), 1.)
1095 self.assertAlmostEqual(pow(1.,1), 1.)
1096
1097 self.assertAlmostEqual(pow(2.,0), 1.)
1098 self.assertAlmostEqual(pow(2.,10), 1024.)
1099 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1100 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1101
1102 self.assertAlmostEqual(pow(-2.,0), 1.)
1103 self.assertAlmostEqual(pow(-2.,1), -2.)
1104 self.assertAlmostEqual(pow(-2.,2), 4.)
1105 self.assertAlmostEqual(pow(-2.,3), -8.)
1106
Mark Dickinson5c2db372009-12-05 20:28:34 +00001107 for x in 2, 2.0:
1108 for y in 10, 10.0:
1109 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001110 if isinstance(x, float) or \
1111 isinstance(y, float) or \
1112 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001113 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001114 else:
1115 self.assertAlmostEqual(pow(x, y, z), 24.0)
1116
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001117 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1118 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1119
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001120 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001121 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001122
1123 self.assertRaises(TypeError, pow)
1124
Guido van Rossuma88a0332007-02-26 16:59:55 +00001125 def test_input(self):
1126 self.write_testfile()
1127 fp = open(TESTFN, 'r')
1128 savestdin = sys.stdin
1129 savestdout = sys.stdout # Eats the echo
1130 try:
1131 sys.stdin = fp
1132 sys.stdout = BitBucket()
1133 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001134 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1135 self.assertEqual(input('testing\n'), 'Dear John')
1136
1137 # SF 1535165: don't segfault on closed stdin
1138 # sys.stdout must be a regular file for triggering
1139 sys.stdout = savestdout
1140 sys.stdin.close()
1141 self.assertRaises(ValueError, input)
1142
1143 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001144 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001145 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001146 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001147 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001148 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001149 self.assertRaises(EOFError, input)
1150
1151 del sys.stdout
1152 self.assertRaises(RuntimeError, input, 'prompt')
1153 del sys.stdin
1154 self.assertRaises(RuntimeError, input, 'prompt')
1155 finally:
1156 sys.stdin = savestdin
1157 sys.stdout = savestdout
1158 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001159
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001160 # test_int(): see test_int.py for tests of built-in function int().
1161
Walter Dörwald919497e2003-01-19 16:23:59 +00001162 def test_repr(self):
1163 self.assertEqual(repr(''), '\'\'')
1164 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 self.assertEqual(repr(()), '()')
1166 self.assertEqual(repr([]), '[]')
1167 self.assertEqual(repr({}), '{}')
1168 a = []
1169 a.append(a)
1170 self.assertEqual(repr(a), '[[...]]')
1171 a = {}
1172 a[0] = a
1173 self.assertEqual(repr(a), '{0: {...}}')
1174
1175 def test_round(self):
1176 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001177 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001178 self.assertEqual(round(1.0), 1.0)
1179 self.assertEqual(round(10.0), 10.0)
1180 self.assertEqual(round(1000000000.0), 1000000000.0)
1181 self.assertEqual(round(1e20), 1e20)
1182
1183 self.assertEqual(round(-1.0), -1.0)
1184 self.assertEqual(round(-10.0), -10.0)
1185 self.assertEqual(round(-1000000000.0), -1000000000.0)
1186 self.assertEqual(round(-1e20), -1e20)
1187
1188 self.assertEqual(round(0.1), 0.0)
1189 self.assertEqual(round(1.1), 1.0)
1190 self.assertEqual(round(10.1), 10.0)
1191 self.assertEqual(round(1000000000.1), 1000000000.0)
1192
1193 self.assertEqual(round(-1.1), -1.0)
1194 self.assertEqual(round(-10.1), -10.0)
1195 self.assertEqual(round(-1000000000.1), -1000000000.0)
1196
1197 self.assertEqual(round(0.9), 1.0)
1198 self.assertEqual(round(9.9), 10.0)
1199 self.assertEqual(round(999999999.9), 1000000000.0)
1200
1201 self.assertEqual(round(-0.9), -1.0)
1202 self.assertEqual(round(-9.9), -10.0)
1203 self.assertEqual(round(-999999999.9), -1000000000.0)
1204
1205 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001206 self.assertEqual(type(round(-8.0, -1)), float)
1207
1208 self.assertEqual(type(round(-8.0, 0)), float)
1209 self.assertEqual(type(round(-8.0, 1)), float)
1210
1211 # Check even / odd rounding behaviour
1212 self.assertEqual(round(5.5), 6)
1213 self.assertEqual(round(6.5), 6)
1214 self.assertEqual(round(-5.5), -6)
1215 self.assertEqual(round(-6.5), -6)
1216
1217 # Check behavior on ints
1218 self.assertEqual(round(0), 0)
1219 self.assertEqual(round(8), 8)
1220 self.assertEqual(round(-8), -8)
1221 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001222 self.assertEqual(type(round(-8, -1)), int)
1223 self.assertEqual(type(round(-8, 0)), int)
1224 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001225
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001226 # test new kwargs
1227 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1228
Walter Dörwald919497e2003-01-19 16:23:59 +00001229 self.assertRaises(TypeError, round)
1230
Alex Martelliae211f92007-08-22 23:21:33 +00001231 # test generic rounding delegation for reals
1232 class TestRound:
1233 def __round__(self):
1234 return 23
1235
1236 class TestNoRound:
1237 pass
1238
1239 self.assertEqual(round(TestRound()), 23)
1240
1241 self.assertRaises(TypeError, round, 1, 2, 3)
1242 self.assertRaises(TypeError, round, TestNoRound())
1243
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001244 t = TestNoRound()
1245 t.__round__ = lambda *args: args
1246 self.assertRaises(TypeError, round, t)
1247 self.assertRaises(TypeError, round, t, 0)
1248
Mark Dickinsonad731b92009-11-09 17:12:30 +00001249 # Some versions of glibc for alpha have a bug that affects
1250 # float -> integer rounding (floor, ceil, rint, round) for
1251 # values in the range [2**52, 2**53). See:
1252 #
1253 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1254 #
1255 # We skip this test on Linux/alpha if it would fail.
1256 linux_alpha = (platform.system().startswith('Linux') and
1257 platform.machine().startswith('alpha'))
1258 system_round_bug = round(5e15+1) != 5e15+1
1259 @unittest.skipIf(linux_alpha and system_round_bug,
1260 "test will fail; failure is probably due to a "
1261 "buggy system round function")
1262 def test_round_large(self):
1263 # Issue #1869: integral floats should remain unchanged
1264 self.assertEqual(round(5e15-1), 5e15-1)
1265 self.assertEqual(round(5e15), 5e15)
1266 self.assertEqual(round(5e15+1), 5e15+1)
1267 self.assertEqual(round(5e15+2), 5e15+2)
1268 self.assertEqual(round(5e15+3), 5e15+3)
1269
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001270 def test_bug_27936(self):
1271 # Verify that ndigits=None means the same as passing in no argument
1272 for x in [1234,
1273 1234.56,
1274 decimal.Decimal('1234.56'),
1275 fractions.Fraction(123456, 100)]:
1276 self.assertEqual(round(x, None), round(x))
1277 self.assertEqual(type(round(x, None)), type(round(x)))
1278
Walter Dörwald919497e2003-01-19 16:23:59 +00001279 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001280 setattr(sys, 'spam', 1)
1281 self.assertEqual(sys.spam, 1)
1282 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1283 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001284
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001285 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001286
Alex Martellia70b1912003-04-22 08:12:33 +00001287 def test_sum(self):
1288 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001289 self.assertEqual(sum(list(range(2,8))), 27)
1290 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001291 self.assertEqual(sum(Squares(10)), 285)
1292 self.assertEqual(sum(iter(Squares(10))), 285)
1293 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1294
1295 self.assertRaises(TypeError, sum)
1296 self.assertRaises(TypeError, sum, 42)
1297 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1298 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001299 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1300 values = [bytearray(b'a'), bytearray(b'b')]
1301 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001302 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1303 self.assertRaises(TypeError, sum, [{2:3}])
1304 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1305
1306 class BadSeq:
1307 def __getitem__(self, index):
1308 raise ValueError
1309 self.assertRaises(ValueError, sum, BadSeq())
1310
Mark Dickinson3a22b472009-10-17 21:48:16 +00001311 empty = []
1312 sum(([x] for x in range(10)), empty)
1313 self.assertEqual(empty, [])
1314
Walter Dörwald919497e2003-01-19 16:23:59 +00001315 def test_type(self):
1316 self.assertEqual(type(''), type('123'))
1317 self.assertNotEqual(type(''), type(()))
1318
Guido van Rossumfee7b932005-01-16 00:21:28 +00001319 # We don't want self in vars(), so these are static methods
1320
1321 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001322 def get_vars_f0():
1323 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001324
Guido van Rossumfee7b932005-01-16 00:21:28 +00001325 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001326 def get_vars_f2():
1327 BuiltinTest.get_vars_f0()
1328 a = 1
1329 b = 2
1330 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001331
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001332 class C_get_vars(object):
1333 def getDict(self):
1334 return {'a':2}
1335 __dict__ = property(fget=getDict)
1336
Walter Dörwald919497e2003-01-19 16:23:59 +00001337 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001338 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001339 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001340 self.assertEqual(self.get_vars_f0(), {})
1341 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1342 self.assertRaises(TypeError, vars, 42, 42)
1343 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001344 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001345
1346 def test_zip(self):
1347 a = (1, 2, 3)
1348 b = (4, 5, 6)
1349 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001350 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001352 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001353 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001354 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001355 class I:
1356 def __getitem__(self, i):
1357 if i < 0 or i > 2: raise IndexError
1358 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001359 self.assertEqual(list(zip(a, I())), t)
1360 self.assertEqual(list(zip()), [])
1361 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001362 self.assertRaises(TypeError, zip, None)
1363 class G:
1364 pass
1365 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001366 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001367
1368 # Make sure zip doesn't try to allocate a billion elements for the
1369 # result list when one of its arguments doesn't say how long it is.
1370 # A MemoryError is the most likely failure mode.
1371 class SequenceWithoutALength:
1372 def __getitem__(self, i):
1373 if i == 5:
1374 raise IndexError
1375 else:
1376 return i
1377 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001378 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001379 list(enumerate(range(5)))
1380 )
1381
1382 class BadSeq:
1383 def __getitem__(self, i):
1384 if i == 5:
1385 raise ValueError
1386 else:
1387 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001388 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001389
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001390 def test_zip_pickle(self):
1391 a = (1, 2, 3)
1392 b = (4, 5, 6)
1393 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001394 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1395 z1 = zip(a, b)
1396 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001397
Eric Smithe4d63172010-09-13 20:48:43 +00001398 def test_format(self):
1399 # Test the basic machinery of the format() builtin. Don't test
1400 # the specifics of the various formatters
1401 self.assertEqual(format(3, ''), '3')
1402
1403 # Returns some classes to use for various tests. There's
1404 # an old-style version, and a new-style version
1405 def classes_new():
1406 class A(object):
1407 def __init__(self, x):
1408 self.x = x
1409 def __format__(self, format_spec):
1410 return str(self.x) + format_spec
1411 class DerivedFromA(A):
1412 pass
1413
1414 class Simple(object): pass
1415 class DerivedFromSimple(Simple):
1416 def __init__(self, x):
1417 self.x = x
1418 def __format__(self, format_spec):
1419 return str(self.x) + format_spec
1420 class DerivedFromSimple2(DerivedFromSimple): pass
1421 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1422
1423 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1424 self.assertEqual(format(A(3), 'spec'), '3spec')
1425 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1426 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1427 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1428 '10abcdef')
1429
1430 class_test(*classes_new())
1431
1432 def empty_format_spec(value):
1433 # test that:
1434 # format(x, '') == str(x)
1435 # format(x) == str(x)
1436 self.assertEqual(format(value, ""), str(value))
1437 self.assertEqual(format(value), str(value))
1438
1439 # for builtin types, format(x, "") == str(x)
1440 empty_format_spec(17**13)
1441 empty_format_spec(1.0)
1442 empty_format_spec(3.1415e104)
1443 empty_format_spec(-3.1415e104)
1444 empty_format_spec(3.1415e-104)
1445 empty_format_spec(-3.1415e-104)
1446 empty_format_spec(object)
1447 empty_format_spec(None)
1448
1449 # TypeError because self.__format__ returns the wrong type
1450 class BadFormatResult:
1451 def __format__(self, format_spec):
1452 return 1.0
1453 self.assertRaises(TypeError, format, BadFormatResult(), "")
1454
1455 # TypeError because format_spec is not unicode or str
1456 self.assertRaises(TypeError, format, object(), 4)
1457 self.assertRaises(TypeError, format, object(), object())
1458
1459 # tests for object.__format__ really belong elsewhere, but
1460 # there's no good place to put them
1461 x = object().__format__('')
1462 self.assertTrue(x.startswith('<object object at'))
1463
1464 # first argument to object.__format__ must be string
1465 self.assertRaises(TypeError, object().__format__, 3)
1466 self.assertRaises(TypeError, object().__format__, object())
1467 self.assertRaises(TypeError, object().__format__, None)
1468
1469 # --------------------------------------------------------------------
1470 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001471 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001472 class A:
1473 def __format__(self, fmt_str):
1474 return format('', fmt_str)
1475
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001476 self.assertEqual(format(A()), '')
1477 self.assertEqual(format(A(), ''), '')
1478 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001479
1480 class B:
1481 pass
1482
1483 class C(object):
1484 pass
1485
1486 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001487 obj = cls()
1488 self.assertEqual(format(obj), str(obj))
1489 self.assertEqual(format(obj, ''), str(obj))
1490 with self.assertRaisesRegex(TypeError,
1491 r'\b%s\b' % re.escape(cls.__name__)):
1492 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001493 # --------------------------------------------------------------------
1494
1495 # make sure we can take a subclass of str as a format spec
1496 class DerivedFromStr(str): pass
1497 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1498
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001499 def test_bin(self):
1500 self.assertEqual(bin(0), '0b0')
1501 self.assertEqual(bin(1), '0b1')
1502 self.assertEqual(bin(-1), '-0b1')
1503 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1504 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1505 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1506 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1507
Georg Brandl953152f2009-07-22 12:03:59 +00001508 def test_bytearray_translate(self):
1509 x = bytearray(b"abc")
1510 self.assertRaises(ValueError, x.translate, b"1", 1)
1511 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1512
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001513 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001514 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001515 tp = type(const)
1516 self.assertIs(tp(), const)
1517 self.assertRaises(TypeError, tp, 1, 2)
1518 self.assertRaises(TypeError, tp, a=1, b=2)
1519
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001520
1521class TestBreakpoint(unittest.TestCase):
1522 def setUp(self):
1523 # These tests require a clean slate environment. For example, if the
1524 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1525 # will mess up these tests. Similarly for sys.breakpointhook.
1526 # Cleaning the slate here means you can't use breakpoint() to debug
1527 # these tests, but I think that's okay. Just use pdb.set_trace() if
1528 # you must.
1529 self.resources = ExitStack()
1530 self.addCleanup(self.resources.close)
1531 self.env = self.resources.enter_context(EnvironmentVarGuard())
1532 del self.env['PYTHONBREAKPOINT']
1533 self.resources.enter_context(
1534 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1535
1536 def test_breakpoint(self):
1537 with patch('pdb.set_trace') as mock:
1538 breakpoint()
1539 mock.assert_called_once()
1540
1541 def test_breakpoint_with_breakpointhook_set(self):
1542 my_breakpointhook = MagicMock()
1543 sys.breakpointhook = my_breakpointhook
1544 breakpoint()
1545 my_breakpointhook.assert_called_once_with()
1546
1547 def test_breakpoint_with_breakpointhook_reset(self):
1548 my_breakpointhook = MagicMock()
1549 sys.breakpointhook = my_breakpointhook
1550 breakpoint()
1551 my_breakpointhook.assert_called_once_with()
1552 # Reset the hook and it will not be called again.
1553 sys.breakpointhook = sys.__breakpointhook__
1554 with patch('pdb.set_trace') as mock:
1555 breakpoint()
1556 mock.assert_called_once_with()
1557 my_breakpointhook.assert_called_once_with()
1558
1559 def test_breakpoint_with_args_and_keywords(self):
1560 my_breakpointhook = MagicMock()
1561 sys.breakpointhook = my_breakpointhook
1562 breakpoint(1, 2, 3, four=4, five=5)
1563 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1564
1565 def test_breakpoint_with_passthru_error(self):
1566 def my_breakpointhook():
1567 pass
1568 sys.breakpointhook = my_breakpointhook
1569 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1570
1571 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1572 def test_envar_good_path_builtin(self):
1573 self.env['PYTHONBREAKPOINT'] = 'int'
1574 with patch('builtins.int') as mock:
1575 breakpoint('7')
1576 mock.assert_called_once_with('7')
1577
1578 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1579 def test_envar_good_path_other(self):
1580 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1581 with patch('sys.exit') as mock:
1582 breakpoint()
1583 mock.assert_called_once_with()
1584
1585 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1586 def test_envar_good_path_noop_0(self):
1587 self.env['PYTHONBREAKPOINT'] = '0'
1588 with patch('pdb.set_trace') as mock:
1589 breakpoint()
1590 mock.assert_not_called()
1591
1592 def test_envar_good_path_empty_string(self):
1593 # PYTHONBREAKPOINT='' is the same as it not being set.
1594 self.env['PYTHONBREAKPOINT'] = ''
1595 with patch('pdb.set_trace') as mock:
1596 breakpoint()
1597 mock.assert_called_once_with()
1598
1599 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1600 def test_envar_unimportable(self):
1601 for envar in (
1602 '.', '..', '.foo', 'foo.', '.int', 'int.'
1603 'nosuchbuiltin',
1604 'nosuchmodule.nosuchcallable',
1605 ):
1606 with self.subTest(envar=envar):
1607 self.env['PYTHONBREAKPOINT'] = envar
1608 mock = self.resources.enter_context(patch('pdb.set_trace'))
1609 w = self.resources.enter_context(check_warnings(quiet=True))
1610 breakpoint()
1611 self.assertEqual(
1612 str(w.message),
1613 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1614 self.assertEqual(w.category, RuntimeWarning)
1615 mock.assert_not_called()
1616
1617 def test_envar_ignored_when_hook_is_set(self):
1618 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1619 with patch('sys.exit') as mock:
1620 sys.breakpointhook = int
1621 breakpoint()
1622 mock.assert_not_called()
1623
1624
Martin Panterc9a6ab52015-10-10 01:25:38 +00001625@unittest.skipUnless(pty, "the pty and signal modules must be available")
1626class PtyTests(unittest.TestCase):
1627 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1628 terminals in the test environment"""
1629
Martin Pantere44dba32015-10-10 05:27:15 +00001630 def run_child(self, child, terminal_input):
1631 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001632 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001633 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001634 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001635 os.close(r)
1636 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001637 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001638 raise
1639 if pid == 0:
1640 # Child
1641 try:
1642 # Make sure we don't get stuck if there's a problem
1643 signal.alarm(2)
1644 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001645 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001646 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001647 except:
1648 traceback.print_exc()
1649 finally:
1650 # We don't want to return to unittest...
1651 os._exit(0)
1652 # Parent
1653 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001654 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001655 # Get results from the pipe
1656 with open(r, "r") as rpipe:
1657 lines = []
1658 while True:
1659 line = rpipe.readline().strip()
1660 if line == "":
1661 # The other end was closed => the child exited
1662 break
1663 lines.append(line)
1664 # Check the result was got and corresponds to the user's terminal input
1665 if len(lines) != 2:
1666 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001667 # Beware of Linux raising EIO when the slave is closed
1668 child_output = bytearray()
1669 while True:
1670 try:
1671 chunk = os.read(fd, 3000)
1672 except OSError: # Assume EIO
1673 break
1674 if not chunk:
1675 break
1676 child_output.extend(chunk)
1677 os.close(fd)
1678 child_output = child_output.decode("ascii", "ignore")
1679 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1680 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001681 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001682
Victor Stinner3ca9f502017-08-09 23:08:22 +02001683 # Wait until the child process completes
1684 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001685
Martin Pantere44dba32015-10-10 05:27:15 +00001686 return lines
1687
1688 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1689 if not sys.stdin.isatty() or not sys.stdout.isatty():
1690 self.skipTest("stdin and stdout must be ttys")
1691 def child(wpipe):
1692 # Check the error handlers are accounted for
1693 if stdio_encoding:
1694 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1695 encoding=stdio_encoding,
1696 errors='surrogateescape')
1697 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1698 encoding=stdio_encoding,
1699 errors='replace')
1700 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1701 print(ascii(input(prompt)), file=wpipe)
1702 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001703 # Check we did exercise the GNU readline path
1704 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1705 if lines[0] != 'tty = True':
1706 self.skipTest("standard IO in should have been a tty")
1707 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1708 if stdio_encoding:
1709 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1710 else:
1711 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1712 self.assertEqual(input_result, expected)
1713
1714 def test_input_tty(self):
1715 # Test input() functionality when wired to a tty (the code path
1716 # is different and invokes GNU readline if available).
1717 self.check_input_tty("prompt", b"quux")
1718
1719 def test_input_tty_non_ascii(self):
1720 # Check stdin/stdout encoding is used when invoking GNU readline
1721 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1722
1723 def test_input_tty_non_ascii_unicode_errors(self):
1724 # Check stdin/stdout error handler is used when invoking GNU readline
1725 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1726
1727 def test_input_no_stdout_fileno(self):
1728 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1729 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001730 def child(wpipe):
1731 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1732 sys.stdout = io.StringIO() # Does not support fileno()
1733 input("prompt")
1734 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1735 lines = self.run_child(child, b"quux\r")
1736 expected = (
1737 "stdin.isatty(): True",
1738 "captured: 'prompt'",
1739 )
1740 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001741
Raymond Hettinger64958a12003-12-17 20:43:33 +00001742class TestSorted(unittest.TestCase):
1743
1744 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001745 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001746 copy = data[:]
1747 random.shuffle(copy)
1748 self.assertEqual(data, sorted(copy))
1749 self.assertNotEqual(data, copy)
1750
1751 data.reverse()
1752 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001753 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1754 self.assertNotEqual(data, copy)
1755 random.shuffle(copy)
1756 self.assertEqual(data, sorted(copy, reverse=1))
1757 self.assertNotEqual(data, copy)
1758
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001759 def test_bad_arguments(self):
1760 # Issue #29327: The first argument is positional-only.
1761 sorted([])
1762 with self.assertRaises(TypeError):
1763 sorted(iterable=[])
1764 # Other arguments are keyword-only
1765 sorted([], key=None)
1766 with self.assertRaises(TypeError):
1767 sorted([], None)
1768
Raymond Hettinger64958a12003-12-17 20:43:33 +00001769 def test_inputtypes(self):
1770 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001771 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001772 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001773 self.assertEqual(sorted(s), sorted(T(s)))
1774
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001775 s = ''.join(set(s)) # unique letters only
1776 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001777 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001778 self.assertEqual(sorted(s), sorted(T(s)))
1779
1780 def test_baddecorator(self):
1781 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1782 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1783
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001784
1785class ShutdownTest(unittest.TestCase):
1786
1787 def test_cleanup(self):
1788 # Issue #19255: builtins are still available at shutdown
1789 code = """if 1:
1790 import builtins
1791 import sys
1792
1793 class C:
1794 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001795 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001796 # Check that builtins still exist
1797 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001798 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001799
1800 c = C()
1801 # Make this module survive until builtins and sys are cleaned
1802 builtins.here = sys.modules[__name__]
1803 sys.here = sys.modules[__name__]
1804 # Create a reference loop so that this module needs to go
1805 # through a GC phase.
1806 here = sys.modules[__name__]
1807 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001808 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1809 # otherwise the codec may be unloaded before C.__del__() is called, and
1810 # so print("before") fails because the codec cannot be used to encode
1811 # "before" to sys.stdout.encoding. For example, on Windows,
1812 # sys.stdout.encoding is the OEM code page and these code pages are
1813 # implemented in Python
1814 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001815 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001816 self.assertEqual(["before", "after"], out.decode().splitlines())
1817
1818
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001819class TestType(unittest.TestCase):
1820 def test_new_type(self):
1821 A = type('A', (), {})
1822 self.assertEqual(A.__name__, 'A')
1823 self.assertEqual(A.__qualname__, 'A')
1824 self.assertEqual(A.__module__, __name__)
1825 self.assertEqual(A.__bases__, (object,))
1826 self.assertIs(A.__base__, object)
1827 x = A()
1828 self.assertIs(type(x), A)
1829 self.assertIs(x.__class__, A)
1830
1831 class B:
1832 def ham(self):
1833 return 'ham%d' % self
1834 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1835 self.assertEqual(C.__name__, 'C')
1836 self.assertEqual(C.__qualname__, 'C')
1837 self.assertEqual(C.__module__, __name__)
1838 self.assertEqual(C.__bases__, (B, int))
1839 self.assertIs(C.__base__, int)
1840 self.assertIn('spam', C.__dict__)
1841 self.assertNotIn('ham', C.__dict__)
1842 x = C(42)
1843 self.assertEqual(x, 42)
1844 self.assertIs(type(x), C)
1845 self.assertIs(x.__class__, C)
1846 self.assertEqual(x.ham(), 'ham42')
1847 self.assertEqual(x.spam(), 'spam42')
1848 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1849
Nick Coghland78448e2016-07-30 16:26:03 +10001850 def test_type_nokwargs(self):
1851 with self.assertRaises(TypeError):
1852 type('a', (), {}, x=5)
1853 with self.assertRaises(TypeError):
1854 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001855
1856 def test_type_name(self):
1857 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1858 with self.subTest(name=name):
1859 A = type(name, (), {})
1860 self.assertEqual(A.__name__, name)
1861 self.assertEqual(A.__qualname__, name)
1862 self.assertEqual(A.__module__, __name__)
1863 with self.assertRaises(ValueError):
1864 type('A\x00B', (), {})
1865 with self.assertRaises(ValueError):
1866 type('A\udcdcB', (), {})
1867 with self.assertRaises(TypeError):
1868 type(b'A', (), {})
1869
1870 C = type('C', (), {})
1871 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1872 with self.subTest(name=name):
1873 C.__name__ = name
1874 self.assertEqual(C.__name__, name)
1875 self.assertEqual(C.__qualname__, 'C')
1876 self.assertEqual(C.__module__, __name__)
1877
1878 A = type('C', (), {})
1879 with self.assertRaises(ValueError):
1880 A.__name__ = 'A\x00B'
1881 self.assertEqual(A.__name__, 'C')
1882 with self.assertRaises(ValueError):
1883 A.__name__ = 'A\udcdcB'
1884 self.assertEqual(A.__name__, 'C')
1885 with self.assertRaises(TypeError):
1886 A.__name__ = b'A'
1887 self.assertEqual(A.__name__, 'C')
1888
1889 def test_type_qualname(self):
1890 A = type('A', (), {'__qualname__': 'B.C'})
1891 self.assertEqual(A.__name__, 'A')
1892 self.assertEqual(A.__qualname__, 'B.C')
1893 self.assertEqual(A.__module__, __name__)
1894 with self.assertRaises(TypeError):
1895 type('A', (), {'__qualname__': b'B'})
1896 self.assertEqual(A.__qualname__, 'B.C')
1897
1898 A.__qualname__ = 'D.E'
1899 self.assertEqual(A.__name__, 'A')
1900 self.assertEqual(A.__qualname__, 'D.E')
1901 with self.assertRaises(TypeError):
1902 A.__qualname__ = b'B'
1903 self.assertEqual(A.__qualname__, 'D.E')
1904
1905 def test_type_doc(self):
1906 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1907 A = type('A', (), {'__doc__': doc})
1908 self.assertEqual(A.__doc__, doc)
1909 with self.assertRaises(UnicodeEncodeError):
1910 type('A', (), {'__doc__': 'x\udcdcy'})
1911
1912 A = type('A', (), {})
1913 self.assertEqual(A.__doc__, None)
1914 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1915 A.__doc__ = doc
1916 self.assertEqual(A.__doc__, doc)
1917
1918 def test_bad_args(self):
1919 with self.assertRaises(TypeError):
1920 type()
1921 with self.assertRaises(TypeError):
1922 type('A', ())
1923 with self.assertRaises(TypeError):
1924 type('A', (), {}, ())
1925 with self.assertRaises(TypeError):
1926 type('A', (), dict={})
1927 with self.assertRaises(TypeError):
1928 type('A', [], {})
1929 with self.assertRaises(TypeError):
1930 type('A', (), types.MappingProxyType({}))
1931 with self.assertRaises(TypeError):
1932 type('A', (None,), {})
1933 with self.assertRaises(TypeError):
1934 type('A', (bool,), {})
1935 with self.assertRaises(TypeError):
1936 type('A', (int, str), {})
1937
1938 def test_bad_slots(self):
1939 with self.assertRaises(TypeError):
1940 type('A', (), {'__slots__': b'x'})
1941 with self.assertRaises(TypeError):
1942 type('A', (int,), {'__slots__': 'x'})
1943 with self.assertRaises(TypeError):
1944 type('A', (), {'__slots__': ''})
1945 with self.assertRaises(TypeError):
1946 type('A', (), {'__slots__': '42'})
1947 with self.assertRaises(TypeError):
1948 type('A', (), {'__slots__': 'x\x00y'})
1949 with self.assertRaises(ValueError):
1950 type('A', (), {'__slots__': 'x', 'x': 0})
1951 with self.assertRaises(TypeError):
1952 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1953 with self.assertRaises(TypeError):
1954 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1955
1956 class B:
1957 pass
1958 with self.assertRaises(TypeError):
1959 type('A', (B,), {'__slots__': '__dict__'})
1960 with self.assertRaises(TypeError):
1961 type('A', (B,), {'__slots__': '__weakref__'})
1962
1963
Zachary Warea4b7a752013-11-24 01:19:09 -06001964def load_tests(loader, tests, pattern):
1965 from doctest import DocTestSuite
1966 tests.addTest(DocTestSuite(builtins))
1967 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001968
1969if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001970 unittest.main()