blob: 5674ea89b1c40820f96de15b503150d1e1da3b33 [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:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200340 return (True, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000341 else:
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200342 return (False, f.__doc__, debug_enabled, __debug__)
Georg Brandl8334fd92010-12-04 10:26:46 +0000343 '''
344 def f(): """doc"""
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200345 values = [(-1, __debug__, f.__doc__, __debug__, __debug__),
346 (0, True, 'doc', True, True),
347 (1, False, 'doc', False, False),
348 (2, False, None, False, False)]
349 for optval, *expected 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']()
Serhiy Storchaka3325a672017-12-15 12:35:48 +0200359 self.assertEqual(rv, tuple(expected))
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
Alexander Marshalove22072f2018-07-24 10:58:21 +0700908 self.assertEqual(max((1, 2), key=None), 2)
909
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000910 data = [random.randrange(200) for i in range(100)]
911 keys = dict((elem, random.randrange(50)) for elem in data)
912 f = keys.__getitem__
913 self.assertEqual(max(data, key=f),
914 sorted(reversed(data), key=f)[-1])
915
Walter Dörwald919497e2003-01-19 16:23:59 +0000916 def test_min(self):
917 self.assertEqual(min('123123'), '1')
918 self.assertEqual(min(1, 2, 3), 1)
919 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
920 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
921
Guido van Rossume2a383d2007-01-15 16:59:06 +0000922 self.assertEqual(min(1, 2, 3.0), 1)
923 self.assertEqual(min(1, 2.0, 3), 1)
924 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000925
926 self.assertRaises(TypeError, min)
927 self.assertRaises(TypeError, min, 42)
928 self.assertRaises(ValueError, min, ())
929 class BadSeq:
930 def __getitem__(self, index):
931 raise ValueError
932 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000933
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000934 for stmt in (
935 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700936 "min(default=None)",
937 "min(1, 2, default=None)", # require container for default
938 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000939 "min(1, key=int)", # single arg not iterable
940 "min(1, 2, keystone=int)", # wrong keyword
941 "min(1, 2, key=int, abc=int)", # two many keywords
942 "min(1, 2, key=1)", # keyfunc is not callable
943 ):
Tim Peters7f061872004-12-07 21:17:46 +0000944 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000945 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000946 except TypeError:
947 pass
948 else:
949 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000950
951 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
952 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
953 self.assertEqual(min(1, 2, key=neg), 2) # two elems
954
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700955 self.assertEqual(min((), default=None), None) # zero elem iterable
956 self.assertEqual(min((1,), default=None), 1) # one elem iterable
957 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
958
959 self.assertEqual(min((), default=1, key=neg), 1)
960 self.assertEqual(min((1, 2), default=1, key=neg), 2)
961
Alexander Marshalove22072f2018-07-24 10:58:21 +0700962 self.assertEqual(min((1, 2), key=None), 1)
963
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000964 data = [random.randrange(200) for i in range(100)]
965 keys = dict((elem, random.randrange(50)) for elem in data)
966 f = keys.__getitem__
967 self.assertEqual(min(data, key=f),
968 sorted(data, key=f)[0])
969
Georg Brandla18af4e2007-04-21 15:47:16 +0000970 def test_next(self):
971 it = iter(range(2))
972 self.assertEqual(next(it), 0)
973 self.assertEqual(next(it), 1)
974 self.assertRaises(StopIteration, next, it)
975 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000976 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000977
978 class Iter(object):
979 def __iter__(self):
980 return self
981 def __next__(self):
982 raise StopIteration
983
984 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000985 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000986 self.assertRaises(StopIteration, next, it)
987
988 def gen():
989 yield 1
990 return
991
992 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000993 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000994 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000995 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000996
Walter Dörwald919497e2003-01-19 16:23:59 +0000997 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000998 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000999 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 self.assertRaises(TypeError, oct, ())
1001
1002 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001003 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001004 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001005 self.addCleanup(unlink, TESTFN)
1006 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001007 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001008 fp.write('The quick brown fox jumps over the lazy dog')
1009 fp.write('.\n')
1010 fp.write('Dear John\n')
1011 fp.write('XXX'*100)
1012 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001013
1014 def test_open(self):
1015 self.write_testfile()
1016 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001017 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001018 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001019 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1020 self.assertEqual(fp.readline(4), 'Dear')
1021 self.assertEqual(fp.readline(100), ' John\n')
1022 self.assertEqual(fp.read(300), 'XXX'*100)
1023 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001024
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001025 # embedded null bytes and characters
1026 self.assertRaises(ValueError, open, 'a\x00b')
1027 self.assertRaises(ValueError, open, b'a\x00b')
1028
Victor Stinner91106cd2017-12-13 12:29:09 +01001029 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001030 def test_open_default_encoding(self):
1031 old_environ = dict(os.environ)
1032 try:
1033 # try to get a user preferred encoding different than the current
1034 # locale encoding to check that open() uses the current locale
1035 # encoding and not the user preferred encoding
1036 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1037 if key in os.environ:
1038 del os.environ[key]
1039
1040 self.write_testfile()
1041 current_locale_encoding = locale.getpreferredencoding(False)
1042 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001043 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001044 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001045 finally:
1046 os.environ.clear()
1047 os.environ.update(old_environ)
1048
Victor Stinnerdaf45552013-08-28 00:53:59 +02001049 def test_open_non_inheritable(self):
1050 fileobj = open(__file__)
1051 with fileobj:
1052 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1053
Walter Dörwald919497e2003-01-19 16:23:59 +00001054 def test_ord(self):
1055 self.assertEqual(ord(' '), 32)
1056 self.assertEqual(ord('A'), 65)
1057 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001058 self.assertEqual(ord('\x80'), 128)
1059 self.assertEqual(ord('\xff'), 255)
1060
1061 self.assertEqual(ord(b' '), 32)
1062 self.assertEqual(ord(b'A'), 65)
1063 self.assertEqual(ord(b'a'), 97)
1064 self.assertEqual(ord(b'\x80'), 128)
1065 self.assertEqual(ord(b'\xff'), 255)
1066
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001067 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001068 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001069
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001070 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1071 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1072 self.assertEqual(ord("\U00010000"), 0x00010000)
1073 self.assertEqual(ord("\U00010001"), 0x00010001)
1074 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1075 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1076 self.assertEqual(ord("\U00100000"), 0x00100000)
1077 self.assertEqual(ord("\U00100001"), 0x00100001)
1078 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1079 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1080
Walter Dörwald919497e2003-01-19 16:23:59 +00001081 def test_pow(self):
1082 self.assertEqual(pow(0,0), 1)
1083 self.assertEqual(pow(0,1), 0)
1084 self.assertEqual(pow(1,0), 1)
1085 self.assertEqual(pow(1,1), 1)
1086
1087 self.assertEqual(pow(2,0), 1)
1088 self.assertEqual(pow(2,10), 1024)
1089 self.assertEqual(pow(2,20), 1024*1024)
1090 self.assertEqual(pow(2,30), 1024*1024*1024)
1091
1092 self.assertEqual(pow(-2,0), 1)
1093 self.assertEqual(pow(-2,1), -2)
1094 self.assertEqual(pow(-2,2), 4)
1095 self.assertEqual(pow(-2,3), -8)
1096
Walter Dörwald919497e2003-01-19 16:23:59 +00001097 self.assertAlmostEqual(pow(0.,0), 1.)
1098 self.assertAlmostEqual(pow(0.,1), 0.)
1099 self.assertAlmostEqual(pow(1.,0), 1.)
1100 self.assertAlmostEqual(pow(1.,1), 1.)
1101
1102 self.assertAlmostEqual(pow(2.,0), 1.)
1103 self.assertAlmostEqual(pow(2.,10), 1024.)
1104 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1105 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1106
1107 self.assertAlmostEqual(pow(-2.,0), 1.)
1108 self.assertAlmostEqual(pow(-2.,1), -2.)
1109 self.assertAlmostEqual(pow(-2.,2), 4.)
1110 self.assertAlmostEqual(pow(-2.,3), -8.)
1111
Mark Dickinson5c2db372009-12-05 20:28:34 +00001112 for x in 2, 2.0:
1113 for y in 10, 10.0:
1114 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001115 if isinstance(x, float) or \
1116 isinstance(y, float) or \
1117 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001118 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001119 else:
1120 self.assertAlmostEqual(pow(x, y, z), 24.0)
1121
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001122 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1123 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1124
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001125 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001126 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001127
1128 self.assertRaises(TypeError, pow)
1129
Guido van Rossuma88a0332007-02-26 16:59:55 +00001130 def test_input(self):
1131 self.write_testfile()
1132 fp = open(TESTFN, 'r')
1133 savestdin = sys.stdin
1134 savestdout = sys.stdout # Eats the echo
1135 try:
1136 sys.stdin = fp
1137 sys.stdout = BitBucket()
1138 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001139 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1140 self.assertEqual(input('testing\n'), 'Dear John')
1141
1142 # SF 1535165: don't segfault on closed stdin
1143 # sys.stdout must be a regular file for triggering
1144 sys.stdout = savestdout
1145 sys.stdin.close()
1146 self.assertRaises(ValueError, input)
1147
1148 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001149 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001150 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001151 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001152 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001153 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001154 self.assertRaises(EOFError, input)
1155
1156 del sys.stdout
1157 self.assertRaises(RuntimeError, input, 'prompt')
1158 del sys.stdin
1159 self.assertRaises(RuntimeError, input, 'prompt')
1160 finally:
1161 sys.stdin = savestdin
1162 sys.stdout = savestdout
1163 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001164
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001165 # test_int(): see test_int.py for tests of built-in function int().
1166
Walter Dörwald919497e2003-01-19 16:23:59 +00001167 def test_repr(self):
1168 self.assertEqual(repr(''), '\'\'')
1169 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001170 self.assertEqual(repr(()), '()')
1171 self.assertEqual(repr([]), '[]')
1172 self.assertEqual(repr({}), '{}')
1173 a = []
1174 a.append(a)
1175 self.assertEqual(repr(a), '[[...]]')
1176 a = {}
1177 a[0] = a
1178 self.assertEqual(repr(a), '{0: {...}}')
1179
1180 def test_round(self):
1181 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001182 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001183 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(-1.0), -1.0)
1189 self.assertEqual(round(-10.0), -10.0)
1190 self.assertEqual(round(-1000000000.0), -1000000000.0)
1191 self.assertEqual(round(-1e20), -1e20)
1192
1193 self.assertEqual(round(0.1), 0.0)
1194 self.assertEqual(round(1.1), 1.0)
1195 self.assertEqual(round(10.1), 10.0)
1196 self.assertEqual(round(1000000000.1), 1000000000.0)
1197
1198 self.assertEqual(round(-1.1), -1.0)
1199 self.assertEqual(round(-10.1), -10.0)
1200 self.assertEqual(round(-1000000000.1), -1000000000.0)
1201
1202 self.assertEqual(round(0.9), 1.0)
1203 self.assertEqual(round(9.9), 10.0)
1204 self.assertEqual(round(999999999.9), 1000000000.0)
1205
1206 self.assertEqual(round(-0.9), -1.0)
1207 self.assertEqual(round(-9.9), -10.0)
1208 self.assertEqual(round(-999999999.9), -1000000000.0)
1209
1210 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001211 self.assertEqual(type(round(-8.0, -1)), float)
1212
1213 self.assertEqual(type(round(-8.0, 0)), float)
1214 self.assertEqual(type(round(-8.0, 1)), float)
1215
1216 # Check even / odd rounding behaviour
1217 self.assertEqual(round(5.5), 6)
1218 self.assertEqual(round(6.5), 6)
1219 self.assertEqual(round(-5.5), -6)
1220 self.assertEqual(round(-6.5), -6)
1221
1222 # Check behavior on ints
1223 self.assertEqual(round(0), 0)
1224 self.assertEqual(round(8), 8)
1225 self.assertEqual(round(-8), -8)
1226 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001227 self.assertEqual(type(round(-8, -1)), int)
1228 self.assertEqual(type(round(-8, 0)), int)
1229 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001230
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001231 # test new kwargs
1232 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1233
Walter Dörwald919497e2003-01-19 16:23:59 +00001234 self.assertRaises(TypeError, round)
1235
Alex Martelliae211f92007-08-22 23:21:33 +00001236 # test generic rounding delegation for reals
1237 class TestRound:
1238 def __round__(self):
1239 return 23
1240
1241 class TestNoRound:
1242 pass
1243
1244 self.assertEqual(round(TestRound()), 23)
1245
1246 self.assertRaises(TypeError, round, 1, 2, 3)
1247 self.assertRaises(TypeError, round, TestNoRound())
1248
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001249 t = TestNoRound()
1250 t.__round__ = lambda *args: args
1251 self.assertRaises(TypeError, round, t)
1252 self.assertRaises(TypeError, round, t, 0)
1253
Mark Dickinsonad731b92009-11-09 17:12:30 +00001254 # Some versions of glibc for alpha have a bug that affects
1255 # float -> integer rounding (floor, ceil, rint, round) for
1256 # values in the range [2**52, 2**53). See:
1257 #
1258 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1259 #
1260 # We skip this test on Linux/alpha if it would fail.
1261 linux_alpha = (platform.system().startswith('Linux') and
1262 platform.machine().startswith('alpha'))
1263 system_round_bug = round(5e15+1) != 5e15+1
1264 @unittest.skipIf(linux_alpha and system_round_bug,
1265 "test will fail; failure is probably due to a "
1266 "buggy system round function")
1267 def test_round_large(self):
1268 # Issue #1869: integral floats should remain unchanged
1269 self.assertEqual(round(5e15-1), 5e15-1)
1270 self.assertEqual(round(5e15), 5e15)
1271 self.assertEqual(round(5e15+1), 5e15+1)
1272 self.assertEqual(round(5e15+2), 5e15+2)
1273 self.assertEqual(round(5e15+3), 5e15+3)
1274
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001275 def test_bug_27936(self):
1276 # Verify that ndigits=None means the same as passing in no argument
1277 for x in [1234,
1278 1234.56,
1279 decimal.Decimal('1234.56'),
1280 fractions.Fraction(123456, 100)]:
1281 self.assertEqual(round(x, None), round(x))
1282 self.assertEqual(type(round(x, None)), type(round(x)))
1283
Walter Dörwald919497e2003-01-19 16:23:59 +00001284 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001285 setattr(sys, 'spam', 1)
1286 self.assertEqual(sys.spam, 1)
1287 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1288 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001289
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001290 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001291
Alex Martellia70b1912003-04-22 08:12:33 +00001292 def test_sum(self):
1293 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001294 self.assertEqual(sum(list(range(2,8))), 27)
1295 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001296 self.assertEqual(sum(Squares(10)), 285)
1297 self.assertEqual(sum(iter(Squares(10))), 285)
1298 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1299
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07001300 self.assertEqual(sum(range(10), 1000), 1045)
1301 self.assertEqual(sum(range(10), start=1000), 1045)
1302
Alex Martellia70b1912003-04-22 08:12:33 +00001303 self.assertRaises(TypeError, sum)
1304 self.assertRaises(TypeError, sum, 42)
1305 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1306 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001307 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1308 values = [bytearray(b'a'), bytearray(b'b')]
1309 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001310 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1311 self.assertRaises(TypeError, sum, [{2:3}])
1312 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1313
1314 class BadSeq:
1315 def __getitem__(self, index):
1316 raise ValueError
1317 self.assertRaises(ValueError, sum, BadSeq())
1318
Mark Dickinson3a22b472009-10-17 21:48:16 +00001319 empty = []
1320 sum(([x] for x in range(10)), empty)
1321 self.assertEqual(empty, [])
1322
Walter Dörwald919497e2003-01-19 16:23:59 +00001323 def test_type(self):
1324 self.assertEqual(type(''), type('123'))
1325 self.assertNotEqual(type(''), type(()))
1326
Guido van Rossumfee7b932005-01-16 00:21:28 +00001327 # We don't want self in vars(), so these are static methods
1328
1329 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001330 def get_vars_f0():
1331 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001332
Guido van Rossumfee7b932005-01-16 00:21:28 +00001333 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001334 def get_vars_f2():
1335 BuiltinTest.get_vars_f0()
1336 a = 1
1337 b = 2
1338 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001339
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001340 class C_get_vars(object):
1341 def getDict(self):
1342 return {'a':2}
1343 __dict__ = property(fget=getDict)
1344
Walter Dörwald919497e2003-01-19 16:23:59 +00001345 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001346 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001347 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001348 self.assertEqual(self.get_vars_f0(), {})
1349 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1350 self.assertRaises(TypeError, vars, 42, 42)
1351 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001352 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001353
1354 def test_zip(self):
1355 a = (1, 2, 3)
1356 b = (4, 5, 6)
1357 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001358 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001359 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001360 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001361 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001362 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001363 class I:
1364 def __getitem__(self, i):
1365 if i < 0 or i > 2: raise IndexError
1366 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001367 self.assertEqual(list(zip(a, I())), t)
1368 self.assertEqual(list(zip()), [])
1369 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001370 self.assertRaises(TypeError, zip, None)
1371 class G:
1372 pass
1373 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001374 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001375
1376 # Make sure zip doesn't try to allocate a billion elements for the
1377 # result list when one of its arguments doesn't say how long it is.
1378 # A MemoryError is the most likely failure mode.
1379 class SequenceWithoutALength:
1380 def __getitem__(self, i):
1381 if i == 5:
1382 raise IndexError
1383 else:
1384 return i
1385 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001386 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001387 list(enumerate(range(5)))
1388 )
1389
1390 class BadSeq:
1391 def __getitem__(self, i):
1392 if i == 5:
1393 raise ValueError
1394 else:
1395 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001396 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001397
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001398 def test_zip_pickle(self):
1399 a = (1, 2, 3)
1400 b = (4, 5, 6)
1401 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001402 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1403 z1 = zip(a, b)
1404 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001405
Eric Smithe4d63172010-09-13 20:48:43 +00001406 def test_format(self):
1407 # Test the basic machinery of the format() builtin. Don't test
1408 # the specifics of the various formatters
1409 self.assertEqual(format(3, ''), '3')
1410
1411 # Returns some classes to use for various tests. There's
1412 # an old-style version, and a new-style version
1413 def classes_new():
1414 class A(object):
1415 def __init__(self, x):
1416 self.x = x
1417 def __format__(self, format_spec):
1418 return str(self.x) + format_spec
1419 class DerivedFromA(A):
1420 pass
1421
1422 class Simple(object): pass
1423 class DerivedFromSimple(Simple):
1424 def __init__(self, x):
1425 self.x = x
1426 def __format__(self, format_spec):
1427 return str(self.x) + format_spec
1428 class DerivedFromSimple2(DerivedFromSimple): pass
1429 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1430
1431 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1432 self.assertEqual(format(A(3), 'spec'), '3spec')
1433 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1434 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1435 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1436 '10abcdef')
1437
1438 class_test(*classes_new())
1439
1440 def empty_format_spec(value):
1441 # test that:
1442 # format(x, '') == str(x)
1443 # format(x) == str(x)
1444 self.assertEqual(format(value, ""), str(value))
1445 self.assertEqual(format(value), str(value))
1446
1447 # for builtin types, format(x, "") == str(x)
1448 empty_format_spec(17**13)
1449 empty_format_spec(1.0)
1450 empty_format_spec(3.1415e104)
1451 empty_format_spec(-3.1415e104)
1452 empty_format_spec(3.1415e-104)
1453 empty_format_spec(-3.1415e-104)
1454 empty_format_spec(object)
1455 empty_format_spec(None)
1456
1457 # TypeError because self.__format__ returns the wrong type
1458 class BadFormatResult:
1459 def __format__(self, format_spec):
1460 return 1.0
1461 self.assertRaises(TypeError, format, BadFormatResult(), "")
1462
1463 # TypeError because format_spec is not unicode or str
1464 self.assertRaises(TypeError, format, object(), 4)
1465 self.assertRaises(TypeError, format, object(), object())
1466
1467 # tests for object.__format__ really belong elsewhere, but
1468 # there's no good place to put them
1469 x = object().__format__('')
1470 self.assertTrue(x.startswith('<object object at'))
1471
1472 # first argument to object.__format__ must be string
1473 self.assertRaises(TypeError, object().__format__, 3)
1474 self.assertRaises(TypeError, object().__format__, object())
1475 self.assertRaises(TypeError, object().__format__, None)
1476
1477 # --------------------------------------------------------------------
1478 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001479 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001480 class A:
1481 def __format__(self, fmt_str):
1482 return format('', fmt_str)
1483
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001484 self.assertEqual(format(A()), '')
1485 self.assertEqual(format(A(), ''), '')
1486 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001487
1488 class B:
1489 pass
1490
1491 class C(object):
1492 pass
1493
1494 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001495 obj = cls()
1496 self.assertEqual(format(obj), str(obj))
1497 self.assertEqual(format(obj, ''), str(obj))
1498 with self.assertRaisesRegex(TypeError,
1499 r'\b%s\b' % re.escape(cls.__name__)):
1500 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001501 # --------------------------------------------------------------------
1502
1503 # make sure we can take a subclass of str as a format spec
1504 class DerivedFromStr(str): pass
1505 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1506
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001507 def test_bin(self):
1508 self.assertEqual(bin(0), '0b0')
1509 self.assertEqual(bin(1), '0b1')
1510 self.assertEqual(bin(-1), '-0b1')
1511 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1512 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1513 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1514 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1515
Georg Brandl953152f2009-07-22 12:03:59 +00001516 def test_bytearray_translate(self):
1517 x = bytearray(b"abc")
1518 self.assertRaises(ValueError, x.translate, b"1", 1)
1519 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1520
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001521 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001522 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001523 tp = type(const)
1524 self.assertIs(tp(), const)
1525 self.assertRaises(TypeError, tp, 1, 2)
1526 self.assertRaises(TypeError, tp, a=1, b=2)
1527
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001528
1529class TestBreakpoint(unittest.TestCase):
1530 def setUp(self):
1531 # These tests require a clean slate environment. For example, if the
1532 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1533 # will mess up these tests. Similarly for sys.breakpointhook.
1534 # Cleaning the slate here means you can't use breakpoint() to debug
1535 # these tests, but I think that's okay. Just use pdb.set_trace() if
1536 # you must.
1537 self.resources = ExitStack()
1538 self.addCleanup(self.resources.close)
1539 self.env = self.resources.enter_context(EnvironmentVarGuard())
1540 del self.env['PYTHONBREAKPOINT']
1541 self.resources.enter_context(
1542 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1543
1544 def test_breakpoint(self):
1545 with patch('pdb.set_trace') as mock:
1546 breakpoint()
1547 mock.assert_called_once()
1548
1549 def test_breakpoint_with_breakpointhook_set(self):
1550 my_breakpointhook = MagicMock()
1551 sys.breakpointhook = my_breakpointhook
1552 breakpoint()
1553 my_breakpointhook.assert_called_once_with()
1554
1555 def test_breakpoint_with_breakpointhook_reset(self):
1556 my_breakpointhook = MagicMock()
1557 sys.breakpointhook = my_breakpointhook
1558 breakpoint()
1559 my_breakpointhook.assert_called_once_with()
1560 # Reset the hook and it will not be called again.
1561 sys.breakpointhook = sys.__breakpointhook__
1562 with patch('pdb.set_trace') as mock:
1563 breakpoint()
1564 mock.assert_called_once_with()
1565 my_breakpointhook.assert_called_once_with()
1566
1567 def test_breakpoint_with_args_and_keywords(self):
1568 my_breakpointhook = MagicMock()
1569 sys.breakpointhook = my_breakpointhook
1570 breakpoint(1, 2, 3, four=4, five=5)
1571 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1572
1573 def test_breakpoint_with_passthru_error(self):
1574 def my_breakpointhook():
1575 pass
1576 sys.breakpointhook = my_breakpointhook
1577 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1578
1579 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1580 def test_envar_good_path_builtin(self):
1581 self.env['PYTHONBREAKPOINT'] = 'int'
1582 with patch('builtins.int') as mock:
1583 breakpoint('7')
1584 mock.assert_called_once_with('7')
1585
1586 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1587 def test_envar_good_path_other(self):
1588 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1589 with patch('sys.exit') as mock:
1590 breakpoint()
1591 mock.assert_called_once_with()
1592
1593 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1594 def test_envar_good_path_noop_0(self):
1595 self.env['PYTHONBREAKPOINT'] = '0'
1596 with patch('pdb.set_trace') as mock:
1597 breakpoint()
1598 mock.assert_not_called()
1599
1600 def test_envar_good_path_empty_string(self):
1601 # PYTHONBREAKPOINT='' is the same as it not being set.
1602 self.env['PYTHONBREAKPOINT'] = ''
1603 with patch('pdb.set_trace') as mock:
1604 breakpoint()
1605 mock.assert_called_once_with()
1606
1607 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1608 def test_envar_unimportable(self):
1609 for envar in (
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001610 '.', '..', '.foo', 'foo.', '.int', 'int.',
Serhiy Storchaka3607ef42019-01-15 13:26:38 +02001611 '.foo.bar', '..foo.bar', '/./',
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001612 'nosuchbuiltin',
1613 'nosuchmodule.nosuchcallable',
1614 ):
1615 with self.subTest(envar=envar):
1616 self.env['PYTHONBREAKPOINT'] = envar
1617 mock = self.resources.enter_context(patch('pdb.set_trace'))
1618 w = self.resources.enter_context(check_warnings(quiet=True))
1619 breakpoint()
1620 self.assertEqual(
1621 str(w.message),
1622 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1623 self.assertEqual(w.category, RuntimeWarning)
1624 mock.assert_not_called()
1625
1626 def test_envar_ignored_when_hook_is_set(self):
1627 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1628 with patch('sys.exit') as mock:
1629 sys.breakpointhook = int
1630 breakpoint()
1631 mock.assert_not_called()
1632
1633
Martin Panterc9a6ab52015-10-10 01:25:38 +00001634@unittest.skipUnless(pty, "the pty and signal modules must be available")
1635class PtyTests(unittest.TestCase):
1636 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1637 terminals in the test environment"""
1638
Martin Pantere44dba32015-10-10 05:27:15 +00001639 def run_child(self, child, terminal_input):
1640 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001641 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001642 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001643 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001644 os.close(r)
1645 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001646 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001647 raise
1648 if pid == 0:
1649 # Child
1650 try:
1651 # Make sure we don't get stuck if there's a problem
1652 signal.alarm(2)
1653 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001654 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001655 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001656 except:
1657 traceback.print_exc()
1658 finally:
1659 # We don't want to return to unittest...
1660 os._exit(0)
1661 # Parent
1662 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001663 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001664 # Get results from the pipe
1665 with open(r, "r") as rpipe:
1666 lines = []
1667 while True:
1668 line = rpipe.readline().strip()
1669 if line == "":
1670 # The other end was closed => the child exited
1671 break
1672 lines.append(line)
1673 # Check the result was got and corresponds to the user's terminal input
1674 if len(lines) != 2:
1675 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001676 # Beware of Linux raising EIO when the slave is closed
1677 child_output = bytearray()
1678 while True:
1679 try:
1680 chunk = os.read(fd, 3000)
1681 except OSError: # Assume EIO
1682 break
1683 if not chunk:
1684 break
1685 child_output.extend(chunk)
1686 os.close(fd)
1687 child_output = child_output.decode("ascii", "ignore")
1688 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1689 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001690 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001691
Victor Stinner3ca9f502017-08-09 23:08:22 +02001692 # Wait until the child process completes
1693 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001694
Martin Pantere44dba32015-10-10 05:27:15 +00001695 return lines
1696
1697 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1698 if not sys.stdin.isatty() or not sys.stdout.isatty():
1699 self.skipTest("stdin and stdout must be ttys")
1700 def child(wpipe):
1701 # Check the error handlers are accounted for
1702 if stdio_encoding:
1703 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1704 encoding=stdio_encoding,
1705 errors='surrogateescape')
1706 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1707 encoding=stdio_encoding,
1708 errors='replace')
1709 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1710 print(ascii(input(prompt)), file=wpipe)
1711 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001712 # Check we did exercise the GNU readline path
1713 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1714 if lines[0] != 'tty = True':
1715 self.skipTest("standard IO in should have been a tty")
1716 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1717 if stdio_encoding:
1718 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1719 else:
1720 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1721 self.assertEqual(input_result, expected)
1722
1723 def test_input_tty(self):
1724 # Test input() functionality when wired to a tty (the code path
1725 # is different and invokes GNU readline if available).
1726 self.check_input_tty("prompt", b"quux")
1727
1728 def test_input_tty_non_ascii(self):
1729 # Check stdin/stdout encoding is used when invoking GNU readline
1730 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1731
1732 def test_input_tty_non_ascii_unicode_errors(self):
1733 # Check stdin/stdout error handler is used when invoking GNU readline
1734 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1735
1736 def test_input_no_stdout_fileno(self):
1737 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1738 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001739 def child(wpipe):
1740 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1741 sys.stdout = io.StringIO() # Does not support fileno()
1742 input("prompt")
1743 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1744 lines = self.run_child(child, b"quux\r")
1745 expected = (
1746 "stdin.isatty(): True",
1747 "captured: 'prompt'",
1748 )
1749 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001750
Raymond Hettinger64958a12003-12-17 20:43:33 +00001751class TestSorted(unittest.TestCase):
1752
1753 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001754 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001755 copy = data[:]
1756 random.shuffle(copy)
1757 self.assertEqual(data, sorted(copy))
1758 self.assertNotEqual(data, copy)
1759
1760 data.reverse()
1761 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001762 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1763 self.assertNotEqual(data, copy)
1764 random.shuffle(copy)
1765 self.assertEqual(data, sorted(copy, reverse=1))
1766 self.assertNotEqual(data, copy)
1767
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001768 def test_bad_arguments(self):
1769 # Issue #29327: The first argument is positional-only.
1770 sorted([])
1771 with self.assertRaises(TypeError):
1772 sorted(iterable=[])
1773 # Other arguments are keyword-only
1774 sorted([], key=None)
1775 with self.assertRaises(TypeError):
1776 sorted([], None)
1777
Raymond Hettinger64958a12003-12-17 20:43:33 +00001778 def test_inputtypes(self):
1779 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001780 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001781 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001782 self.assertEqual(sorted(s), sorted(T(s)))
1783
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001784 s = ''.join(set(s)) # unique letters only
1785 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001786 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001787 self.assertEqual(sorted(s), sorted(T(s)))
1788
1789 def test_baddecorator(self):
1790 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1791 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1792
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001793
1794class ShutdownTest(unittest.TestCase):
1795
1796 def test_cleanup(self):
1797 # Issue #19255: builtins are still available at shutdown
1798 code = """if 1:
1799 import builtins
1800 import sys
1801
1802 class C:
1803 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001804 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001805 # Check that builtins still exist
1806 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001807 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001808
1809 c = C()
1810 # Make this module survive until builtins and sys are cleaned
1811 builtins.here = sys.modules[__name__]
1812 sys.here = sys.modules[__name__]
1813 # Create a reference loop so that this module needs to go
1814 # through a GC phase.
1815 here = sys.modules[__name__]
1816 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001817 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1818 # otherwise the codec may be unloaded before C.__del__() is called, and
1819 # so print("before") fails because the codec cannot be used to encode
1820 # "before" to sys.stdout.encoding. For example, on Windows,
1821 # sys.stdout.encoding is the OEM code page and these code pages are
1822 # implemented in Python
1823 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001824 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001825 self.assertEqual(["before", "after"], out.decode().splitlines())
1826
1827
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001828class TestType(unittest.TestCase):
1829 def test_new_type(self):
1830 A = type('A', (), {})
1831 self.assertEqual(A.__name__, 'A')
1832 self.assertEqual(A.__qualname__, 'A')
1833 self.assertEqual(A.__module__, __name__)
1834 self.assertEqual(A.__bases__, (object,))
1835 self.assertIs(A.__base__, object)
1836 x = A()
1837 self.assertIs(type(x), A)
1838 self.assertIs(x.__class__, A)
1839
1840 class B:
1841 def ham(self):
1842 return 'ham%d' % self
1843 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1844 self.assertEqual(C.__name__, 'C')
1845 self.assertEqual(C.__qualname__, 'C')
1846 self.assertEqual(C.__module__, __name__)
1847 self.assertEqual(C.__bases__, (B, int))
1848 self.assertIs(C.__base__, int)
1849 self.assertIn('spam', C.__dict__)
1850 self.assertNotIn('ham', C.__dict__)
1851 x = C(42)
1852 self.assertEqual(x, 42)
1853 self.assertIs(type(x), C)
1854 self.assertIs(x.__class__, C)
1855 self.assertEqual(x.ham(), 'ham42')
1856 self.assertEqual(x.spam(), 'spam42')
1857 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1858
Nick Coghland78448e2016-07-30 16:26:03 +10001859 def test_type_nokwargs(self):
1860 with self.assertRaises(TypeError):
1861 type('a', (), {}, x=5)
1862 with self.assertRaises(TypeError):
1863 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001864
1865 def test_type_name(self):
1866 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1867 with self.subTest(name=name):
1868 A = type(name, (), {})
1869 self.assertEqual(A.__name__, name)
1870 self.assertEqual(A.__qualname__, name)
1871 self.assertEqual(A.__module__, __name__)
1872 with self.assertRaises(ValueError):
1873 type('A\x00B', (), {})
1874 with self.assertRaises(ValueError):
1875 type('A\udcdcB', (), {})
1876 with self.assertRaises(TypeError):
1877 type(b'A', (), {})
1878
1879 C = type('C', (), {})
1880 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1881 with self.subTest(name=name):
1882 C.__name__ = name
1883 self.assertEqual(C.__name__, name)
1884 self.assertEqual(C.__qualname__, 'C')
1885 self.assertEqual(C.__module__, __name__)
1886
1887 A = type('C', (), {})
1888 with self.assertRaises(ValueError):
1889 A.__name__ = 'A\x00B'
1890 self.assertEqual(A.__name__, 'C')
1891 with self.assertRaises(ValueError):
1892 A.__name__ = 'A\udcdcB'
1893 self.assertEqual(A.__name__, 'C')
1894 with self.assertRaises(TypeError):
1895 A.__name__ = b'A'
1896 self.assertEqual(A.__name__, 'C')
1897
1898 def test_type_qualname(self):
1899 A = type('A', (), {'__qualname__': 'B.C'})
1900 self.assertEqual(A.__name__, 'A')
1901 self.assertEqual(A.__qualname__, 'B.C')
1902 self.assertEqual(A.__module__, __name__)
1903 with self.assertRaises(TypeError):
1904 type('A', (), {'__qualname__': b'B'})
1905 self.assertEqual(A.__qualname__, 'B.C')
1906
1907 A.__qualname__ = 'D.E'
1908 self.assertEqual(A.__name__, 'A')
1909 self.assertEqual(A.__qualname__, 'D.E')
1910 with self.assertRaises(TypeError):
1911 A.__qualname__ = b'B'
1912 self.assertEqual(A.__qualname__, 'D.E')
1913
1914 def test_type_doc(self):
1915 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1916 A = type('A', (), {'__doc__': doc})
1917 self.assertEqual(A.__doc__, doc)
1918 with self.assertRaises(UnicodeEncodeError):
1919 type('A', (), {'__doc__': 'x\udcdcy'})
1920
1921 A = type('A', (), {})
1922 self.assertEqual(A.__doc__, None)
1923 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1924 A.__doc__ = doc
1925 self.assertEqual(A.__doc__, doc)
1926
1927 def test_bad_args(self):
1928 with self.assertRaises(TypeError):
1929 type()
1930 with self.assertRaises(TypeError):
1931 type('A', ())
1932 with self.assertRaises(TypeError):
1933 type('A', (), {}, ())
1934 with self.assertRaises(TypeError):
1935 type('A', (), dict={})
1936 with self.assertRaises(TypeError):
1937 type('A', [], {})
1938 with self.assertRaises(TypeError):
1939 type('A', (), types.MappingProxyType({}))
1940 with self.assertRaises(TypeError):
1941 type('A', (None,), {})
1942 with self.assertRaises(TypeError):
1943 type('A', (bool,), {})
1944 with self.assertRaises(TypeError):
1945 type('A', (int, str), {})
1946
1947 def test_bad_slots(self):
1948 with self.assertRaises(TypeError):
1949 type('A', (), {'__slots__': b'x'})
1950 with self.assertRaises(TypeError):
1951 type('A', (int,), {'__slots__': 'x'})
1952 with self.assertRaises(TypeError):
1953 type('A', (), {'__slots__': ''})
1954 with self.assertRaises(TypeError):
1955 type('A', (), {'__slots__': '42'})
1956 with self.assertRaises(TypeError):
1957 type('A', (), {'__slots__': 'x\x00y'})
1958 with self.assertRaises(ValueError):
1959 type('A', (), {'__slots__': 'x', 'x': 0})
1960 with self.assertRaises(TypeError):
1961 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1962 with self.assertRaises(TypeError):
1963 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1964
1965 class B:
1966 pass
1967 with self.assertRaises(TypeError):
1968 type('A', (B,), {'__slots__': '__dict__'})
1969 with self.assertRaises(TypeError):
1970 type('A', (B,), {'__slots__': '__weakref__'})
1971
INADA Naoki2aaf98c2018-09-26 12:59:00 +09001972 def test_namespace_order(self):
1973 # bpo-34320: namespace should preserve order
1974 od = collections.OrderedDict([('a', 1), ('b', 2)])
1975 od.move_to_end('a')
1976 expected = list(od.items())
1977
1978 C = type('C', (), od)
1979 self.assertEqual(list(C.__dict__.items())[:2], [('b', 2), ('a', 1)])
1980
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001981
Zachary Warea4b7a752013-11-24 01:19:09 -06001982def load_tests(loader, tests, pattern):
1983 from doctest import DocTestSuite
1984 tests.addTest(DocTestSuite(builtins))
1985 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001986
1987if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001988 unittest.main()