blob: 8f91bc9bf919b742afdf6d17236855bbb175ce65 [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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000908 data = [random.randrange(200) for i in range(100)]
909 keys = dict((elem, random.randrange(50)) for elem in data)
910 f = keys.__getitem__
911 self.assertEqual(max(data, key=f),
912 sorted(reversed(data), key=f)[-1])
913
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 def test_min(self):
915 self.assertEqual(min('123123'), '1')
916 self.assertEqual(min(1, 2, 3), 1)
917 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
918 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
919
Guido van Rossume2a383d2007-01-15 16:59:06 +0000920 self.assertEqual(min(1, 2, 3.0), 1)
921 self.assertEqual(min(1, 2.0, 3), 1)
922 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000923
924 self.assertRaises(TypeError, min)
925 self.assertRaises(TypeError, min, 42)
926 self.assertRaises(ValueError, min, ())
927 class BadSeq:
928 def __getitem__(self, index):
929 raise ValueError
930 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000931
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000932 for stmt in (
933 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700934 "min(default=None)",
935 "min(1, 2, default=None)", # require container for default
936 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000937 "min(1, key=int)", # single arg not iterable
938 "min(1, 2, keystone=int)", # wrong keyword
939 "min(1, 2, key=int, abc=int)", # two many keywords
940 "min(1, 2, key=1)", # keyfunc is not callable
941 ):
Tim Peters7f061872004-12-07 21:17:46 +0000942 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000943 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000944 except TypeError:
945 pass
946 else:
947 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000948
949 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
950 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
951 self.assertEqual(min(1, 2, key=neg), 2) # two elems
952
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700953 self.assertEqual(min((), default=None), None) # zero elem iterable
954 self.assertEqual(min((1,), default=None), 1) # one elem iterable
955 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
956
957 self.assertEqual(min((), default=1, key=neg), 1)
958 self.assertEqual(min((1, 2), default=1, key=neg), 2)
959
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000960 data = [random.randrange(200) for i in range(100)]
961 keys = dict((elem, random.randrange(50)) for elem in data)
962 f = keys.__getitem__
963 self.assertEqual(min(data, key=f),
964 sorted(data, key=f)[0])
965
Georg Brandla18af4e2007-04-21 15:47:16 +0000966 def test_next(self):
967 it = iter(range(2))
968 self.assertEqual(next(it), 0)
969 self.assertEqual(next(it), 1)
970 self.assertRaises(StopIteration, next, it)
971 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000972 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000973
974 class Iter(object):
975 def __iter__(self):
976 return self
977 def __next__(self):
978 raise StopIteration
979
980 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000981 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000982 self.assertRaises(StopIteration, next, it)
983
984 def gen():
985 yield 1
986 return
987
988 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000990 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000991 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000992
Walter Dörwald919497e2003-01-19 16:23:59 +0000993 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000994 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000995 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 self.assertRaises(TypeError, oct, ())
997
998 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000999 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001001 self.addCleanup(unlink, TESTFN)
1002 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001003 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001004 fp.write('The quick brown fox jumps over the lazy dog')
1005 fp.write('.\n')
1006 fp.write('Dear John\n')
1007 fp.write('XXX'*100)
1008 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001009
1010 def test_open(self):
1011 self.write_testfile()
1012 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001013 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001014 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1016 self.assertEqual(fp.readline(4), 'Dear')
1017 self.assertEqual(fp.readline(100), ' John\n')
1018 self.assertEqual(fp.read(300), 'XXX'*100)
1019 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001020
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001021 # embedded null bytes and characters
1022 self.assertRaises(ValueError, open, 'a\x00b')
1023 self.assertRaises(ValueError, open, b'a\x00b')
1024
Victor Stinner91106cd2017-12-13 12:29:09 +01001025 @unittest.skipIf(sys.flags.utf8_mode, "utf-8 mode is enabled")
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001026 def test_open_default_encoding(self):
1027 old_environ = dict(os.environ)
1028 try:
1029 # try to get a user preferred encoding different than the current
1030 # locale encoding to check that open() uses the current locale
1031 # encoding and not the user preferred encoding
1032 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1033 if key in os.environ:
1034 del os.environ[key]
1035
1036 self.write_testfile()
1037 current_locale_encoding = locale.getpreferredencoding(False)
1038 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001039 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001040 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001041 finally:
1042 os.environ.clear()
1043 os.environ.update(old_environ)
1044
Victor Stinnerdaf45552013-08-28 00:53:59 +02001045 def test_open_non_inheritable(self):
1046 fileobj = open(__file__)
1047 with fileobj:
1048 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1049
Walter Dörwald919497e2003-01-19 16:23:59 +00001050 def test_ord(self):
1051 self.assertEqual(ord(' '), 32)
1052 self.assertEqual(ord('A'), 65)
1053 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001054 self.assertEqual(ord('\x80'), 128)
1055 self.assertEqual(ord('\xff'), 255)
1056
1057 self.assertEqual(ord(b' '), 32)
1058 self.assertEqual(ord(b'A'), 65)
1059 self.assertEqual(ord(b'a'), 97)
1060 self.assertEqual(ord(b'\x80'), 128)
1061 self.assertEqual(ord(b'\xff'), 255)
1062
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001063 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001064 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001065
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001066 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1067 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1068 self.assertEqual(ord("\U00010000"), 0x00010000)
1069 self.assertEqual(ord("\U00010001"), 0x00010001)
1070 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1071 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1072 self.assertEqual(ord("\U00100000"), 0x00100000)
1073 self.assertEqual(ord("\U00100001"), 0x00100001)
1074 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1075 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1076
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 def test_pow(self):
1078 self.assertEqual(pow(0,0), 1)
1079 self.assertEqual(pow(0,1), 0)
1080 self.assertEqual(pow(1,0), 1)
1081 self.assertEqual(pow(1,1), 1)
1082
1083 self.assertEqual(pow(2,0), 1)
1084 self.assertEqual(pow(2,10), 1024)
1085 self.assertEqual(pow(2,20), 1024*1024)
1086 self.assertEqual(pow(2,30), 1024*1024*1024)
1087
1088 self.assertEqual(pow(-2,0), 1)
1089 self.assertEqual(pow(-2,1), -2)
1090 self.assertEqual(pow(-2,2), 4)
1091 self.assertEqual(pow(-2,3), -8)
1092
Walter Dörwald919497e2003-01-19 16:23:59 +00001093 self.assertAlmostEqual(pow(0.,0), 1.)
1094 self.assertAlmostEqual(pow(0.,1), 0.)
1095 self.assertAlmostEqual(pow(1.,0), 1.)
1096 self.assertAlmostEqual(pow(1.,1), 1.)
1097
1098 self.assertAlmostEqual(pow(2.,0), 1.)
1099 self.assertAlmostEqual(pow(2.,10), 1024.)
1100 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1101 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1102
1103 self.assertAlmostEqual(pow(-2.,0), 1.)
1104 self.assertAlmostEqual(pow(-2.,1), -2.)
1105 self.assertAlmostEqual(pow(-2.,2), 4.)
1106 self.assertAlmostEqual(pow(-2.,3), -8.)
1107
Mark Dickinson5c2db372009-12-05 20:28:34 +00001108 for x in 2, 2.0:
1109 for y in 10, 10.0:
1110 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001111 if isinstance(x, float) or \
1112 isinstance(y, float) or \
1113 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001114 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001115 else:
1116 self.assertAlmostEqual(pow(x, y, z), 24.0)
1117
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001118 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1119 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1120
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001121 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001122 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001123
1124 self.assertRaises(TypeError, pow)
1125
Guido van Rossuma88a0332007-02-26 16:59:55 +00001126 def test_input(self):
1127 self.write_testfile()
1128 fp = open(TESTFN, 'r')
1129 savestdin = sys.stdin
1130 savestdout = sys.stdout # Eats the echo
1131 try:
1132 sys.stdin = fp
1133 sys.stdout = BitBucket()
1134 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001135 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1136 self.assertEqual(input('testing\n'), 'Dear John')
1137
1138 # SF 1535165: don't segfault on closed stdin
1139 # sys.stdout must be a regular file for triggering
1140 sys.stdout = savestdout
1141 sys.stdin.close()
1142 self.assertRaises(ValueError, input)
1143
1144 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001145 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001146 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001147 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001148 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001149 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001150 self.assertRaises(EOFError, input)
1151
1152 del sys.stdout
1153 self.assertRaises(RuntimeError, input, 'prompt')
1154 del sys.stdin
1155 self.assertRaises(RuntimeError, input, 'prompt')
1156 finally:
1157 sys.stdin = savestdin
1158 sys.stdout = savestdout
1159 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001160
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001161 # test_int(): see test_int.py for tests of built-in function int().
1162
Walter Dörwald919497e2003-01-19 16:23:59 +00001163 def test_repr(self):
1164 self.assertEqual(repr(''), '\'\'')
1165 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 self.assertEqual(repr(()), '()')
1167 self.assertEqual(repr([]), '[]')
1168 self.assertEqual(repr({}), '{}')
1169 a = []
1170 a.append(a)
1171 self.assertEqual(repr(a), '[[...]]')
1172 a = {}
1173 a[0] = a
1174 self.assertEqual(repr(a), '{0: {...}}')
1175
1176 def test_round(self):
1177 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001178 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001179 self.assertEqual(round(1.0), 1.0)
1180 self.assertEqual(round(10.0), 10.0)
1181 self.assertEqual(round(1000000000.0), 1000000000.0)
1182 self.assertEqual(round(1e20), 1e20)
1183
1184 self.assertEqual(round(-1.0), -1.0)
1185 self.assertEqual(round(-10.0), -10.0)
1186 self.assertEqual(round(-1000000000.0), -1000000000.0)
1187 self.assertEqual(round(-1e20), -1e20)
1188
1189 self.assertEqual(round(0.1), 0.0)
1190 self.assertEqual(round(1.1), 1.0)
1191 self.assertEqual(round(10.1), 10.0)
1192 self.assertEqual(round(1000000000.1), 1000000000.0)
1193
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(0.9), 1.0)
1199 self.assertEqual(round(9.9), 10.0)
1200 self.assertEqual(round(999999999.9), 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(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001207 self.assertEqual(type(round(-8.0, -1)), float)
1208
1209 self.assertEqual(type(round(-8.0, 0)), float)
1210 self.assertEqual(type(round(-8.0, 1)), float)
1211
1212 # Check even / odd rounding behaviour
1213 self.assertEqual(round(5.5), 6)
1214 self.assertEqual(round(6.5), 6)
1215 self.assertEqual(round(-5.5), -6)
1216 self.assertEqual(round(-6.5), -6)
1217
1218 # Check behavior on ints
1219 self.assertEqual(round(0), 0)
1220 self.assertEqual(round(8), 8)
1221 self.assertEqual(round(-8), -8)
1222 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001223 self.assertEqual(type(round(-8, -1)), int)
1224 self.assertEqual(type(round(-8, 0)), int)
1225 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001226
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001227 # test new kwargs
1228 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1229
Walter Dörwald919497e2003-01-19 16:23:59 +00001230 self.assertRaises(TypeError, round)
1231
Alex Martelliae211f92007-08-22 23:21:33 +00001232 # test generic rounding delegation for reals
1233 class TestRound:
1234 def __round__(self):
1235 return 23
1236
1237 class TestNoRound:
1238 pass
1239
1240 self.assertEqual(round(TestRound()), 23)
1241
1242 self.assertRaises(TypeError, round, 1, 2, 3)
1243 self.assertRaises(TypeError, round, TestNoRound())
1244
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001245 t = TestNoRound()
1246 t.__round__ = lambda *args: args
1247 self.assertRaises(TypeError, round, t)
1248 self.assertRaises(TypeError, round, t, 0)
1249
Mark Dickinsonad731b92009-11-09 17:12:30 +00001250 # Some versions of glibc for alpha have a bug that affects
1251 # float -> integer rounding (floor, ceil, rint, round) for
1252 # values in the range [2**52, 2**53). See:
1253 #
1254 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1255 #
1256 # We skip this test on Linux/alpha if it would fail.
1257 linux_alpha = (platform.system().startswith('Linux') and
1258 platform.machine().startswith('alpha'))
1259 system_round_bug = round(5e15+1) != 5e15+1
1260 @unittest.skipIf(linux_alpha and system_round_bug,
1261 "test will fail; failure is probably due to a "
1262 "buggy system round function")
1263 def test_round_large(self):
1264 # Issue #1869: integral floats should remain unchanged
1265 self.assertEqual(round(5e15-1), 5e15-1)
1266 self.assertEqual(round(5e15), 5e15)
1267 self.assertEqual(round(5e15+1), 5e15+1)
1268 self.assertEqual(round(5e15+2), 5e15+2)
1269 self.assertEqual(round(5e15+3), 5e15+3)
1270
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001271 def test_bug_27936(self):
1272 # Verify that ndigits=None means the same as passing in no argument
1273 for x in [1234,
1274 1234.56,
1275 decimal.Decimal('1234.56'),
1276 fractions.Fraction(123456, 100)]:
1277 self.assertEqual(round(x, None), round(x))
1278 self.assertEqual(type(round(x, None)), type(round(x)))
1279
Walter Dörwald919497e2003-01-19 16:23:59 +00001280 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001281 setattr(sys, 'spam', 1)
1282 self.assertEqual(sys.spam, 1)
1283 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1284 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001285
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001286 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001287
Alex Martellia70b1912003-04-22 08:12:33 +00001288 def test_sum(self):
1289 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001290 self.assertEqual(sum(list(range(2,8))), 27)
1291 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001292 self.assertEqual(sum(Squares(10)), 285)
1293 self.assertEqual(sum(iter(Squares(10))), 285)
1294 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1295
1296 self.assertRaises(TypeError, sum)
1297 self.assertRaises(TypeError, sum, 42)
1298 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1299 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001300 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1301 values = [bytearray(b'a'), bytearray(b'b')]
1302 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001303 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1304 self.assertRaises(TypeError, sum, [{2:3}])
1305 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1306
1307 class BadSeq:
1308 def __getitem__(self, index):
1309 raise ValueError
1310 self.assertRaises(ValueError, sum, BadSeq())
1311
Mark Dickinson3a22b472009-10-17 21:48:16 +00001312 empty = []
1313 sum(([x] for x in range(10)), empty)
1314 self.assertEqual(empty, [])
1315
Walter Dörwald919497e2003-01-19 16:23:59 +00001316 def test_type(self):
1317 self.assertEqual(type(''), type('123'))
1318 self.assertNotEqual(type(''), type(()))
1319
Guido van Rossumfee7b932005-01-16 00:21:28 +00001320 # We don't want self in vars(), so these are static methods
1321
1322 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001323 def get_vars_f0():
1324 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001325
Guido van Rossumfee7b932005-01-16 00:21:28 +00001326 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001327 def get_vars_f2():
1328 BuiltinTest.get_vars_f0()
1329 a = 1
1330 b = 2
1331 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001332
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001333 class C_get_vars(object):
1334 def getDict(self):
1335 return {'a':2}
1336 __dict__ = property(fget=getDict)
1337
Walter Dörwald919497e2003-01-19 16:23:59 +00001338 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001339 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001340 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001341 self.assertEqual(self.get_vars_f0(), {})
1342 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1343 self.assertRaises(TypeError, vars, 42, 42)
1344 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001345 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001346
1347 def test_zip(self):
1348 a = (1, 2, 3)
1349 b = (4, 5, 6)
1350 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001351 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001352 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001353 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001354 b = (4, 5, 6, 7)
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 class I:
1357 def __getitem__(self, i):
1358 if i < 0 or i > 2: raise IndexError
1359 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001360 self.assertEqual(list(zip(a, I())), t)
1361 self.assertEqual(list(zip()), [])
1362 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001363 self.assertRaises(TypeError, zip, None)
1364 class G:
1365 pass
1366 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001367 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001368
1369 # Make sure zip doesn't try to allocate a billion elements for the
1370 # result list when one of its arguments doesn't say how long it is.
1371 # A MemoryError is the most likely failure mode.
1372 class SequenceWithoutALength:
1373 def __getitem__(self, i):
1374 if i == 5:
1375 raise IndexError
1376 else:
1377 return i
1378 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001379 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001380 list(enumerate(range(5)))
1381 )
1382
1383 class BadSeq:
1384 def __getitem__(self, i):
1385 if i == 5:
1386 raise ValueError
1387 else:
1388 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001389 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001390
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001391 def test_zip_pickle(self):
1392 a = (1, 2, 3)
1393 b = (4, 5, 6)
1394 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001395 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1396 z1 = zip(a, b)
1397 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001398
Eric Smithe4d63172010-09-13 20:48:43 +00001399 def test_format(self):
1400 # Test the basic machinery of the format() builtin. Don't test
1401 # the specifics of the various formatters
1402 self.assertEqual(format(3, ''), '3')
1403
1404 # Returns some classes to use for various tests. There's
1405 # an old-style version, and a new-style version
1406 def classes_new():
1407 class A(object):
1408 def __init__(self, x):
1409 self.x = x
1410 def __format__(self, format_spec):
1411 return str(self.x) + format_spec
1412 class DerivedFromA(A):
1413 pass
1414
1415 class Simple(object): pass
1416 class DerivedFromSimple(Simple):
1417 def __init__(self, x):
1418 self.x = x
1419 def __format__(self, format_spec):
1420 return str(self.x) + format_spec
1421 class DerivedFromSimple2(DerivedFromSimple): pass
1422 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1423
1424 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1425 self.assertEqual(format(A(3), 'spec'), '3spec')
1426 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1427 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1428 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1429 '10abcdef')
1430
1431 class_test(*classes_new())
1432
1433 def empty_format_spec(value):
1434 # test that:
1435 # format(x, '') == str(x)
1436 # format(x) == str(x)
1437 self.assertEqual(format(value, ""), str(value))
1438 self.assertEqual(format(value), str(value))
1439
1440 # for builtin types, format(x, "") == str(x)
1441 empty_format_spec(17**13)
1442 empty_format_spec(1.0)
1443 empty_format_spec(3.1415e104)
1444 empty_format_spec(-3.1415e104)
1445 empty_format_spec(3.1415e-104)
1446 empty_format_spec(-3.1415e-104)
1447 empty_format_spec(object)
1448 empty_format_spec(None)
1449
1450 # TypeError because self.__format__ returns the wrong type
1451 class BadFormatResult:
1452 def __format__(self, format_spec):
1453 return 1.0
1454 self.assertRaises(TypeError, format, BadFormatResult(), "")
1455
1456 # TypeError because format_spec is not unicode or str
1457 self.assertRaises(TypeError, format, object(), 4)
1458 self.assertRaises(TypeError, format, object(), object())
1459
1460 # tests for object.__format__ really belong elsewhere, but
1461 # there's no good place to put them
1462 x = object().__format__('')
1463 self.assertTrue(x.startswith('<object object at'))
1464
1465 # first argument to object.__format__ must be string
1466 self.assertRaises(TypeError, object().__format__, 3)
1467 self.assertRaises(TypeError, object().__format__, object())
1468 self.assertRaises(TypeError, object().__format__, None)
1469
1470 # --------------------------------------------------------------------
1471 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001472 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001473 class A:
1474 def __format__(self, fmt_str):
1475 return format('', fmt_str)
1476
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001477 self.assertEqual(format(A()), '')
1478 self.assertEqual(format(A(), ''), '')
1479 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001480
1481 class B:
1482 pass
1483
1484 class C(object):
1485 pass
1486
1487 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001488 obj = cls()
1489 self.assertEqual(format(obj), str(obj))
1490 self.assertEqual(format(obj, ''), str(obj))
1491 with self.assertRaisesRegex(TypeError,
1492 r'\b%s\b' % re.escape(cls.__name__)):
1493 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001494 # --------------------------------------------------------------------
1495
1496 # make sure we can take a subclass of str as a format spec
1497 class DerivedFromStr(str): pass
1498 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1499
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001500 def test_bin(self):
1501 self.assertEqual(bin(0), '0b0')
1502 self.assertEqual(bin(1), '0b1')
1503 self.assertEqual(bin(-1), '-0b1')
1504 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1505 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1506 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1507 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1508
Georg Brandl953152f2009-07-22 12:03:59 +00001509 def test_bytearray_translate(self):
1510 x = bytearray(b"abc")
1511 self.assertRaises(ValueError, x.translate, b"1", 1)
1512 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1513
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001514 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001515 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001516 tp = type(const)
1517 self.assertIs(tp(), const)
1518 self.assertRaises(TypeError, tp, 1, 2)
1519 self.assertRaises(TypeError, tp, a=1, b=2)
1520
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001521
1522class TestBreakpoint(unittest.TestCase):
1523 def setUp(self):
1524 # These tests require a clean slate environment. For example, if the
1525 # test suite is run with $PYTHONBREAKPOINT set to something else, it
1526 # will mess up these tests. Similarly for sys.breakpointhook.
1527 # Cleaning the slate here means you can't use breakpoint() to debug
1528 # these tests, but I think that's okay. Just use pdb.set_trace() if
1529 # you must.
1530 self.resources = ExitStack()
1531 self.addCleanup(self.resources.close)
1532 self.env = self.resources.enter_context(EnvironmentVarGuard())
1533 del self.env['PYTHONBREAKPOINT']
1534 self.resources.enter_context(
1535 swap_attr(sys, 'breakpointhook', sys.__breakpointhook__))
1536
1537 def test_breakpoint(self):
1538 with patch('pdb.set_trace') as mock:
1539 breakpoint()
1540 mock.assert_called_once()
1541
1542 def test_breakpoint_with_breakpointhook_set(self):
1543 my_breakpointhook = MagicMock()
1544 sys.breakpointhook = my_breakpointhook
1545 breakpoint()
1546 my_breakpointhook.assert_called_once_with()
1547
1548 def test_breakpoint_with_breakpointhook_reset(self):
1549 my_breakpointhook = MagicMock()
1550 sys.breakpointhook = my_breakpointhook
1551 breakpoint()
1552 my_breakpointhook.assert_called_once_with()
1553 # Reset the hook and it will not be called again.
1554 sys.breakpointhook = sys.__breakpointhook__
1555 with patch('pdb.set_trace') as mock:
1556 breakpoint()
1557 mock.assert_called_once_with()
1558 my_breakpointhook.assert_called_once_with()
1559
1560 def test_breakpoint_with_args_and_keywords(self):
1561 my_breakpointhook = MagicMock()
1562 sys.breakpointhook = my_breakpointhook
1563 breakpoint(1, 2, 3, four=4, five=5)
1564 my_breakpointhook.assert_called_once_with(1, 2, 3, four=4, five=5)
1565
1566 def test_breakpoint_with_passthru_error(self):
1567 def my_breakpointhook():
1568 pass
1569 sys.breakpointhook = my_breakpointhook
1570 self.assertRaises(TypeError, breakpoint, 1, 2, 3, four=4, five=5)
1571
1572 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1573 def test_envar_good_path_builtin(self):
1574 self.env['PYTHONBREAKPOINT'] = 'int'
1575 with patch('builtins.int') as mock:
1576 breakpoint('7')
1577 mock.assert_called_once_with('7')
1578
1579 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1580 def test_envar_good_path_other(self):
1581 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1582 with patch('sys.exit') as mock:
1583 breakpoint()
1584 mock.assert_called_once_with()
1585
1586 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1587 def test_envar_good_path_noop_0(self):
1588 self.env['PYTHONBREAKPOINT'] = '0'
1589 with patch('pdb.set_trace') as mock:
1590 breakpoint()
1591 mock.assert_not_called()
1592
1593 def test_envar_good_path_empty_string(self):
1594 # PYTHONBREAKPOINT='' is the same as it not being set.
1595 self.env['PYTHONBREAKPOINT'] = ''
1596 with patch('pdb.set_trace') as mock:
1597 breakpoint()
1598 mock.assert_called_once_with()
1599
1600 @unittest.skipIf(sys.flags.ignore_environment, '-E was given')
1601 def test_envar_unimportable(self):
1602 for envar in (
1603 '.', '..', '.foo', 'foo.', '.int', 'int.'
1604 'nosuchbuiltin',
1605 'nosuchmodule.nosuchcallable',
1606 ):
1607 with self.subTest(envar=envar):
1608 self.env['PYTHONBREAKPOINT'] = envar
1609 mock = self.resources.enter_context(patch('pdb.set_trace'))
1610 w = self.resources.enter_context(check_warnings(quiet=True))
1611 breakpoint()
1612 self.assertEqual(
1613 str(w.message),
1614 f'Ignoring unimportable $PYTHONBREAKPOINT: "{envar}"')
1615 self.assertEqual(w.category, RuntimeWarning)
1616 mock.assert_not_called()
1617
1618 def test_envar_ignored_when_hook_is_set(self):
1619 self.env['PYTHONBREAKPOINT'] = 'sys.exit'
1620 with patch('sys.exit') as mock:
1621 sys.breakpointhook = int
1622 breakpoint()
1623 mock.assert_not_called()
1624
1625
Martin Panterc9a6ab52015-10-10 01:25:38 +00001626@unittest.skipUnless(pty, "the pty and signal modules must be available")
1627class PtyTests(unittest.TestCase):
1628 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1629 terminals in the test environment"""
1630
Martin Pantere44dba32015-10-10 05:27:15 +00001631 def run_child(self, child, terminal_input):
1632 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001633 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001634 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001635 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001636 os.close(r)
1637 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001638 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001639 raise
1640 if pid == 0:
1641 # Child
1642 try:
1643 # Make sure we don't get stuck if there's a problem
1644 signal.alarm(2)
1645 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001646 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001647 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001648 except:
1649 traceback.print_exc()
1650 finally:
1651 # We don't want to return to unittest...
1652 os._exit(0)
1653 # Parent
1654 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001655 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001656 # Get results from the pipe
1657 with open(r, "r") as rpipe:
1658 lines = []
1659 while True:
1660 line = rpipe.readline().strip()
1661 if line == "":
1662 # The other end was closed => the child exited
1663 break
1664 lines.append(line)
1665 # Check the result was got and corresponds to the user's terminal input
1666 if len(lines) != 2:
1667 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001668 # Beware of Linux raising EIO when the slave is closed
1669 child_output = bytearray()
1670 while True:
1671 try:
1672 chunk = os.read(fd, 3000)
1673 except OSError: # Assume EIO
1674 break
1675 if not chunk:
1676 break
1677 child_output.extend(chunk)
1678 os.close(fd)
1679 child_output = child_output.decode("ascii", "ignore")
1680 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1681 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001682 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001683
Victor Stinner3ca9f502017-08-09 23:08:22 +02001684 # Wait until the child process completes
1685 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001686
Martin Pantere44dba32015-10-10 05:27:15 +00001687 return lines
1688
1689 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1690 if not sys.stdin.isatty() or not sys.stdout.isatty():
1691 self.skipTest("stdin and stdout must be ttys")
1692 def child(wpipe):
1693 # Check the error handlers are accounted for
1694 if stdio_encoding:
1695 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1696 encoding=stdio_encoding,
1697 errors='surrogateescape')
1698 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1699 encoding=stdio_encoding,
1700 errors='replace')
1701 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1702 print(ascii(input(prompt)), file=wpipe)
1703 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001704 # Check we did exercise the GNU readline path
1705 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1706 if lines[0] != 'tty = True':
1707 self.skipTest("standard IO in should have been a tty")
1708 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1709 if stdio_encoding:
1710 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1711 else:
1712 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1713 self.assertEqual(input_result, expected)
1714
1715 def test_input_tty(self):
1716 # Test input() functionality when wired to a tty (the code path
1717 # is different and invokes GNU readline if available).
1718 self.check_input_tty("prompt", b"quux")
1719
1720 def test_input_tty_non_ascii(self):
1721 # Check stdin/stdout encoding is used when invoking GNU readline
1722 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1723
1724 def test_input_tty_non_ascii_unicode_errors(self):
1725 # Check stdin/stdout error handler is used when invoking GNU readline
1726 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1727
1728 def test_input_no_stdout_fileno(self):
1729 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1730 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001731 def child(wpipe):
1732 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1733 sys.stdout = io.StringIO() # Does not support fileno()
1734 input("prompt")
1735 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1736 lines = self.run_child(child, b"quux\r")
1737 expected = (
1738 "stdin.isatty(): True",
1739 "captured: 'prompt'",
1740 )
1741 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001742
Raymond Hettinger64958a12003-12-17 20:43:33 +00001743class TestSorted(unittest.TestCase):
1744
1745 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001746 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001747 copy = data[:]
1748 random.shuffle(copy)
1749 self.assertEqual(data, sorted(copy))
1750 self.assertNotEqual(data, copy)
1751
1752 data.reverse()
1753 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001754 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1755 self.assertNotEqual(data, copy)
1756 random.shuffle(copy)
1757 self.assertEqual(data, sorted(copy, reverse=1))
1758 self.assertNotEqual(data, copy)
1759
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001760 def test_bad_arguments(self):
1761 # Issue #29327: The first argument is positional-only.
1762 sorted([])
1763 with self.assertRaises(TypeError):
1764 sorted(iterable=[])
1765 # Other arguments are keyword-only
1766 sorted([], key=None)
1767 with self.assertRaises(TypeError):
1768 sorted([], None)
1769
Raymond Hettinger64958a12003-12-17 20:43:33 +00001770 def test_inputtypes(self):
1771 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001772 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001773 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001774 self.assertEqual(sorted(s), sorted(T(s)))
1775
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001776 s = ''.join(set(s)) # unique letters only
1777 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001778 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001779 self.assertEqual(sorted(s), sorted(T(s)))
1780
1781 def test_baddecorator(self):
1782 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1783 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1784
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001785
1786class ShutdownTest(unittest.TestCase):
1787
1788 def test_cleanup(self):
1789 # Issue #19255: builtins are still available at shutdown
1790 code = """if 1:
1791 import builtins
1792 import sys
1793
1794 class C:
1795 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001796 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001797 # Check that builtins still exist
1798 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001799 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001800
1801 c = C()
1802 # Make this module survive until builtins and sys are cleaned
1803 builtins.here = sys.modules[__name__]
1804 sys.here = sys.modules[__name__]
1805 # Create a reference loop so that this module needs to go
1806 # through a GC phase.
1807 here = sys.modules[__name__]
1808 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001809 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1810 # otherwise the codec may be unloaded before C.__del__() is called, and
1811 # so print("before") fails because the codec cannot be used to encode
1812 # "before" to sys.stdout.encoding. For example, on Windows,
1813 # sys.stdout.encoding is the OEM code page and these code pages are
1814 # implemented in Python
1815 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001816 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001817 self.assertEqual(["before", "after"], out.decode().splitlines())
1818
1819
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001820class TestType(unittest.TestCase):
1821 def test_new_type(self):
1822 A = type('A', (), {})
1823 self.assertEqual(A.__name__, 'A')
1824 self.assertEqual(A.__qualname__, 'A')
1825 self.assertEqual(A.__module__, __name__)
1826 self.assertEqual(A.__bases__, (object,))
1827 self.assertIs(A.__base__, object)
1828 x = A()
1829 self.assertIs(type(x), A)
1830 self.assertIs(x.__class__, A)
1831
1832 class B:
1833 def ham(self):
1834 return 'ham%d' % self
1835 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1836 self.assertEqual(C.__name__, 'C')
1837 self.assertEqual(C.__qualname__, 'C')
1838 self.assertEqual(C.__module__, __name__)
1839 self.assertEqual(C.__bases__, (B, int))
1840 self.assertIs(C.__base__, int)
1841 self.assertIn('spam', C.__dict__)
1842 self.assertNotIn('ham', C.__dict__)
1843 x = C(42)
1844 self.assertEqual(x, 42)
1845 self.assertIs(type(x), C)
1846 self.assertIs(x.__class__, C)
1847 self.assertEqual(x.ham(), 'ham42')
1848 self.assertEqual(x.spam(), 'spam42')
1849 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1850
Nick Coghland78448e2016-07-30 16:26:03 +10001851 def test_type_nokwargs(self):
1852 with self.assertRaises(TypeError):
1853 type('a', (), {}, x=5)
1854 with self.assertRaises(TypeError):
1855 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001856
1857 def test_type_name(self):
1858 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1859 with self.subTest(name=name):
1860 A = type(name, (), {})
1861 self.assertEqual(A.__name__, name)
1862 self.assertEqual(A.__qualname__, name)
1863 self.assertEqual(A.__module__, __name__)
1864 with self.assertRaises(ValueError):
1865 type('A\x00B', (), {})
1866 with self.assertRaises(ValueError):
1867 type('A\udcdcB', (), {})
1868 with self.assertRaises(TypeError):
1869 type(b'A', (), {})
1870
1871 C = type('C', (), {})
1872 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1873 with self.subTest(name=name):
1874 C.__name__ = name
1875 self.assertEqual(C.__name__, name)
1876 self.assertEqual(C.__qualname__, 'C')
1877 self.assertEqual(C.__module__, __name__)
1878
1879 A = type('C', (), {})
1880 with self.assertRaises(ValueError):
1881 A.__name__ = 'A\x00B'
1882 self.assertEqual(A.__name__, 'C')
1883 with self.assertRaises(ValueError):
1884 A.__name__ = 'A\udcdcB'
1885 self.assertEqual(A.__name__, 'C')
1886 with self.assertRaises(TypeError):
1887 A.__name__ = b'A'
1888 self.assertEqual(A.__name__, 'C')
1889
1890 def test_type_qualname(self):
1891 A = type('A', (), {'__qualname__': 'B.C'})
1892 self.assertEqual(A.__name__, 'A')
1893 self.assertEqual(A.__qualname__, 'B.C')
1894 self.assertEqual(A.__module__, __name__)
1895 with self.assertRaises(TypeError):
1896 type('A', (), {'__qualname__': b'B'})
1897 self.assertEqual(A.__qualname__, 'B.C')
1898
1899 A.__qualname__ = 'D.E'
1900 self.assertEqual(A.__name__, 'A')
1901 self.assertEqual(A.__qualname__, 'D.E')
1902 with self.assertRaises(TypeError):
1903 A.__qualname__ = b'B'
1904 self.assertEqual(A.__qualname__, 'D.E')
1905
1906 def test_type_doc(self):
1907 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1908 A = type('A', (), {'__doc__': doc})
1909 self.assertEqual(A.__doc__, doc)
1910 with self.assertRaises(UnicodeEncodeError):
1911 type('A', (), {'__doc__': 'x\udcdcy'})
1912
1913 A = type('A', (), {})
1914 self.assertEqual(A.__doc__, None)
1915 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1916 A.__doc__ = doc
1917 self.assertEqual(A.__doc__, doc)
1918
1919 def test_bad_args(self):
1920 with self.assertRaises(TypeError):
1921 type()
1922 with self.assertRaises(TypeError):
1923 type('A', ())
1924 with self.assertRaises(TypeError):
1925 type('A', (), {}, ())
1926 with self.assertRaises(TypeError):
1927 type('A', (), dict={})
1928 with self.assertRaises(TypeError):
1929 type('A', [], {})
1930 with self.assertRaises(TypeError):
1931 type('A', (), types.MappingProxyType({}))
1932 with self.assertRaises(TypeError):
1933 type('A', (None,), {})
1934 with self.assertRaises(TypeError):
1935 type('A', (bool,), {})
1936 with self.assertRaises(TypeError):
1937 type('A', (int, str), {})
1938
1939 def test_bad_slots(self):
1940 with self.assertRaises(TypeError):
1941 type('A', (), {'__slots__': b'x'})
1942 with self.assertRaises(TypeError):
1943 type('A', (int,), {'__slots__': 'x'})
1944 with self.assertRaises(TypeError):
1945 type('A', (), {'__slots__': ''})
1946 with self.assertRaises(TypeError):
1947 type('A', (), {'__slots__': '42'})
1948 with self.assertRaises(TypeError):
1949 type('A', (), {'__slots__': 'x\x00y'})
1950 with self.assertRaises(ValueError):
1951 type('A', (), {'__slots__': 'x', 'x': 0})
1952 with self.assertRaises(TypeError):
1953 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1954 with self.assertRaises(TypeError):
1955 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1956
1957 class B:
1958 pass
1959 with self.assertRaises(TypeError):
1960 type('A', (B,), {'__slots__': '__dict__'})
1961 with self.assertRaises(TypeError):
1962 type('A', (B,), {'__slots__': '__weakref__'})
1963
1964
Zachary Warea4b7a752013-11-24 01:19:09 -06001965def load_tests(loader, tests, pattern):
1966 from doctest import DocTestSuite
1967 tests.addTest(DocTestSuite(builtins))
1968 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001969
1970if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001971 unittest.main()