blob: 9d949b74cb8d0b9fd9bac597712f2fbedd73d25c [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
20from operator import neg
Victor Stinnerd6debb22017-03-27 16:05:26 +020021from test.support import TESTFN, unlink, check_warnings
Berker Peksagce643912015-05-06 06:33:17 +030022from test.support.script_helper import assert_python_ok
Antoine Pitrou0d776b12011-11-06 00:34:26 +010023try:
Antoine Pitrou772add72011-11-06 02:37:42 +010024 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010025except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010026 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000027
Guido van Rossum3bead091992-01-27 17:00:37 +000028
Walter Dörwald919497e2003-01-19 16:23:59 +000029class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000030
Walter Dörwald919497e2003-01-19 16:23:59 +000031 def __init__(self, max):
32 self.max = max
33 self.sofar = []
34
35 def __len__(self): return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max: raise IndexError
39 n = len(self.sofar)
40 while n <= i:
41 self.sofar.append(n*n)
42 n += 1
43 return self.sofar[i]
44
45class StrSquares:
46
47 def __init__(self, max):
48 self.max = max
49 self.sofar = []
50
51 def __len__(self):
52 return len(self.sofar)
53
54 def __getitem__(self, i):
55 if not 0 <= i < self.max:
56 raise IndexError
57 n = len(self.sofar)
58 while n <= i:
59 self.sofar.append(str(n*n))
60 n += 1
61 return self.sofar[i]
62
63class BitBucket:
64 def write(self, line):
65 pass
66
Facundo Batista2336bdd2008-01-19 19:12:01 +000067test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000068 ('0', 0),
69 ('1', 1),
70 ('9', 9),
71 ('10', 10),
72 ('99', 99),
73 ('100', 100),
74 ('314', 314),
75 (' 314', 314),
76 ('314 ', 314),
77 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000078 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000079 (' 1x', ValueError),
80 (' 1 ', 1),
81 (' 1\02 ', ValueError),
82 ('', ValueError),
83 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000084 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040085 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000086 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000087]
88
Facundo Batista2336bdd2008-01-19 19:12:01 +000089test_conv_sign = [
90 ('0', 0),
91 ('1', 1),
92 ('9', 9),
93 ('10', 10),
94 ('99', 99),
95 ('100', 100),
96 ('314', 314),
97 (' 314', ValueError),
98 ('314 ', 314),
99 (' \t\t 314 \t\t ', ValueError),
100 (repr(sys.maxsize), sys.maxsize),
101 (' 1x', ValueError),
102 (' 1 ', ValueError),
103 (' 1\02 ', ValueError),
104 ('', ValueError),
105 (' ', ValueError),
106 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400107 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000108 (chr(0x200), ValueError),
109]
110
Raymond Hettinger96229b12005-03-11 06:49:40 +0000111class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000112 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000113 raise RuntimeError
114
115class TestFailingIter:
116 def __iter__(self):
117 raise RuntimeError
118
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000119def filter_char(arg):
120 return ord(arg) > ord("d")
121
122def map_char(arg):
123 return chr(ord(arg)+1)
124
Walter Dörwald919497e2003-01-19 16:23:59 +0000125class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000126 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200127 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000128 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200129 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000130 it = pickle.loads(d)
131 self.assertEqual(type(itorg), type(it))
132 self.assertEqual(list(it), seq)
133
134 #test the iterator after dropping one from it
135 it = pickle.loads(d)
136 try:
137 next(it)
138 except StopIteration:
139 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200140 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000141 it = pickle.loads(d)
142 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000143
144 def test_import(self):
145 __import__('sys')
146 __import__('time')
147 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000148 __import__(name='sys')
149 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000150 self.assertRaises(ImportError, __import__, 'spamspam')
151 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000152 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000153 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300154 # embedded null character
155 self.assertRaises(ModuleNotFoundError, __import__, 'string\x00')
Walter Dörwald919497e2003-01-19 16:23:59 +0000156
157 def test_abs(self):
158 # int
159 self.assertEqual(abs(0), 0)
160 self.assertEqual(abs(1234), 1234)
161 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000162 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000163 # float
164 self.assertEqual(abs(0.0), 0.0)
165 self.assertEqual(abs(3.14), 3.14)
166 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000167 # str
168 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000169 # bool
170 self.assertEqual(abs(True), 1)
171 self.assertEqual(abs(False), 0)
172 # other
173 self.assertRaises(TypeError, abs)
174 self.assertRaises(TypeError, abs, None)
175 class AbsClass(object):
176 def __abs__(self):
177 return -5
178 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000179
Raymond Hettinger96229b12005-03-11 06:49:40 +0000180 def test_all(self):
181 self.assertEqual(all([2, 4, 6]), True)
182 self.assertEqual(all([2, None, 6]), False)
183 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
184 self.assertRaises(RuntimeError, all, TestFailingIter())
185 self.assertRaises(TypeError, all, 10) # Non-iterable
186 self.assertRaises(TypeError, all) # No args
187 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
188 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200189 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000190 S = [50, 60]
191 self.assertEqual(all(x > 42 for x in S), True)
192 S = [50, 40, 60]
193 self.assertEqual(all(x > 42 for x in S), False)
194
195 def test_any(self):
196 self.assertEqual(any([None, None, None]), False)
197 self.assertEqual(any([None, 4, None]), True)
198 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500199 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000200 self.assertRaises(TypeError, any, 10) # Non-iterable
201 self.assertRaises(TypeError, any) # No args
202 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
203 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200204 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000205 S = [40, 60, 30]
206 self.assertEqual(any(x > 42 for x in S), True)
207 S = [10, 20, 30]
208 self.assertEqual(any(x > 42 for x in S), False)
209
Georg Brandl559e5d72008-06-11 18:37:52 +0000210 def test_ascii(self):
211 self.assertEqual(ascii(''), '\'\'')
212 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000213 self.assertEqual(ascii(()), '()')
214 self.assertEqual(ascii([]), '[]')
215 self.assertEqual(ascii({}), '{}')
216 a = []
217 a.append(a)
218 self.assertEqual(ascii(a), '[[...]]')
219 a = {}
220 a[0] = a
221 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000222 # Advanced checks for unicode strings
223 def _check_uni(s):
224 self.assertEqual(ascii(s), repr(s))
225 _check_uni("'")
226 _check_uni('"')
227 _check_uni('"\'')
228 _check_uni('\0')
229 _check_uni('\r\n\t .')
230 # Unprintable non-ASCII characters
231 _check_uni('\x85')
232 _check_uni('\u1fff')
233 _check_uni('\U00012fff')
234 # Lone surrogates
235 _check_uni('\ud800')
236 _check_uni('\udfff')
237 # Issue #9804: surrogates should be joined even for printable
238 # wide characters (UCS-2 builds).
239 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
240 # All together
241 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
242 self.assertEqual(ascii(s),
243 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000244
Thomas Wouters89f507f2006-12-13 04:49:30 +0000245 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000246 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000247 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000248 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000249
Walter Dörwald919497e2003-01-19 16:23:59 +0000250 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000251 self.assertTrue(callable(len))
252 self.assertFalse(callable("a"))
253 self.assertTrue(callable(callable))
254 self.assertTrue(callable(lambda x, y: x + y))
255 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000256 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000257 self.assertTrue(callable(f))
258
259 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000260 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000261 self.assertTrue(callable(C1))
262 c = C1()
263 self.assertTrue(callable(c.meth))
264 self.assertFalse(callable(c))
265
266 # __call__ is looked up on the class, not the instance
267 c.__call__ = None
268 self.assertFalse(callable(c))
269 c.__call__ = lambda self: 0
270 self.assertFalse(callable(c))
271 del c.__call__
272 self.assertFalse(callable(c))
273
274 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000276 c2 = C2()
277 self.assertTrue(callable(c2))
278 c2.__call__ = None
279 self.assertTrue(callable(c2))
280 class C3(C2): pass
281 c3 = C3()
282 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000283
284 def test_chr(self):
285 self.assertEqual(chr(32), ' ')
286 self.assertEqual(chr(65), 'A')
287 self.assertEqual(chr(97), 'a')
288 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000289 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000290 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300291 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000292 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000293 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
294 self.assertEqual(chr(0x00010000), "\U00010000")
295 self.assertEqual(chr(0x00010001), "\U00010001")
296 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
297 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
298 self.assertEqual(chr(0x00100000), "\U00100000")
299 self.assertEqual(chr(0x00100001), "\U00100001")
300 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
301 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
302 self.assertRaises(ValueError, chr, -1)
303 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000304 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000305
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000306 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000307 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000308
Walter Dörwald919497e2003-01-19 16:23:59 +0000309 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000310 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000311 bom = b'\xef\xbb\xbf'
312 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000313 compile(source='pass', filename='?', mode='exec')
314 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
315 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000316 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000317 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000318 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
319 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300320 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000321 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
322 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000323 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300324 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000325 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000326
Georg Brandl8334fd92010-12-04 10:26:46 +0000327 # test the optimize argument
328
329 codestr = '''def f():
330 """doc"""
331 try:
332 assert False
333 except AssertionError:
334 return (True, f.__doc__)
335 else:
336 return (False, f.__doc__)
337 '''
338 def f(): """doc"""
339 values = [(-1, __debug__, f.__doc__),
340 (0, True, 'doc'),
341 (1, False, 'doc'),
342 (2, False, None)]
343 for optval, debugval, docstring in values:
344 # test both direct compilation and compilation via AST
345 codeobjs = []
346 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
347 tree = ast.parse(codestr)
348 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
349 for code in codeobjs:
350 ns = {}
351 exec(code, ns)
352 rv = ns['f']()
353 self.assertEqual(rv, (debugval, docstring))
354
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000356 sys.spam = 1
357 delattr(sys, 'spam')
358 self.assertRaises(TypeError, delattr)
359
360 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000361 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000362 self.assertRaises(TypeError, dir, 42, 42)
363
Georg Brandle32b4222007-03-10 22:13:27 +0000364 # dir() - local scope
365 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000366 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000367
368 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000369 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000370
371 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000372 class Foo(types.ModuleType):
373 __dict__ = 8
374 f = Foo("foo")
375 self.assertRaises(TypeError, dir, f)
376
377 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000378 self.assertIn("strip", dir(str))
379 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000380
381 # dir(obj)
382 class Foo(object):
383 def __init__(self):
384 self.x = 7
385 self.y = 8
386 self.z = 9
387 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000388 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000389
390 # dir(obj_no__dict__)
391 class Foo(object):
392 __slots__ = []
393 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000394 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000395
396 # dir(obj_no__class__with__dict__)
397 # (an ugly trick to cause getattr(f, "__class__") to fail)
398 class Foo(object):
399 __slots__ = ["__class__", "__dict__"]
400 def __init__(self):
401 self.bar = "wow"
402 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000403 self.assertNotIn("__repr__", dir(f))
404 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000405
406 # dir(obj_using __dir__)
407 class Foo(object):
408 def __dir__(self):
409 return ["kan", "ga", "roo"]
410 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000411 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000412
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500413 # dir(obj__dir__tuple)
414 class Foo(object):
415 def __dir__(self):
416 return ("b", "c", "a")
417 res = dir(Foo())
418 self.assertIsInstance(res, list)
419 self.assertTrue(res == ["a", "b", "c"])
420
421 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000422 class Foo(object):
423 def __dir__(self):
424 return 7
425 f = Foo()
426 self.assertRaises(TypeError, dir, f)
427
Collin Winter3eed7652007-08-14 17:53:54 +0000428 # dir(traceback)
429 try:
430 raise IndexError
431 except:
432 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
433
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500434 # test that object has a __dir__()
435 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000436
Walter Dörwald919497e2003-01-19 16:23:59 +0000437 def test_divmod(self):
438 self.assertEqual(divmod(12, 7), (1, 5))
439 self.assertEqual(divmod(-12, 7), (-2, 2))
440 self.assertEqual(divmod(12, -7), (-2, -2))
441 self.assertEqual(divmod(-12, -7), (1, -5))
442
Mark Dickinson5c2db372009-12-05 20:28:34 +0000443 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000444
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000445 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
446 (-3.25, 1.0, (-4.0, 0.75)),
447 (3.25, -1.0, (-4.0, -0.75)),
448 (-3.25, -1.0, (3.0, -0.25))]:
449 result = divmod(num, denom)
450 self.assertAlmostEqual(result[0], exp_result[0])
451 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000452
453 self.assertRaises(TypeError, divmod)
454
455 def test_eval(self):
456 self.assertEqual(eval('1+1'), 2)
457 self.assertEqual(eval(' 1+1\n'), 2)
458 globals = {'a': 1, 'b': 2}
459 locals = {'b': 200, 'c': 300}
460 self.assertEqual(eval('a', globals) , 1)
461 self.assertEqual(eval('a', globals, locals), 1)
462 self.assertEqual(eval('b', globals, locals), 200)
463 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000464 globals = {'a': 1, 'b': 2}
465 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000466 bom = b'\xef\xbb\xbf'
467 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000468 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000469 self.assertRaises(TypeError, eval)
470 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000471 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000472
Benjamin Peterson92722792012-12-15 12:51:05 -0500473 class X:
474 def __getitem__(self, key):
475 raise ValueError
476 self.assertRaises(ValueError, eval, "foo", {}, X())
477
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000478 def test_general_eval(self):
479 # Tests that general mappings can be used for the locals argument
480
481 class M:
482 "Test mapping interface versus possible calls from eval()."
483 def __getitem__(self, key):
484 if key == 'a':
485 return 12
486 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000487 def keys(self):
488 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000489
490 m = M()
491 g = globals()
492 self.assertEqual(eval('a', g, m), 12)
493 self.assertRaises(NameError, eval, 'b', g, m)
494 self.assertEqual(eval('dir()', g, m), list('xyz'))
495 self.assertEqual(eval('globals()', g, m), g)
496 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000497 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000498 class A:
499 "Non-mapping"
500 pass
501 m = A()
502 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000503
504 # Verify that dict subclasses work as well
505 class D(dict):
506 def __getitem__(self, key):
507 if key == 'a':
508 return 12
509 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000510 def keys(self):
511 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000512
513 d = D()
514 self.assertEqual(eval('a', g, d), 12)
515 self.assertRaises(NameError, eval, 'b', g, d)
516 self.assertEqual(eval('dir()', g, d), list('xyz'))
517 self.assertEqual(eval('globals()', g, d), g)
518 self.assertEqual(eval('locals()', g, d), d)
519
520 # Verify locals stores (used by list comps)
521 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000522 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000523
524 class SpreadSheet:
525 "Sample application showing nested, calculated lookups."
526 _cells = {}
527 def __setitem__(self, key, formula):
528 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000529 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000530 return eval(self._cells[key], globals(), self)
531
532 ss = SpreadSheet()
533 ss['a1'] = '5'
534 ss['a2'] = 'a1*6'
535 ss['a3'] = 'a2*7'
536 self.assertEqual(ss['a3'], 210)
537
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000538 # Verify that dir() catches a non-list returned by eval
539 # SF bug #1004669
540 class C:
541 def __getitem__(self, item):
542 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000543 def keys(self):
544 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000545 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
546
Georg Brandl7cae87c2006-09-06 06:51:57 +0000547 def test_exec(self):
548 g = {}
549 exec('z = 1', g)
550 if '__builtins__' in g:
551 del g['__builtins__']
552 self.assertEqual(g, {'z': 1})
553
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000554 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000555 if '__builtins__' in g:
556 del g['__builtins__']
557 self.assertEqual(g, {'z': 2})
558 g = {}
559 l = {}
560
Brett Cannon77628992010-03-20 20:59:33 +0000561 with check_warnings():
562 warnings.filterwarnings("ignore", "global statement",
563 module="<string>")
564 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000565 if '__builtins__' in g:
566 del g['__builtins__']
567 if '__builtins__' in l:
568 del l['__builtins__']
569 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
570
Victor Stinnerb0b22422012-04-19 00:57:45 +0200571 def test_exec_globals(self):
572 code = compile("print('Hello World!')", "", "exec")
573 # no builtin function
574 self.assertRaisesRegex(NameError, "name 'print' is not defined",
575 exec, code, {'__builtins__': {}})
576 # __builtins__ must be a mapping type
577 self.assertRaises(TypeError,
578 exec, code, {'__builtins__': 123})
579
580 # no __build_class__ function
581 code = compile("class A: pass", "", "exec")
582 self.assertRaisesRegex(NameError, "__build_class__ not found",
583 exec, code, {'__builtins__': {}})
584
585 class frozendict_error(Exception):
586 pass
587
588 class frozendict(dict):
589 def __setitem__(self, key, value):
590 raise frozendict_error("frozendict is readonly")
591
592 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400593 if isinstance(__builtins__, types.ModuleType):
594 frozen_builtins = frozendict(__builtins__.__dict__)
595 else:
596 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200597 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
598 self.assertRaises(frozendict_error,
599 exec, code, {'__builtins__': frozen_builtins})
600
601 # read-only globals
602 namespace = frozendict({})
603 code = compile("x=1", "test", "exec")
604 self.assertRaises(frozendict_error,
605 exec, code, namespace)
606
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000607 def test_exec_redirected(self):
608 savestdout = sys.stdout
609 sys.stdout = None # Whatever that cannot flush()
610 try:
611 # Used to raise SystemError('error return without exception set')
612 exec('a')
613 except NameError:
614 pass
615 finally:
616 sys.stdout = savestdout
617
Walter Dörwald919497e2003-01-19 16:23:59 +0000618 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000619 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
620 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
621 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
622 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
623 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 def identity(item):
625 return 1
626 filter(identity, Squares(5))
627 self.assertRaises(TypeError, filter)
628 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000629 def __getitem__(self, index):
630 if index<4:
631 return 42
632 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000633 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000634 def badfunc():
635 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000636 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000637
Walter Dörwaldbf517072003-01-27 15:57:14 +0000638 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000639 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
640 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
641 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000642
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000643 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200644 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
645 f1 = filter(filter_char, "abcdeabcde")
646 f2 = filter(filter_char, "abcdeabcde")
647 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000648
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000650 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000651 self.assertRaises(TypeError, getattr, sys, 1)
652 self.assertRaises(TypeError, getattr, sys, 1, "foo")
653 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000654 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000655 # unicode surrogates are not encodable to the default encoding (utf8)
656 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000657
658 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000659 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 self.assertRaises(TypeError, hasattr, sys, 1)
661 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000662 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000663
Benjamin Peterson17689992010-08-24 03:26:23 +0000664 # Check that hasattr propagates all exceptions outside of
665 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000666 class A:
667 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000668 raise SystemExit
669 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000670 class B:
671 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000672 raise ValueError
673 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000674
Walter Dörwald919497e2003-01-19 16:23:59 +0000675 def test_hash(self):
676 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000677 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000678 self.assertEqual(hash(1), hash(1.0))
679 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000680 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 hash((0,1,2,3))
682 def f(): pass
683 self.assertRaises(TypeError, hash, [])
684 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685 # Bug 1536021: Allow hash to return long objects
686 class X:
687 def __hash__(self):
688 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000689 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000690 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691 def __hash__(self):
692 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000693 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000694
695 def test_hex(self):
696 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000697 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000698 self.assertRaises(TypeError, hex, {})
699
700 def test_id(self):
701 id(None)
702 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 id(1.0)
704 id('spam')
705 id((0,1,2,3))
706 id([0,1,2,3])
707 id({'spam': 1, 'eggs': 2, 'ham': 3})
708
Guido van Rossuma88a0332007-02-26 16:59:55 +0000709 # Test input() later, alphabetized as if it were raw_input
710
Walter Dörwald919497e2003-01-19 16:23:59 +0000711 def test_iter(self):
712 self.assertRaises(TypeError, iter)
713 self.assertRaises(TypeError, iter, 42, 42)
714 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000715 for l in lists:
716 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000717 self.assertEqual(next(i), '1')
718 self.assertEqual(next(i), '2')
719 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000720
721 def test_isinstance(self):
722 class C:
723 pass
724 class D(C):
725 pass
726 class E:
727 pass
728 c = C()
729 d = D()
730 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000731 self.assertTrue(isinstance(c, C))
732 self.assertTrue(isinstance(d, C))
733 self.assertTrue(not isinstance(e, C))
734 self.assertTrue(not isinstance(c, D))
735 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000736 self.assertRaises(TypeError, isinstance, E, 'foo')
737 self.assertRaises(TypeError, isinstance)
738
739 def test_issubclass(self):
740 class C:
741 pass
742 class D(C):
743 pass
744 class E:
745 pass
746 c = C()
747 d = D()
748 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000749 self.assertTrue(issubclass(D, C))
750 self.assertTrue(issubclass(C, C))
751 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000752 self.assertRaises(TypeError, issubclass, 'foo', E)
753 self.assertRaises(TypeError, issubclass, E, 'foo')
754 self.assertRaises(TypeError, issubclass)
755
756 def test_len(self):
757 self.assertEqual(len('123'), 3)
758 self.assertEqual(len(()), 0)
759 self.assertEqual(len((1, 2, 3, 4)), 4)
760 self.assertEqual(len([1, 2, 3, 4]), 4)
761 self.assertEqual(len({}), 0)
762 self.assertEqual(len({'a':1, 'b': 2}), 2)
763 class BadSeq:
764 def __len__(self):
765 raise ValueError
766 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000767 class InvalidLen:
768 def __len__(self):
769 return None
770 self.assertRaises(TypeError, len, InvalidLen())
771 class FloatLen:
772 def __len__(self):
773 return 4.5
774 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300775 class NegativeLen:
776 def __len__(self):
777 return -10
778 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000779 class HugeLen:
780 def __len__(self):
781 return sys.maxsize + 1
782 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300783 class HugeNegativeLen:
784 def __len__(self):
785 return -sys.maxsize-10
786 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000787 class NoLenMethod(object): pass
788 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000789
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 def test_map(self):
791 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000792 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000793 [1, 4, 9]
794 )
795 try:
796 from math import sqrt
797 except ImportError:
798 def sqrt(x):
799 return pow(x, 0.5)
800 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000801 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 [[4.0, 2.0], [9.0, 3.0]]
803 )
804 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000805 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000806 [10, 4, 6]
807 )
808
809 def plus(*v):
810 accu = 0
811 for i in v: accu = accu + i
812 return accu
813 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000814 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 [1, 3, 7]
816 )
817 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000818 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000819 [1+4, 3+9, 7+2]
820 )
821 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000822 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000823 [1+4+1, 3+9+1, 7+2+0]
824 )
825 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000826 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000827 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
828 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000829 def Max(a, b):
830 if a is None:
831 return b
832 if b is None:
833 return a
834 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000836 list(map(Max, Squares(3), Squares(2))),
837 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000838 )
839 self.assertRaises(TypeError, map)
840 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000842 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000843 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000844 yield None
845 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000846 def badfunc(x):
847 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000848 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000849
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000850 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200851 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
852 m1 = map(map_char, "Is this the real life?")
853 m2 = map(map_char, "Is this the real life?")
854 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000855
Walter Dörwald919497e2003-01-19 16:23:59 +0000856 def test_max(self):
857 self.assertEqual(max('123123'), '3')
858 self.assertEqual(max(1, 2, 3), 3)
859 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
860 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
861
Guido van Rossume2a383d2007-01-15 16:59:06 +0000862 self.assertEqual(max(1, 2, 3.0), 3.0)
863 self.assertEqual(max(1, 2.0, 3), 3)
864 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000865
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700866 self.assertRaises(TypeError, max)
867 self.assertRaises(TypeError, max, 42)
868 self.assertRaises(ValueError, max, ())
869 class BadSeq:
870 def __getitem__(self, index):
871 raise ValueError
872 self.assertRaises(ValueError, max, BadSeq())
873
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000874 for stmt in (
875 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700876 "max(default=None)",
877 "max(1, 2, default=None)", # require container for default
878 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000879 "max(1, key=int)", # single arg not iterable
880 "max(1, 2, keystone=int)", # wrong keyword
881 "max(1, 2, key=int, abc=int)", # two many keywords
882 "max(1, 2, key=1)", # keyfunc is not callable
883 ):
Tim Peters7f061872004-12-07 21:17:46 +0000884 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000885 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000886 except TypeError:
887 pass
888 else:
889 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000890
891 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
892 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
893 self.assertEqual(max(1, 2, key=neg), 1) # two elems
894
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700895 self.assertEqual(max((), default=None), None) # zero elem iterable
896 self.assertEqual(max((1,), default=None), 1) # one elem iterable
897 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
898
899 self.assertEqual(max((), default=1, key=neg), 1)
900 self.assertEqual(max((1, 2), default=3, key=neg), 1)
901
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000902 data = [random.randrange(200) for i in range(100)]
903 keys = dict((elem, random.randrange(50)) for elem in data)
904 f = keys.__getitem__
905 self.assertEqual(max(data, key=f),
906 sorted(reversed(data), key=f)[-1])
907
Walter Dörwald919497e2003-01-19 16:23:59 +0000908 def test_min(self):
909 self.assertEqual(min('123123'), '1')
910 self.assertEqual(min(1, 2, 3), 1)
911 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
912 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
913
Guido van Rossume2a383d2007-01-15 16:59:06 +0000914 self.assertEqual(min(1, 2, 3.0), 1)
915 self.assertEqual(min(1, 2.0, 3), 1)
916 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000917
918 self.assertRaises(TypeError, min)
919 self.assertRaises(TypeError, min, 42)
920 self.assertRaises(ValueError, min, ())
921 class BadSeq:
922 def __getitem__(self, index):
923 raise ValueError
924 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000925
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000926 for stmt in (
927 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700928 "min(default=None)",
929 "min(1, 2, default=None)", # require container for default
930 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000931 "min(1, key=int)", # single arg not iterable
932 "min(1, 2, keystone=int)", # wrong keyword
933 "min(1, 2, key=int, abc=int)", # two many keywords
934 "min(1, 2, key=1)", # keyfunc is not callable
935 ):
Tim Peters7f061872004-12-07 21:17:46 +0000936 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000937 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000938 except TypeError:
939 pass
940 else:
941 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000942
943 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
944 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
945 self.assertEqual(min(1, 2, key=neg), 2) # two elems
946
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700947 self.assertEqual(min((), default=None), None) # zero elem iterable
948 self.assertEqual(min((1,), default=None), 1) # one elem iterable
949 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
950
951 self.assertEqual(min((), default=1, key=neg), 1)
952 self.assertEqual(min((1, 2), default=1, key=neg), 2)
953
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000954 data = [random.randrange(200) for i in range(100)]
955 keys = dict((elem, random.randrange(50)) for elem in data)
956 f = keys.__getitem__
957 self.assertEqual(min(data, key=f),
958 sorted(data, key=f)[0])
959
Georg Brandla18af4e2007-04-21 15:47:16 +0000960 def test_next(self):
961 it = iter(range(2))
962 self.assertEqual(next(it), 0)
963 self.assertEqual(next(it), 1)
964 self.assertRaises(StopIteration, next, it)
965 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000966 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000967
968 class Iter(object):
969 def __iter__(self):
970 return self
971 def __next__(self):
972 raise StopIteration
973
974 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000975 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000976 self.assertRaises(StopIteration, next, it)
977
978 def gen():
979 yield 1
980 return
981
982 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000983 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000984 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000985 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000986
Walter Dörwald919497e2003-01-19 16:23:59 +0000987 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000988 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000989 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000990 self.assertRaises(TypeError, oct, ())
991
992 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000993 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +0200995 self.addCleanup(unlink, TESTFN)
996 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +0000997 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000998 fp.write('The quick brown fox jumps over the lazy dog')
999 fp.write('.\n')
1000 fp.write('Dear John\n')
1001 fp.write('XXX'*100)
1002 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001003
1004 def test_open(self):
1005 self.write_testfile()
1006 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001007 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001008 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001009 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1010 self.assertEqual(fp.readline(4), 'Dear')
1011 self.assertEqual(fp.readline(100), ' John\n')
1012 self.assertEqual(fp.read(300), 'XXX'*100)
1013 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001014
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +03001015 # embedded null bytes and characters
1016 self.assertRaises(ValueError, open, 'a\x00b')
1017 self.assertRaises(ValueError, open, b'a\x00b')
1018
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001019 def test_open_default_encoding(self):
1020 old_environ = dict(os.environ)
1021 try:
1022 # try to get a user preferred encoding different than the current
1023 # locale encoding to check that open() uses the current locale
1024 # encoding and not the user preferred encoding
1025 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1026 if key in os.environ:
1027 del os.environ[key]
1028
1029 self.write_testfile()
1030 current_locale_encoding = locale.getpreferredencoding(False)
1031 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001032 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001033 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001034 finally:
1035 os.environ.clear()
1036 os.environ.update(old_environ)
1037
Victor Stinnerdaf45552013-08-28 00:53:59 +02001038 def test_open_non_inheritable(self):
1039 fileobj = open(__file__)
1040 with fileobj:
1041 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1042
Walter Dörwald919497e2003-01-19 16:23:59 +00001043 def test_ord(self):
1044 self.assertEqual(ord(' '), 32)
1045 self.assertEqual(ord('A'), 65)
1046 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001047 self.assertEqual(ord('\x80'), 128)
1048 self.assertEqual(ord('\xff'), 255)
1049
1050 self.assertEqual(ord(b' '), 32)
1051 self.assertEqual(ord(b'A'), 65)
1052 self.assertEqual(ord(b'a'), 97)
1053 self.assertEqual(ord(b'\x80'), 128)
1054 self.assertEqual(ord(b'\xff'), 255)
1055
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001056 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001057 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001058
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001059 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1060 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1061 self.assertEqual(ord("\U00010000"), 0x00010000)
1062 self.assertEqual(ord("\U00010001"), 0x00010001)
1063 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1064 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1065 self.assertEqual(ord("\U00100000"), 0x00100000)
1066 self.assertEqual(ord("\U00100001"), 0x00100001)
1067 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1068 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 def test_pow(self):
1071 self.assertEqual(pow(0,0), 1)
1072 self.assertEqual(pow(0,1), 0)
1073 self.assertEqual(pow(1,0), 1)
1074 self.assertEqual(pow(1,1), 1)
1075
1076 self.assertEqual(pow(2,0), 1)
1077 self.assertEqual(pow(2,10), 1024)
1078 self.assertEqual(pow(2,20), 1024*1024)
1079 self.assertEqual(pow(2,30), 1024*1024*1024)
1080
1081 self.assertEqual(pow(-2,0), 1)
1082 self.assertEqual(pow(-2,1), -2)
1083 self.assertEqual(pow(-2,2), 4)
1084 self.assertEqual(pow(-2,3), -8)
1085
Walter Dörwald919497e2003-01-19 16:23:59 +00001086 self.assertAlmostEqual(pow(0.,0), 1.)
1087 self.assertAlmostEqual(pow(0.,1), 0.)
1088 self.assertAlmostEqual(pow(1.,0), 1.)
1089 self.assertAlmostEqual(pow(1.,1), 1.)
1090
1091 self.assertAlmostEqual(pow(2.,0), 1.)
1092 self.assertAlmostEqual(pow(2.,10), 1024.)
1093 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1094 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1095
1096 self.assertAlmostEqual(pow(-2.,0), 1.)
1097 self.assertAlmostEqual(pow(-2.,1), -2.)
1098 self.assertAlmostEqual(pow(-2.,2), 4.)
1099 self.assertAlmostEqual(pow(-2.,3), -8.)
1100
Mark Dickinson5c2db372009-12-05 20:28:34 +00001101 for x in 2, 2.0:
1102 for y in 10, 10.0:
1103 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001104 if isinstance(x, float) or \
1105 isinstance(y, float) or \
1106 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001107 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001108 else:
1109 self.assertAlmostEqual(pow(x, y, z), 24.0)
1110
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001111 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1112 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1113
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001114 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001115 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001116
1117 self.assertRaises(TypeError, pow)
1118
Guido van Rossuma88a0332007-02-26 16:59:55 +00001119 def test_input(self):
1120 self.write_testfile()
1121 fp = open(TESTFN, 'r')
1122 savestdin = sys.stdin
1123 savestdout = sys.stdout # Eats the echo
1124 try:
1125 sys.stdin = fp
1126 sys.stdout = BitBucket()
1127 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001128 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1129 self.assertEqual(input('testing\n'), 'Dear John')
1130
1131 # SF 1535165: don't segfault on closed stdin
1132 # sys.stdout must be a regular file for triggering
1133 sys.stdout = savestdout
1134 sys.stdin.close()
1135 self.assertRaises(ValueError, input)
1136
1137 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001138 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001139 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001140 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001141 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001142 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001143 self.assertRaises(EOFError, input)
1144
1145 del sys.stdout
1146 self.assertRaises(RuntimeError, input, 'prompt')
1147 del sys.stdin
1148 self.assertRaises(RuntimeError, input, 'prompt')
1149 finally:
1150 sys.stdin = savestdin
1151 sys.stdout = savestdout
1152 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001153
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001154 # test_int(): see test_int.py for tests of built-in function int().
1155
Walter Dörwald919497e2003-01-19 16:23:59 +00001156 def test_repr(self):
1157 self.assertEqual(repr(''), '\'\'')
1158 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 self.assertEqual(repr(()), '()')
1160 self.assertEqual(repr([]), '[]')
1161 self.assertEqual(repr({}), '{}')
1162 a = []
1163 a.append(a)
1164 self.assertEqual(repr(a), '[[...]]')
1165 a = {}
1166 a[0] = a
1167 self.assertEqual(repr(a), '{0: {...}}')
1168
1169 def test_round(self):
1170 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001171 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001172 self.assertEqual(round(1.0), 1.0)
1173 self.assertEqual(round(10.0), 10.0)
1174 self.assertEqual(round(1000000000.0), 1000000000.0)
1175 self.assertEqual(round(1e20), 1e20)
1176
1177 self.assertEqual(round(-1.0), -1.0)
1178 self.assertEqual(round(-10.0), -10.0)
1179 self.assertEqual(round(-1000000000.0), -1000000000.0)
1180 self.assertEqual(round(-1e20), -1e20)
1181
1182 self.assertEqual(round(0.1), 0.0)
1183 self.assertEqual(round(1.1), 1.0)
1184 self.assertEqual(round(10.1), 10.0)
1185 self.assertEqual(round(1000000000.1), 1000000000.0)
1186
1187 self.assertEqual(round(-1.1), -1.0)
1188 self.assertEqual(round(-10.1), -10.0)
1189 self.assertEqual(round(-1000000000.1), -1000000000.0)
1190
1191 self.assertEqual(round(0.9), 1.0)
1192 self.assertEqual(round(9.9), 10.0)
1193 self.assertEqual(round(999999999.9), 1000000000.0)
1194
1195 self.assertEqual(round(-0.9), -1.0)
1196 self.assertEqual(round(-9.9), -10.0)
1197 self.assertEqual(round(-999999999.9), -1000000000.0)
1198
1199 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001200 self.assertEqual(type(round(-8.0, -1)), float)
1201
1202 self.assertEqual(type(round(-8.0, 0)), float)
1203 self.assertEqual(type(round(-8.0, 1)), float)
1204
1205 # Check even / odd rounding behaviour
1206 self.assertEqual(round(5.5), 6)
1207 self.assertEqual(round(6.5), 6)
1208 self.assertEqual(round(-5.5), -6)
1209 self.assertEqual(round(-6.5), -6)
1210
1211 # Check behavior on ints
1212 self.assertEqual(round(0), 0)
1213 self.assertEqual(round(8), 8)
1214 self.assertEqual(round(-8), -8)
1215 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001216 self.assertEqual(type(round(-8, -1)), int)
1217 self.assertEqual(type(round(-8, 0)), int)
1218 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001219
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001220 # test new kwargs
1221 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1222
Walter Dörwald919497e2003-01-19 16:23:59 +00001223 self.assertRaises(TypeError, round)
1224
Alex Martelliae211f92007-08-22 23:21:33 +00001225 # test generic rounding delegation for reals
1226 class TestRound:
1227 def __round__(self):
1228 return 23
1229
1230 class TestNoRound:
1231 pass
1232
1233 self.assertEqual(round(TestRound()), 23)
1234
1235 self.assertRaises(TypeError, round, 1, 2, 3)
1236 self.assertRaises(TypeError, round, TestNoRound())
1237
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001238 t = TestNoRound()
1239 t.__round__ = lambda *args: args
1240 self.assertRaises(TypeError, round, t)
1241 self.assertRaises(TypeError, round, t, 0)
1242
Mark Dickinsonad731b92009-11-09 17:12:30 +00001243 # Some versions of glibc for alpha have a bug that affects
1244 # float -> integer rounding (floor, ceil, rint, round) for
1245 # values in the range [2**52, 2**53). See:
1246 #
1247 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1248 #
1249 # We skip this test on Linux/alpha if it would fail.
1250 linux_alpha = (platform.system().startswith('Linux') and
1251 platform.machine().startswith('alpha'))
1252 system_round_bug = round(5e15+1) != 5e15+1
1253 @unittest.skipIf(linux_alpha and system_round_bug,
1254 "test will fail; failure is probably due to a "
1255 "buggy system round function")
1256 def test_round_large(self):
1257 # Issue #1869: integral floats should remain unchanged
1258 self.assertEqual(round(5e15-1), 5e15-1)
1259 self.assertEqual(round(5e15), 5e15)
1260 self.assertEqual(round(5e15+1), 5e15+1)
1261 self.assertEqual(round(5e15+2), 5e15+2)
1262 self.assertEqual(round(5e15+3), 5e15+3)
1263
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001264 def test_bug_27936(self):
1265 # Verify that ndigits=None means the same as passing in no argument
1266 for x in [1234,
1267 1234.56,
1268 decimal.Decimal('1234.56'),
1269 fractions.Fraction(123456, 100)]:
1270 self.assertEqual(round(x, None), round(x))
1271 self.assertEqual(type(round(x, None)), type(round(x)))
1272
Walter Dörwald919497e2003-01-19 16:23:59 +00001273 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001274 setattr(sys, 'spam', 1)
1275 self.assertEqual(sys.spam, 1)
1276 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1277 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001278
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001279 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001280
Alex Martellia70b1912003-04-22 08:12:33 +00001281 def test_sum(self):
1282 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001283 self.assertEqual(sum(list(range(2,8))), 27)
1284 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001285 self.assertEqual(sum(Squares(10)), 285)
1286 self.assertEqual(sum(iter(Squares(10))), 285)
1287 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1288
1289 self.assertRaises(TypeError, sum)
1290 self.assertRaises(TypeError, sum, 42)
1291 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1292 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001293 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1294 values = [bytearray(b'a'), bytearray(b'b')]
1295 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001296 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1297 self.assertRaises(TypeError, sum, [{2:3}])
1298 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1299
1300 class BadSeq:
1301 def __getitem__(self, index):
1302 raise ValueError
1303 self.assertRaises(ValueError, sum, BadSeq())
1304
Mark Dickinson3a22b472009-10-17 21:48:16 +00001305 empty = []
1306 sum(([x] for x in range(10)), empty)
1307 self.assertEqual(empty, [])
1308
Walter Dörwald919497e2003-01-19 16:23:59 +00001309 def test_type(self):
1310 self.assertEqual(type(''), type('123'))
1311 self.assertNotEqual(type(''), type(()))
1312
Guido van Rossumfee7b932005-01-16 00:21:28 +00001313 # We don't want self in vars(), so these are static methods
1314
1315 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001316 def get_vars_f0():
1317 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001318
Guido van Rossumfee7b932005-01-16 00:21:28 +00001319 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001320 def get_vars_f2():
1321 BuiltinTest.get_vars_f0()
1322 a = 1
1323 b = 2
1324 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001325
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001326 class C_get_vars(object):
1327 def getDict(self):
1328 return {'a':2}
1329 __dict__ = property(fget=getDict)
1330
Walter Dörwald919497e2003-01-19 16:23:59 +00001331 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001332 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001333 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001334 self.assertEqual(self.get_vars_f0(), {})
1335 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1336 self.assertRaises(TypeError, vars, 42, 42)
1337 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001338 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001339
1340 def test_zip(self):
1341 a = (1, 2, 3)
1342 b = (4, 5, 6)
1343 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001344 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001345 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001346 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001347 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001348 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001349 class I:
1350 def __getitem__(self, i):
1351 if i < 0 or i > 2: raise IndexError
1352 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001353 self.assertEqual(list(zip(a, I())), t)
1354 self.assertEqual(list(zip()), [])
1355 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001356 self.assertRaises(TypeError, zip, None)
1357 class G:
1358 pass
1359 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001360 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001361
1362 # Make sure zip doesn't try to allocate a billion elements for the
1363 # result list when one of its arguments doesn't say how long it is.
1364 # A MemoryError is the most likely failure mode.
1365 class SequenceWithoutALength:
1366 def __getitem__(self, i):
1367 if i == 5:
1368 raise IndexError
1369 else:
1370 return i
1371 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001372 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001373 list(enumerate(range(5)))
1374 )
1375
1376 class BadSeq:
1377 def __getitem__(self, i):
1378 if i == 5:
1379 raise ValueError
1380 else:
1381 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001382 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001383
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001384 def test_zip_pickle(self):
1385 a = (1, 2, 3)
1386 b = (4, 5, 6)
1387 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001388 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1389 z1 = zip(a, b)
1390 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001391
Eric Smithe4d63172010-09-13 20:48:43 +00001392 def test_format(self):
1393 # Test the basic machinery of the format() builtin. Don't test
1394 # the specifics of the various formatters
1395 self.assertEqual(format(3, ''), '3')
1396
1397 # Returns some classes to use for various tests. There's
1398 # an old-style version, and a new-style version
1399 def classes_new():
1400 class A(object):
1401 def __init__(self, x):
1402 self.x = x
1403 def __format__(self, format_spec):
1404 return str(self.x) + format_spec
1405 class DerivedFromA(A):
1406 pass
1407
1408 class Simple(object): pass
1409 class DerivedFromSimple(Simple):
1410 def __init__(self, x):
1411 self.x = x
1412 def __format__(self, format_spec):
1413 return str(self.x) + format_spec
1414 class DerivedFromSimple2(DerivedFromSimple): pass
1415 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1416
1417 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1418 self.assertEqual(format(A(3), 'spec'), '3spec')
1419 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1420 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1421 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1422 '10abcdef')
1423
1424 class_test(*classes_new())
1425
1426 def empty_format_spec(value):
1427 # test that:
1428 # format(x, '') == str(x)
1429 # format(x) == str(x)
1430 self.assertEqual(format(value, ""), str(value))
1431 self.assertEqual(format(value), str(value))
1432
1433 # for builtin types, format(x, "") == str(x)
1434 empty_format_spec(17**13)
1435 empty_format_spec(1.0)
1436 empty_format_spec(3.1415e104)
1437 empty_format_spec(-3.1415e104)
1438 empty_format_spec(3.1415e-104)
1439 empty_format_spec(-3.1415e-104)
1440 empty_format_spec(object)
1441 empty_format_spec(None)
1442
1443 # TypeError because self.__format__ returns the wrong type
1444 class BadFormatResult:
1445 def __format__(self, format_spec):
1446 return 1.0
1447 self.assertRaises(TypeError, format, BadFormatResult(), "")
1448
1449 # TypeError because format_spec is not unicode or str
1450 self.assertRaises(TypeError, format, object(), 4)
1451 self.assertRaises(TypeError, format, object(), object())
1452
1453 # tests for object.__format__ really belong elsewhere, but
1454 # there's no good place to put them
1455 x = object().__format__('')
1456 self.assertTrue(x.startswith('<object object at'))
1457
1458 # first argument to object.__format__ must be string
1459 self.assertRaises(TypeError, object().__format__, 3)
1460 self.assertRaises(TypeError, object().__format__, object())
1461 self.assertRaises(TypeError, object().__format__, None)
1462
1463 # --------------------------------------------------------------------
1464 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001465 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001466 class A:
1467 def __format__(self, fmt_str):
1468 return format('', fmt_str)
1469
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001470 self.assertEqual(format(A()), '')
1471 self.assertEqual(format(A(), ''), '')
1472 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001473
1474 class B:
1475 pass
1476
1477 class C(object):
1478 pass
1479
1480 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001481 obj = cls()
1482 self.assertEqual(format(obj), str(obj))
1483 self.assertEqual(format(obj, ''), str(obj))
1484 with self.assertRaisesRegex(TypeError,
1485 r'\b%s\b' % re.escape(cls.__name__)):
1486 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001487 # --------------------------------------------------------------------
1488
1489 # make sure we can take a subclass of str as a format spec
1490 class DerivedFromStr(str): pass
1491 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1492
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001493 def test_bin(self):
1494 self.assertEqual(bin(0), '0b0')
1495 self.assertEqual(bin(1), '0b1')
1496 self.assertEqual(bin(-1), '-0b1')
1497 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1498 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1499 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1500 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1501
Georg Brandl953152f2009-07-22 12:03:59 +00001502 def test_bytearray_translate(self):
1503 x = bytearray(b"abc")
1504 self.assertRaises(ValueError, x.translate, b"1", 1)
1505 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1506
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001507 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001508 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001509 tp = type(const)
1510 self.assertIs(tp(), const)
1511 self.assertRaises(TypeError, tp, 1, 2)
1512 self.assertRaises(TypeError, tp, a=1, b=2)
1513
Martin Panterc9a6ab52015-10-10 01:25:38 +00001514@unittest.skipUnless(pty, "the pty and signal modules must be available")
1515class PtyTests(unittest.TestCase):
1516 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1517 terminals in the test environment"""
1518
Martin Pantere44dba32015-10-10 05:27:15 +00001519 def run_child(self, child, terminal_input):
1520 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001521 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001522 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001523 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001524 os.close(r)
1525 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001526 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001527 raise
1528 if pid == 0:
1529 # Child
1530 try:
1531 # Make sure we don't get stuck if there's a problem
1532 signal.alarm(2)
1533 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001534 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001535 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001536 except:
1537 traceback.print_exc()
1538 finally:
1539 # We don't want to return to unittest...
1540 os._exit(0)
1541 # Parent
1542 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001543 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001544 # Get results from the pipe
1545 with open(r, "r") as rpipe:
1546 lines = []
1547 while True:
1548 line = rpipe.readline().strip()
1549 if line == "":
1550 # The other end was closed => the child exited
1551 break
1552 lines.append(line)
1553 # Check the result was got and corresponds to the user's terminal input
1554 if len(lines) != 2:
1555 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001556 # Beware of Linux raising EIO when the slave is closed
1557 child_output = bytearray()
1558 while True:
1559 try:
1560 chunk = os.read(fd, 3000)
1561 except OSError: # Assume EIO
1562 break
1563 if not chunk:
1564 break
1565 child_output.extend(chunk)
1566 os.close(fd)
1567 child_output = child_output.decode("ascii", "ignore")
1568 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1569 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001570 os.close(fd)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001571
Victor Stinner3ca9f502017-08-09 23:08:22 +02001572 # Wait until the child process completes
1573 os.waitpid(pid, 0)
Victor Stinner4baca1b2017-08-09 17:44:19 +02001574
Martin Pantere44dba32015-10-10 05:27:15 +00001575 return lines
1576
1577 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1578 if not sys.stdin.isatty() or not sys.stdout.isatty():
1579 self.skipTest("stdin and stdout must be ttys")
1580 def child(wpipe):
1581 # Check the error handlers are accounted for
1582 if stdio_encoding:
1583 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1584 encoding=stdio_encoding,
1585 errors='surrogateescape')
1586 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1587 encoding=stdio_encoding,
1588 errors='replace')
1589 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1590 print(ascii(input(prompt)), file=wpipe)
1591 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001592 # Check we did exercise the GNU readline path
1593 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1594 if lines[0] != 'tty = True':
1595 self.skipTest("standard IO in should have been a tty")
1596 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1597 if stdio_encoding:
1598 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1599 else:
1600 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1601 self.assertEqual(input_result, expected)
1602
1603 def test_input_tty(self):
1604 # Test input() functionality when wired to a tty (the code path
1605 # is different and invokes GNU readline if available).
1606 self.check_input_tty("prompt", b"quux")
1607
1608 def test_input_tty_non_ascii(self):
1609 # Check stdin/stdout encoding is used when invoking GNU readline
1610 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1611
1612 def test_input_tty_non_ascii_unicode_errors(self):
1613 # Check stdin/stdout error handler is used when invoking GNU readline
1614 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1615
1616 def test_input_no_stdout_fileno(self):
1617 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1618 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001619 def child(wpipe):
1620 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1621 sys.stdout = io.StringIO() # Does not support fileno()
1622 input("prompt")
1623 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1624 lines = self.run_child(child, b"quux\r")
1625 expected = (
1626 "stdin.isatty(): True",
1627 "captured: 'prompt'",
1628 )
1629 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001630
Raymond Hettinger64958a12003-12-17 20:43:33 +00001631class TestSorted(unittest.TestCase):
1632
1633 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001634 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001635 copy = data[:]
1636 random.shuffle(copy)
1637 self.assertEqual(data, sorted(copy))
1638 self.assertNotEqual(data, copy)
1639
1640 data.reverse()
1641 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001642 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1643 self.assertNotEqual(data, copy)
1644 random.shuffle(copy)
1645 self.assertEqual(data, sorted(copy, reverse=1))
1646 self.assertNotEqual(data, copy)
1647
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001648 def test_bad_arguments(self):
1649 # Issue #29327: The first argument is positional-only.
1650 sorted([])
1651 with self.assertRaises(TypeError):
1652 sorted(iterable=[])
1653 # Other arguments are keyword-only
1654 sorted([], key=None)
1655 with self.assertRaises(TypeError):
1656 sorted([], None)
1657
Raymond Hettinger64958a12003-12-17 20:43:33 +00001658 def test_inputtypes(self):
1659 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001660 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001661 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001662 self.assertEqual(sorted(s), sorted(T(s)))
1663
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001664 s = ''.join(set(s)) # unique letters only
1665 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001666 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001667 self.assertEqual(sorted(s), sorted(T(s)))
1668
1669 def test_baddecorator(self):
1670 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1671 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1672
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001673
1674class ShutdownTest(unittest.TestCase):
1675
1676 def test_cleanup(self):
1677 # Issue #19255: builtins are still available at shutdown
1678 code = """if 1:
1679 import builtins
1680 import sys
1681
1682 class C:
1683 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001684 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001685 # Check that builtins still exist
1686 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001687 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001688
1689 c = C()
1690 # Make this module survive until builtins and sys are cleaned
1691 builtins.here = sys.modules[__name__]
1692 sys.here = sys.modules[__name__]
1693 # Create a reference loop so that this module needs to go
1694 # through a GC phase.
1695 here = sys.modules[__name__]
1696 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001697 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1698 # otherwise the codec may be unloaded before C.__del__() is called, and
1699 # so print("before") fails because the codec cannot be used to encode
1700 # "before" to sys.stdout.encoding. For example, on Windows,
1701 # sys.stdout.encoding is the OEM code page and these code pages are
1702 # implemented in Python
1703 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001704 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001705 self.assertEqual(["before", "after"], out.decode().splitlines())
1706
1707
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001708class TestType(unittest.TestCase):
1709 def test_new_type(self):
1710 A = type('A', (), {})
1711 self.assertEqual(A.__name__, 'A')
1712 self.assertEqual(A.__qualname__, 'A')
1713 self.assertEqual(A.__module__, __name__)
1714 self.assertEqual(A.__bases__, (object,))
1715 self.assertIs(A.__base__, object)
1716 x = A()
1717 self.assertIs(type(x), A)
1718 self.assertIs(x.__class__, A)
1719
1720 class B:
1721 def ham(self):
1722 return 'ham%d' % self
1723 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1724 self.assertEqual(C.__name__, 'C')
1725 self.assertEqual(C.__qualname__, 'C')
1726 self.assertEqual(C.__module__, __name__)
1727 self.assertEqual(C.__bases__, (B, int))
1728 self.assertIs(C.__base__, int)
1729 self.assertIn('spam', C.__dict__)
1730 self.assertNotIn('ham', C.__dict__)
1731 x = C(42)
1732 self.assertEqual(x, 42)
1733 self.assertIs(type(x), C)
1734 self.assertIs(x.__class__, C)
1735 self.assertEqual(x.ham(), 'ham42')
1736 self.assertEqual(x.spam(), 'spam42')
1737 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1738
Nick Coghland78448e2016-07-30 16:26:03 +10001739 def test_type_nokwargs(self):
1740 with self.assertRaises(TypeError):
1741 type('a', (), {}, x=5)
1742 with self.assertRaises(TypeError):
1743 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001744
1745 def test_type_name(self):
1746 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1747 with self.subTest(name=name):
1748 A = type(name, (), {})
1749 self.assertEqual(A.__name__, name)
1750 self.assertEqual(A.__qualname__, name)
1751 self.assertEqual(A.__module__, __name__)
1752 with self.assertRaises(ValueError):
1753 type('A\x00B', (), {})
1754 with self.assertRaises(ValueError):
1755 type('A\udcdcB', (), {})
1756 with self.assertRaises(TypeError):
1757 type(b'A', (), {})
1758
1759 C = type('C', (), {})
1760 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1761 with self.subTest(name=name):
1762 C.__name__ = name
1763 self.assertEqual(C.__name__, name)
1764 self.assertEqual(C.__qualname__, 'C')
1765 self.assertEqual(C.__module__, __name__)
1766
1767 A = type('C', (), {})
1768 with self.assertRaises(ValueError):
1769 A.__name__ = 'A\x00B'
1770 self.assertEqual(A.__name__, 'C')
1771 with self.assertRaises(ValueError):
1772 A.__name__ = 'A\udcdcB'
1773 self.assertEqual(A.__name__, 'C')
1774 with self.assertRaises(TypeError):
1775 A.__name__ = b'A'
1776 self.assertEqual(A.__name__, 'C')
1777
1778 def test_type_qualname(self):
1779 A = type('A', (), {'__qualname__': 'B.C'})
1780 self.assertEqual(A.__name__, 'A')
1781 self.assertEqual(A.__qualname__, 'B.C')
1782 self.assertEqual(A.__module__, __name__)
1783 with self.assertRaises(TypeError):
1784 type('A', (), {'__qualname__': b'B'})
1785 self.assertEqual(A.__qualname__, 'B.C')
1786
1787 A.__qualname__ = 'D.E'
1788 self.assertEqual(A.__name__, 'A')
1789 self.assertEqual(A.__qualname__, 'D.E')
1790 with self.assertRaises(TypeError):
1791 A.__qualname__ = b'B'
1792 self.assertEqual(A.__qualname__, 'D.E')
1793
1794 def test_type_doc(self):
1795 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1796 A = type('A', (), {'__doc__': doc})
1797 self.assertEqual(A.__doc__, doc)
1798 with self.assertRaises(UnicodeEncodeError):
1799 type('A', (), {'__doc__': 'x\udcdcy'})
1800
1801 A = type('A', (), {})
1802 self.assertEqual(A.__doc__, None)
1803 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1804 A.__doc__ = doc
1805 self.assertEqual(A.__doc__, doc)
1806
1807 def test_bad_args(self):
1808 with self.assertRaises(TypeError):
1809 type()
1810 with self.assertRaises(TypeError):
1811 type('A', ())
1812 with self.assertRaises(TypeError):
1813 type('A', (), {}, ())
1814 with self.assertRaises(TypeError):
1815 type('A', (), dict={})
1816 with self.assertRaises(TypeError):
1817 type('A', [], {})
1818 with self.assertRaises(TypeError):
1819 type('A', (), types.MappingProxyType({}))
1820 with self.assertRaises(TypeError):
1821 type('A', (None,), {})
1822 with self.assertRaises(TypeError):
1823 type('A', (bool,), {})
1824 with self.assertRaises(TypeError):
1825 type('A', (int, str), {})
1826
1827 def test_bad_slots(self):
1828 with self.assertRaises(TypeError):
1829 type('A', (), {'__slots__': b'x'})
1830 with self.assertRaises(TypeError):
1831 type('A', (int,), {'__slots__': 'x'})
1832 with self.assertRaises(TypeError):
1833 type('A', (), {'__slots__': ''})
1834 with self.assertRaises(TypeError):
1835 type('A', (), {'__slots__': '42'})
1836 with self.assertRaises(TypeError):
1837 type('A', (), {'__slots__': 'x\x00y'})
1838 with self.assertRaises(ValueError):
1839 type('A', (), {'__slots__': 'x', 'x': 0})
1840 with self.assertRaises(TypeError):
1841 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1842 with self.assertRaises(TypeError):
1843 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1844
1845 class B:
1846 pass
1847 with self.assertRaises(TypeError):
1848 type('A', (B,), {'__slots__': '__dict__'})
1849 with self.assertRaises(TypeError):
1850 type('A', (B,), {'__slots__': '__weakref__'})
1851
1852
Zachary Warea4b7a752013-11-24 01:19:09 -06001853def load_tests(loader, tests, pattern):
1854 from doctest import DocTestSuite
1855 tests.addTest(DocTestSuite(builtins))
1856 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001857
1858if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001859 unittest.main()