blob: 233c579356530ca94793d507210cae644160b0d3 [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
1300 self.assertRaises(TypeError, sum)
1301 self.assertRaises(TypeError, sum, 42)
1302 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1303 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001304 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1305 values = [bytearray(b'a'), bytearray(b'b')]
1306 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001307 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1308 self.assertRaises(TypeError, sum, [{2:3}])
1309 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1310
1311 class BadSeq:
1312 def __getitem__(self, index):
1313 raise ValueError
1314 self.assertRaises(ValueError, sum, BadSeq())
1315
Mark Dickinson3a22b472009-10-17 21:48:16 +00001316 empty = []
1317 sum(([x] for x in range(10)), empty)
1318 self.assertEqual(empty, [])
1319
Walter Dörwald919497e2003-01-19 16:23:59 +00001320 def test_type(self):
1321 self.assertEqual(type(''), type('123'))
1322 self.assertNotEqual(type(''), type(()))
1323
Guido van Rossumfee7b932005-01-16 00:21:28 +00001324 # We don't want self in vars(), so these are static methods
1325
1326 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001327 def get_vars_f0():
1328 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001329
Guido van Rossumfee7b932005-01-16 00:21:28 +00001330 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001331 def get_vars_f2():
1332 BuiltinTest.get_vars_f0()
1333 a = 1
1334 b = 2
1335 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001336
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001337 class C_get_vars(object):
1338 def getDict(self):
1339 return {'a':2}
1340 __dict__ = property(fget=getDict)
1341
Walter Dörwald919497e2003-01-19 16:23:59 +00001342 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001343 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001344 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001345 self.assertEqual(self.get_vars_f0(), {})
1346 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1347 self.assertRaises(TypeError, vars, 42, 42)
1348 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001349 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001350
1351 def test_zip(self):
1352 a = (1, 2, 3)
1353 b = (4, 5, 6)
1354 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001355 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001356 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001357 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001358 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001359 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001360 class I:
1361 def __getitem__(self, i):
1362 if i < 0 or i > 2: raise IndexError
1363 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001364 self.assertEqual(list(zip(a, I())), t)
1365 self.assertEqual(list(zip()), [])
1366 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001367 self.assertRaises(TypeError, zip, None)
1368 class G:
1369 pass
1370 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001371 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001372
1373 # Make sure zip doesn't try to allocate a billion elements for the
1374 # result list when one of its arguments doesn't say how long it is.
1375 # A MemoryError is the most likely failure mode.
1376 class SequenceWithoutALength:
1377 def __getitem__(self, i):
1378 if i == 5:
1379 raise IndexError
1380 else:
1381 return i
1382 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001383 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001384 list(enumerate(range(5)))
1385 )
1386
1387 class BadSeq:
1388 def __getitem__(self, i):
1389 if i == 5:
1390 raise ValueError
1391 else:
1392 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001393 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001394
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001395 def test_zip_pickle(self):
1396 a = (1, 2, 3)
1397 b = (4, 5, 6)
1398 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001399 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1400 z1 = zip(a, b)
1401 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001402
Eric Smithe4d63172010-09-13 20:48:43 +00001403 def test_format(self):
1404 # Test the basic machinery of the format() builtin. Don't test
1405 # the specifics of the various formatters
1406 self.assertEqual(format(3, ''), '3')
1407
1408 # Returns some classes to use for various tests. There's
1409 # an old-style version, and a new-style version
1410 def classes_new():
1411 class A(object):
1412 def __init__(self, x):
1413 self.x = x
1414 def __format__(self, format_spec):
1415 return str(self.x) + format_spec
1416 class DerivedFromA(A):
1417 pass
1418
1419 class Simple(object): pass
1420 class DerivedFromSimple(Simple):
1421 def __init__(self, x):
1422 self.x = x
1423 def __format__(self, format_spec):
1424 return str(self.x) + format_spec
1425 class DerivedFromSimple2(DerivedFromSimple): pass
1426 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1427
1428 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1429 self.assertEqual(format(A(3), 'spec'), '3spec')
1430 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1431 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1432 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1433 '10abcdef')
1434
1435 class_test(*classes_new())
1436
1437 def empty_format_spec(value):
1438 # test that:
1439 # format(x, '') == str(x)
1440 # format(x) == str(x)
1441 self.assertEqual(format(value, ""), str(value))
1442 self.assertEqual(format(value), str(value))
1443
1444 # for builtin types, format(x, "") == str(x)
1445 empty_format_spec(17**13)
1446 empty_format_spec(1.0)
1447 empty_format_spec(3.1415e104)
1448 empty_format_spec(-3.1415e104)
1449 empty_format_spec(3.1415e-104)
1450 empty_format_spec(-3.1415e-104)
1451 empty_format_spec(object)
1452 empty_format_spec(None)
1453
1454 # TypeError because self.__format__ returns the wrong type
1455 class BadFormatResult:
1456 def __format__(self, format_spec):
1457 return 1.0
1458 self.assertRaises(TypeError, format, BadFormatResult(), "")
1459
1460 # TypeError because format_spec is not unicode or str
1461 self.assertRaises(TypeError, format, object(), 4)
1462 self.assertRaises(TypeError, format, object(), object())
1463
1464 # tests for object.__format__ really belong elsewhere, but
1465 # there's no good place to put them
1466 x = object().__format__('')
1467 self.assertTrue(x.startswith('<object object at'))
1468
1469 # first argument to object.__format__ must be string
1470 self.assertRaises(TypeError, object().__format__, 3)
1471 self.assertRaises(TypeError, object().__format__, object())
1472 self.assertRaises(TypeError, object().__format__, None)
1473
1474 # --------------------------------------------------------------------
1475 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001476 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001477 class A:
1478 def __format__(self, fmt_str):
1479 return format('', fmt_str)
1480
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001481 self.assertEqual(format(A()), '')
1482 self.assertEqual(format(A(), ''), '')
1483 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001484
1485 class B:
1486 pass
1487
1488 class C(object):
1489 pass
1490
1491 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001492 obj = cls()
1493 self.assertEqual(format(obj), str(obj))
1494 self.assertEqual(format(obj, ''), str(obj))
1495 with self.assertRaisesRegex(TypeError,
1496 r'\b%s\b' % re.escape(cls.__name__)):
1497 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001498 # --------------------------------------------------------------------
1499
1500 # make sure we can take a subclass of str as a format spec
1501 class DerivedFromStr(str): pass
1502 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1503
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001504 def test_bin(self):
1505 self.assertEqual(bin(0), '0b0')
1506 self.assertEqual(bin(1), '0b1')
1507 self.assertEqual(bin(-1), '-0b1')
1508 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1509 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1510 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1511 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1512
Georg Brandl953152f2009-07-22 12:03:59 +00001513 def test_bytearray_translate(self):
1514 x = bytearray(b"abc")
1515 self.assertRaises(ValueError, x.translate, b"1", 1)
1516 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1517
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001518 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001519 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001520 tp = type(const)
1521 self.assertIs(tp(), const)
1522 self.assertRaises(TypeError, tp, 1, 2)
1523 self.assertRaises(TypeError, tp, a=1, b=2)
1524
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001525
1526class TestBreakpoint(unittest.TestCase):
1527 def setUp(self):
1528 # These tests require a clean slate environment. For example, if the
1529 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1530 # will mess up these tests. Similarly for sys.breakpointhook.
1531 # Cleaning the slate here means you can't use breakpoint() to debug
1532 # these tests, but I think that's okay. Just use pdb.set_trace() if
1533 # you must.
1534 self.resources = ExitStack()
1535 self.addCleanup(self.resources.close)
1536 self.env = self.resources.enter_context(EnvironmentVarGuard())
1537 del self.env['PYTHONBREAKPOINT']
1538 self.resources.enter_context(
1539 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1540
1541 def test_breakpoint(self):
1542 with patch('pdb.set_trace') as mock:
1543 breakpoint()
1544 mock.assert_called_once()
1545
1546 def test_breakpoint_with_breakpointhook_set(self):
1547 my_breakpointhook = MagicMock()
1548 sys.breakpointhook = my_breakpointhook
1549 breakpoint()
1550 my_breakpointhook.assert_called_once_with()
1551
1552 def test_breakpoint_with_breakpointhook_reset(self):
1553 my_breakpointhook = MagicMock()
1554 sys.breakpointhook = my_breakpointhook
1555 breakpoint()
1556 my_breakpointhook.assert_called_once_with()
1557 # Reset the hook and it will not be called again.
1558 sys.breakpointhook = sys.__breakpointhook__
1559 with patch('pdb.set_trace') as mock:
1560 breakpoint()
1561 mock.assert_called_once_with()
1562 my_breakpointhook.assert_called_once_with()
1563
1564 def test_breakpoint_with_args_and_keywords(self):
1565 my_breakpointhook = MagicMock()
1566 sys.breakpointhook = my_breakpointhook
1567 breakpoint(1, 2, 3, four=4, five=5)
1568 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1569
1570 def test_breakpoint_with_passthru_error(self):
1571 def my_breakpointhook():
1572 pass
1573 sys.breakpointhook = my_breakpointhook
1574 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1575
1576 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1577 def test_envar_good_path_builtin(self):
1578 self.env['PYTHONBREAKPOINT'] = 'int'
1579 with patch('builtins.int') as mock:
1580 breakpoint('7')
1581 mock.assert_called_once_with('7')
1582
1583 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1584 def test_envar_good_path_other(self):
1585 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1586 with patch('sys.exit') as mock:
1587 breakpoint()
1588 mock.assert_called_once_with()
1589
1590 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1591 def test_envar_good_path_noop_0(self):
1592 self.env['PYTHONBREAKPOINT'] = '0'
1593 with patch('pdb.set_trace') as mock:
1594 breakpoint()
1595 mock.assert_not_called()
1596
1597 def test_envar_good_path_empty_string(self):
1598 # PYTHONBREAKPOINT='' is the same as it not being set.
1599 self.env['PYTHONBREAKPOINT'] = ''
1600 with patch('pdb.set_trace') as mock:
1601 breakpoint()
1602 mock.assert_called_once_with()
1603
1604 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1605 def test_envar_unimportable(self):
1606 for envar in (
1607 '.', '..', '.foo', 'foo.', '.int', 'int.'
1608 'nosuchbuiltin',
1609 'nosuchmodule.nosuchcallable',
1610 ):
1611 with self.subTest(envar=envar):
1612 self.env['PYTHONBREAKPOINT'] = envar
1613 mock = self.resources.enter_context(patch('pdb.set_trace'))
1614 w = self.resources.enter_context(check_warnings(quiet=True))
1615 breakpoint()
1616 self.assertEqual(
1617 str(w.message),
1618 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1619 self.assertEqual(w.category, RuntimeWarning)
1620 mock.assert_not_called()
1621
1622 def test_envar_ignored_when_hook_is_set(self):
1623 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1624 with patch('sys.exit') as mock:
1625 sys.breakpointhook = int
1626 breakpoint()
1627 mock.assert_not_called()
1628
1629
Martin Panterc9a6ab52015-10-10 01:25:38 +00001630@unittest.skipUnless(pty, "the pty and signal modules must be available")
1631class PtyTests(unittest.TestCase):
1632 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1633 terminals in the test environment"""
1634
Martin Pantere44dba32015-10-10 05:27:15 +00001635 def run_child(self, child, terminal_input):
1636 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001637 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001638 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001639 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001640 os.close(r)
1641 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001642 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001643 raise
1644 if pid == 0:
1645 # Child
1646 try:
1647 # Make sure we don't get stuck if there's a problem
1648 signal.alarm(2)
1649 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001650 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001651 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001652 except:
1653 traceback.print_exc()
1654 finally:
1655 # We don't want to return to unittest...
1656 os._exit(0)
1657 # Parent
1658 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001659 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001660 # Get results from the pipe
1661 with open(r, "r") as rpipe:
1662 lines = []
1663 while True:
1664 line = rpipe.readline().strip()
1665 if line == "":
1666 # The other end was closed => the child exited
1667 break
1668 lines.append(line)
1669 # Check the result was got and corresponds to the user's terminal input
1670 if len(lines) != 2:
1671 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001672 # Beware of Linux raising EIO when the slave is closed
1673 child_output = bytearray()
1674 while True:
1675 try:
1676 chunk = os.read(fd, 3000)
1677 except OSError: # Assume EIO
1678 break
1679 if not chunk:
1680 break
1681 child_output.extend(chunk)
1682 os.close(fd)
1683 child_output = child_output.decode("ascii", "ignore")
1684 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1685 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001686 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001687
Victor Stinner3ca9f502017-08-09 23:08:22 +02001688 # Wait until the child process completes
1689 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001690
Martin Pantere44dba32015-10-10 05:27:15 +00001691 return lines
1692
1693 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1694 if not sys.stdin.isatty() or not sys.stdout.isatty():
1695 self.skipTest("stdin and stdout must be ttys")
1696 def child(wpipe):
1697 # Check the error handlers are accounted for
1698 if stdio_encoding:
1699 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1700 encoding=stdio_encoding,
1701 errors='surrogateescape')
1702 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1703 encoding=stdio_encoding,
1704 errors='replace')
1705 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1706 print(ascii(input(prompt)), file=wpipe)
1707 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001708 # Check we did exercise the GNU readline path
1709 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1710 if lines[0] != 'tty = True':
1711 self.skipTest("standard IO in should have been a tty")
1712 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1713 if stdio_encoding:
1714 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1715 else:
1716 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1717 self.assertEqual(input_result, expected)
1718
1719 def test_input_tty(self):
1720 # Test input() functionality when wired to a tty (the code path
1721 # is different and invokes GNU readline if available).
1722 self.check_input_tty("prompt", b"quux")
1723
1724 def test_input_tty_non_ascii(self):
1725 # Check stdin/stdout encoding is used when invoking GNU readline
1726 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1727
1728 def test_input_tty_non_ascii_unicode_errors(self):
1729 # Check stdin/stdout error handler is used when invoking GNU readline
1730 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1731
1732 def test_input_no_stdout_fileno(self):
1733 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1734 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001735 def child(wpipe):
1736 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1737 sys.stdout = io.StringIO() # Does not support fileno()
1738 input("prompt")
1739 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1740 lines = self.run_child(child, b"quux\r")
1741 expected = (
1742 "stdin.isatty(): True",
1743 "captured: 'prompt'",
1744 )
1745 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001746
Raymond Hettinger64958a12003-12-17 20:43:33 +00001747class TestSorted(unittest.TestCase):
1748
1749 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001750 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001751 copy = data[:]
1752 random.shuffle(copy)
1753 self.assertEqual(data, sorted(copy))
1754 self.assertNotEqual(data, copy)
1755
1756 data.reverse()
1757 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001758 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1759 self.assertNotEqual(data, copy)
1760 random.shuffle(copy)
1761 self.assertEqual(data, sorted(copy, reverse=1))
1762 self.assertNotEqual(data, copy)
1763
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001764 def test_bad_arguments(self):
1765 # Issue #29327: The first argument is positional-only.
1766 sorted([])
1767 with self.assertRaises(TypeError):
1768 sorted(iterable=[])
1769 # Other arguments are keyword-only
1770 sorted([], key=None)
1771 with self.assertRaises(TypeError):
1772 sorted([], None)
1773
Raymond Hettinger64958a12003-12-17 20:43:33 +00001774 def test_inputtypes(self):
1775 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001776 types = [list, tuple, str]
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
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001780 s = ''.join(set(s)) # unique letters only
1781 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001782 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001783 self.assertEqual(sorted(s), sorted(T(s)))
1784
1785 def test_baddecorator(self):
1786 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1787 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1788
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001789
1790class ShutdownTest(unittest.TestCase):
1791
1792 def test_cleanup(self):
1793 # Issue #19255: builtins are still available at shutdown
1794 code = """if 1:
1795 import builtins
1796 import sys
1797
1798 class C:
1799 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001800 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001801 # Check that builtins still exist
1802 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001803 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001804
1805 c = C()
1806 # Make this module survive until builtins and sys are cleaned
1807 builtins.here = sys.modules[__name__]
1808 sys.here = sys.modules[__name__]
1809 # Create a reference loop so that this module needs to go
1810 # through a GC phase.
1811 here = sys.modules[__name__]
1812 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001813 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1814 # otherwise the codec may be unloaded before C.__del__() is called, and
1815 # so print("before") fails because the codec cannot be used to encode
1816 # "before" to sys.stdout.encoding. For example, on Windows,
1817 # sys.stdout.encoding is the OEM code page and these code pages are
1818 # implemented in Python
1819 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001820 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001821 self.assertEqual(["before", "after"], out.decode().splitlines())
1822
1823
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001824class TestType(unittest.TestCase):
1825 def test_new_type(self):
1826 A = type('A', (), {})
1827 self.assertEqual(A.__name__, 'A')
1828 self.assertEqual(A.__qualname__, 'A')
1829 self.assertEqual(A.__module__, __name__)
1830 self.assertEqual(A.__bases__, (object,))
1831 self.assertIs(A.__base__, object)
1832 x = A()
1833 self.assertIs(type(x), A)
1834 self.assertIs(x.__class__, A)
1835
1836 class B:
1837 def ham(self):
1838 return 'ham%d' % self
1839 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1840 self.assertEqual(C.__name__, 'C')
1841 self.assertEqual(C.__qualname__, 'C')
1842 self.assertEqual(C.__module__, __name__)
1843 self.assertEqual(C.__bases__, (B, int))
1844 self.assertIs(C.__base__, int)
1845 self.assertIn('spam', C.__dict__)
1846 self.assertNotIn('ham', C.__dict__)
1847 x = C(42)
1848 self.assertEqual(x, 42)
1849 self.assertIs(type(x), C)
1850 self.assertIs(x.__class__, C)
1851 self.assertEqual(x.ham(), 'ham42')
1852 self.assertEqual(x.spam(), 'spam42')
1853 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1854
Nick Coghland78448e2016-07-30 16:26:03 +10001855 def test_type_nokwargs(self):
1856 with self.assertRaises(TypeError):
1857 type('a', (), {}, x=5)
1858 with self.assertRaises(TypeError):
1859 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001860
1861 def test_type_name(self):
1862 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1863 with self.subTest(name=name):
1864 A = type(name, (), {})
1865 self.assertEqual(A.__name__, name)
1866 self.assertEqual(A.__qualname__, name)
1867 self.assertEqual(A.__module__, __name__)
1868 with self.assertRaises(ValueError):
1869 type('A\x00B', (), {})
1870 with self.assertRaises(ValueError):
1871 type('A\udcdcB', (), {})
1872 with self.assertRaises(TypeError):
1873 type(b'A', (), {})
1874
1875 C = type('C', (), {})
1876 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1877 with self.subTest(name=name):
1878 C.__name__ = name
1879 self.assertEqual(C.__name__, name)
1880 self.assertEqual(C.__qualname__, 'C')
1881 self.assertEqual(C.__module__, __name__)
1882
1883 A = type('C', (), {})
1884 with self.assertRaises(ValueError):
1885 A.__name__ = 'A\x00B'
1886 self.assertEqual(A.__name__, 'C')
1887 with self.assertRaises(ValueError):
1888 A.__name__ = 'A\udcdcB'
1889 self.assertEqual(A.__name__, 'C')
1890 with self.assertRaises(TypeError):
1891 A.__name__ = b'A'
1892 self.assertEqual(A.__name__, 'C')
1893
1894 def test_type_qualname(self):
1895 A = type('A', (), {'__qualname__': 'B.C'})
1896 self.assertEqual(A.__name__, 'A')
1897 self.assertEqual(A.__qualname__, 'B.C')
1898 self.assertEqual(A.__module__, __name__)
1899 with self.assertRaises(TypeError):
1900 type('A', (), {'__qualname__': b'B'})
1901 self.assertEqual(A.__qualname__, 'B.C')
1902
1903 A.__qualname__ = 'D.E'
1904 self.assertEqual(A.__name__, 'A')
1905 self.assertEqual(A.__qualname__, 'D.E')
1906 with self.assertRaises(TypeError):
1907 A.__qualname__ = b'B'
1908 self.assertEqual(A.__qualname__, 'D.E')
1909
1910 def test_type_doc(self):
1911 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1912 A = type('A', (), {'__doc__': doc})
1913 self.assertEqual(A.__doc__, doc)
1914 with self.assertRaises(UnicodeEncodeError):
1915 type('A', (), {'__doc__': 'x\udcdcy'})
1916
1917 A = type('A', (), {})
1918 self.assertEqual(A.__doc__, None)
1919 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1920 A.__doc__ = doc
1921 self.assertEqual(A.__doc__, doc)
1922
1923 def test_bad_args(self):
1924 with self.assertRaises(TypeError):
1925 type()
1926 with self.assertRaises(TypeError):
1927 type('A', ())
1928 with self.assertRaises(TypeError):
1929 type('A', (), {}, ())
1930 with self.assertRaises(TypeError):
1931 type('A', (), dict={})
1932 with self.assertRaises(TypeError):
1933 type('A', [], {})
1934 with self.assertRaises(TypeError):
1935 type('A', (), types.MappingProxyType({}))
1936 with self.assertRaises(TypeError):
1937 type('A', (None,), {})
1938 with self.assertRaises(TypeError):
1939 type('A', (bool,), {})
1940 with self.assertRaises(TypeError):
1941 type('A', (int, str), {})
1942
1943 def test_bad_slots(self):
1944 with self.assertRaises(TypeError):
1945 type('A', (), {'__slots__': b'x'})
1946 with self.assertRaises(TypeError):
1947 type('A', (int,), {'__slots__': 'x'})
1948 with self.assertRaises(TypeError):
1949 type('A', (), {'__slots__': ''})
1950 with self.assertRaises(TypeError):
1951 type('A', (), {'__slots__': '42'})
1952 with self.assertRaises(TypeError):
1953 type('A', (), {'__slots__': 'x\x00y'})
1954 with self.assertRaises(ValueError):
1955 type('A', (), {'__slots__': 'x', 'x': 0})
1956 with self.assertRaises(TypeError):
1957 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1958 with self.assertRaises(TypeError):
1959 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1960
1961 class B:
1962 pass
1963 with self.assertRaises(TypeError):
1964 type('A', (B,), {'__slots__': '__dict__'})
1965 with self.assertRaises(TypeError):
1966 type('A', (B,), {'__slots__': '__weakref__'})
1967
1968
Zachary Warea4b7a752013-11-24 01:19:09 -06001969def load_tests(loader, tests, pattern):
1970 from doctest import DocTestSuite
1971 tests.addTest(DocTestSuite(builtins))
1972 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001973
1974if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001975 unittest.main()