blob: c0343eff689da672c6a4b239fe829ce823f13540 [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
14import sys
15import traceback
16import types
17import unittest
18import warnings
Eric Snow92a6c172016-09-05 14:50:11 -070019from collections import OrderedDict
Victor Stinnerf86a5e82012-06-05 13:43:22 +020020from operator import neg
Eric Snow92a6c172016-09-05 14:50:11 -070021from test.support import (TESTFN, unlink, run_unittest, check_warnings,
22 cpython_only)
Berker Peksagce643912015-05-06 06:33:17 +030023from test.support.script_helper import assert_python_ok
Antoine Pitrou0d776b12011-11-06 00:34:26 +010024try:
Antoine Pitrou772add72011-11-06 02:37:42 +010025 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010026except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010027 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000028
Guido van Rossum3bead091992-01-27 17:00:37 +000029
Walter Dörwald919497e2003-01-19 16:23:59 +000030class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000031
Walter Dörwald919497e2003-01-19 16:23:59 +000032 def __init__(self, max):
33 self.max = max
34 self.sofar = []
35
36 def __len__(self): return len(self.sofar)
37
38 def __getitem__(self, i):
39 if not 0 <= i < self.max: raise IndexError
40 n = len(self.sofar)
41 while n <= i:
42 self.sofar.append(n*n)
43 n += 1
44 return self.sofar[i]
45
46class StrSquares:
47
48 def __init__(self, max):
49 self.max = max
50 self.sofar = []
51
52 def __len__(self):
53 return len(self.sofar)
54
55 def __getitem__(self, i):
56 if not 0 <= i < self.max:
57 raise IndexError
58 n = len(self.sofar)
59 while n <= i:
60 self.sofar.append(str(n*n))
61 n += 1
62 return self.sofar[i]
63
64class BitBucket:
65 def write(self, line):
66 pass
67
Facundo Batista2336bdd2008-01-19 19:12:01 +000068test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000069 ('0', 0),
70 ('1', 1),
71 ('9', 9),
72 ('10', 10),
73 ('99', 99),
74 ('100', 100),
75 ('314', 314),
76 (' 314', 314),
77 ('314 ', 314),
78 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000079 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000080 (' 1x', ValueError),
81 (' 1 ', 1),
82 (' 1\02 ', ValueError),
83 ('', ValueError),
84 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000085 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040086 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000087 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000088]
89
Facundo Batista2336bdd2008-01-19 19:12:01 +000090test_conv_sign = [
91 ('0', 0),
92 ('1', 1),
93 ('9', 9),
94 ('10', 10),
95 ('99', 99),
96 ('100', 100),
97 ('314', 314),
98 (' 314', ValueError),
99 ('314 ', 314),
100 (' \t\t 314 \t\t ', ValueError),
101 (repr(sys.maxsize), sys.maxsize),
102 (' 1x', ValueError),
103 (' 1 ', ValueError),
104 (' 1\02 ', ValueError),
105 ('', ValueError),
106 (' ', ValueError),
107 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400108 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000109 (chr(0x200), ValueError),
110]
111
Raymond Hettinger96229b12005-03-11 06:49:40 +0000112class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000113 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000114 raise RuntimeError
115
116class TestFailingIter:
117 def __iter__(self):
118 raise RuntimeError
119
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000120def filter_char(arg):
121 return ord(arg) > ord("d")
122
123def map_char(arg):
124 return chr(ord(arg)+1)
125
Walter Dörwald919497e2003-01-19 16:23:59 +0000126class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000127 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200128 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000129 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200130 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000131 it = pickle.loads(d)
132 self.assertEqual(type(itorg), type(it))
133 self.assertEqual(list(it), seq)
134
135 #test the iterator after dropping one from it
136 it = pickle.loads(d)
137 try:
138 next(it)
139 except StopIteration:
140 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200141 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000142 it = pickle.loads(d)
143 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000144
145 def test_import(self):
146 __import__('sys')
147 __import__('time')
148 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000149 __import__(name='sys')
150 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000151 self.assertRaises(ImportError, __import__, 'spamspam')
152 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000153 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000154 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000155
156 def test_abs(self):
157 # int
158 self.assertEqual(abs(0), 0)
159 self.assertEqual(abs(1234), 1234)
160 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000161 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000162 # float
163 self.assertEqual(abs(0.0), 0.0)
164 self.assertEqual(abs(3.14), 3.14)
165 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000166 # str
167 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000168 # bool
169 self.assertEqual(abs(True), 1)
170 self.assertEqual(abs(False), 0)
171 # other
172 self.assertRaises(TypeError, abs)
173 self.assertRaises(TypeError, abs, None)
174 class AbsClass(object):
175 def __abs__(self):
176 return -5
177 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000178
Raymond Hettinger96229b12005-03-11 06:49:40 +0000179 def test_all(self):
180 self.assertEqual(all([2, 4, 6]), True)
181 self.assertEqual(all([2, None, 6]), False)
182 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
183 self.assertRaises(RuntimeError, all, TestFailingIter())
184 self.assertRaises(TypeError, all, 10) # Non-iterable
185 self.assertRaises(TypeError, all) # No args
186 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
187 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200188 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000189 S = [50, 60]
190 self.assertEqual(all(x > 42 for x in S), True)
191 S = [50, 40, 60]
192 self.assertEqual(all(x > 42 for x in S), False)
193
194 def test_any(self):
195 self.assertEqual(any([None, None, None]), False)
196 self.assertEqual(any([None, 4, None]), True)
197 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500198 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000199 self.assertRaises(TypeError, any, 10) # Non-iterable
200 self.assertRaises(TypeError, any) # No args
201 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
202 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200203 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000204 S = [40, 60, 30]
205 self.assertEqual(any(x > 42 for x in S), True)
206 S = [10, 20, 30]
207 self.assertEqual(any(x > 42 for x in S), False)
208
Georg Brandl559e5d72008-06-11 18:37:52 +0000209 def test_ascii(self):
210 self.assertEqual(ascii(''), '\'\'')
211 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000212 self.assertEqual(ascii(()), '()')
213 self.assertEqual(ascii([]), '[]')
214 self.assertEqual(ascii({}), '{}')
215 a = []
216 a.append(a)
217 self.assertEqual(ascii(a), '[[...]]')
218 a = {}
219 a[0] = a
220 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000221 # Advanced checks for unicode strings
222 def _check_uni(s):
223 self.assertEqual(ascii(s), repr(s))
224 _check_uni("'")
225 _check_uni('"')
226 _check_uni('"\'')
227 _check_uni('\0')
228 _check_uni('\r\n\t .')
229 # Unprintable non-ASCII characters
230 _check_uni('\x85')
231 _check_uni('\u1fff')
232 _check_uni('\U00012fff')
233 # Lone surrogates
234 _check_uni('\ud800')
235 _check_uni('\udfff')
236 # Issue #9804: surrogates should be joined even for printable
237 # wide characters (UCS-2 builds).
238 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
239 # All together
240 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
241 self.assertEqual(ascii(s),
242 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000243
Thomas Wouters89f507f2006-12-13 04:49:30 +0000244 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000245 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000246 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000247 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000248
Walter Dörwald919497e2003-01-19 16:23:59 +0000249 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000250 self.assertTrue(callable(len))
251 self.assertFalse(callable("a"))
252 self.assertTrue(callable(callable))
253 self.assertTrue(callable(lambda x, y: x + y))
254 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000256 self.assertTrue(callable(f))
257
258 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000259 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000260 self.assertTrue(callable(C1))
261 c = C1()
262 self.assertTrue(callable(c.meth))
263 self.assertFalse(callable(c))
264
265 # __call__ is looked up on the class, not the instance
266 c.__call__ = None
267 self.assertFalse(callable(c))
268 c.__call__ = lambda self: 0
269 self.assertFalse(callable(c))
270 del c.__call__
271 self.assertFalse(callable(c))
272
273 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000274 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000275 c2 = C2()
276 self.assertTrue(callable(c2))
277 c2.__call__ = None
278 self.assertTrue(callable(c2))
279 class C3(C2): pass
280 c3 = C3()
281 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000282
283 def test_chr(self):
284 self.assertEqual(chr(32), ' ')
285 self.assertEqual(chr(65), 'A')
286 self.assertEqual(chr(97), 'a')
287 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000288 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000289 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300290 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000291 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000292 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
293 self.assertEqual(chr(0x00010000), "\U00010000")
294 self.assertEqual(chr(0x00010001), "\U00010001")
295 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
296 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
297 self.assertEqual(chr(0x00100000), "\U00100000")
298 self.assertEqual(chr(0x00100001), "\U00100001")
299 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
300 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
301 self.assertRaises(ValueError, chr, -1)
302 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000303 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000304
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000305 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000306 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000307
Walter Dörwald919497e2003-01-19 16:23:59 +0000308 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000309 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000310 bom = b'\xef\xbb\xbf'
311 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 compile(source='pass', filename='?', mode='exec')
313 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
314 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000315 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000316 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000317 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
318 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300319 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000320 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
321 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000322 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300323 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000324 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000325
Georg Brandl8334fd92010-12-04 10:26:46 +0000326 # test the optimize argument
327
328 codestr = '''def f():
329 """doc"""
330 try:
331 assert False
332 except AssertionError:
333 return (True, f.__doc__)
334 else:
335 return (False, f.__doc__)
336 '''
337 def f(): """doc"""
338 values = [(-1, __debug__, f.__doc__),
339 (0, True, 'doc'),
340 (1, False, 'doc'),
341 (2, False, None)]
342 for optval, debugval, docstring in values:
343 # test both direct compilation and compilation via AST
344 codeobjs = []
345 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
346 tree = ast.parse(codestr)
347 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
348 for code in codeobjs:
349 ns = {}
350 exec(code, ns)
351 rv = ns['f']()
352 self.assertEqual(rv, (debugval, docstring))
353
Walter Dörwald919497e2003-01-19 16:23:59 +0000354 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 sys.spam = 1
356 delattr(sys, 'spam')
357 self.assertRaises(TypeError, delattr)
358
359 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000360 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000361 self.assertRaises(TypeError, dir, 42, 42)
362
Georg Brandle32b4222007-03-10 22:13:27 +0000363 # dir() - local scope
364 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000365 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000366
367 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000368 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000369
370 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000371 class Foo(types.ModuleType):
372 __dict__ = 8
373 f = Foo("foo")
374 self.assertRaises(TypeError, dir, f)
375
376 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000377 self.assertIn("strip", dir(str))
378 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000379
380 # dir(obj)
381 class Foo(object):
382 def __init__(self):
383 self.x = 7
384 self.y = 8
385 self.z = 9
386 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000387 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000388
389 # dir(obj_no__dict__)
390 class Foo(object):
391 __slots__ = []
392 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000393 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000394
395 # dir(obj_no__class__with__dict__)
396 # (an ugly trick to cause getattr(f, "__class__") to fail)
397 class Foo(object):
398 __slots__ = ["__class__", "__dict__"]
399 def __init__(self):
400 self.bar = "wow"
401 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000402 self.assertNotIn("__repr__", dir(f))
403 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000404
405 # dir(obj_using __dir__)
406 class Foo(object):
407 def __dir__(self):
408 return ["kan", "ga", "roo"]
409 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000410 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000411
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500412 # dir(obj__dir__tuple)
413 class Foo(object):
414 def __dir__(self):
415 return ("b", "c", "a")
416 res = dir(Foo())
417 self.assertIsInstance(res, list)
418 self.assertTrue(res == ["a", "b", "c"])
419
420 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000421 class Foo(object):
422 def __dir__(self):
423 return 7
424 f = Foo()
425 self.assertRaises(TypeError, dir, f)
426
Collin Winter3eed7652007-08-14 17:53:54 +0000427 # dir(traceback)
428 try:
429 raise IndexError
430 except:
431 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
432
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500433 # test that object has a __dir__()
434 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000435
Walter Dörwald919497e2003-01-19 16:23:59 +0000436 def test_divmod(self):
437 self.assertEqual(divmod(12, 7), (1, 5))
438 self.assertEqual(divmod(-12, 7), (-2, 2))
439 self.assertEqual(divmod(12, -7), (-2, -2))
440 self.assertEqual(divmod(-12, -7), (1, -5))
441
Mark Dickinson5c2db372009-12-05 20:28:34 +0000442 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000443
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000444 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
445 (-3.25, 1.0, (-4.0, 0.75)),
446 (3.25, -1.0, (-4.0, -0.75)),
447 (-3.25, -1.0, (3.0, -0.25))]:
448 result = divmod(num, denom)
449 self.assertAlmostEqual(result[0], exp_result[0])
450 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000451
452 self.assertRaises(TypeError, divmod)
453
454 def test_eval(self):
455 self.assertEqual(eval('1+1'), 2)
456 self.assertEqual(eval(' 1+1\n'), 2)
457 globals = {'a': 1, 'b': 2}
458 locals = {'b': 200, 'c': 300}
459 self.assertEqual(eval('a', globals) , 1)
460 self.assertEqual(eval('a', globals, locals), 1)
461 self.assertEqual(eval('b', globals, locals), 200)
462 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000463 globals = {'a': 1, 'b': 2}
464 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000465 bom = b'\xef\xbb\xbf'
466 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000467 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000468 self.assertRaises(TypeError, eval)
469 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000470 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000471
Benjamin Peterson92722792012-12-15 12:51:05 -0500472 class X:
473 def __getitem__(self, key):
474 raise ValueError
475 self.assertRaises(ValueError, eval, "foo", {}, X())
476
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000477 def test_general_eval(self):
478 # Tests that general mappings can be used for the locals argument
479
480 class M:
481 "Test mapping interface versus possible calls from eval()."
482 def __getitem__(self, key):
483 if key == 'a':
484 return 12
485 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000486 def keys(self):
487 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000488
489 m = M()
490 g = globals()
491 self.assertEqual(eval('a', g, m), 12)
492 self.assertRaises(NameError, eval, 'b', g, m)
493 self.assertEqual(eval('dir()', g, m), list('xyz'))
494 self.assertEqual(eval('globals()', g, m), g)
495 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000496 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000497 class A:
498 "Non-mapping"
499 pass
500 m = A()
501 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000502
503 # Verify that dict subclasses work as well
504 class D(dict):
505 def __getitem__(self, key):
506 if key == 'a':
507 return 12
508 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000509 def keys(self):
510 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000511
512 d = D()
513 self.assertEqual(eval('a', g, d), 12)
514 self.assertRaises(NameError, eval, 'b', g, d)
515 self.assertEqual(eval('dir()', g, d), list('xyz'))
516 self.assertEqual(eval('globals()', g, d), g)
517 self.assertEqual(eval('locals()', g, d), d)
518
519 # Verify locals stores (used by list comps)
520 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000521 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000522
523 class SpreadSheet:
524 "Sample application showing nested, calculated lookups."
525 _cells = {}
526 def __setitem__(self, key, formula):
527 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000528 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000529 return eval(self._cells[key], globals(), self)
530
531 ss = SpreadSheet()
532 ss['a1'] = '5'
533 ss['a2'] = 'a1*6'
534 ss['a3'] = 'a2*7'
535 self.assertEqual(ss['a3'], 210)
536
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000537 # Verify that dir() catches a non-list returned by eval
538 # SF bug #1004669
539 class C:
540 def __getitem__(self, item):
541 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000542 def keys(self):
543 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000544 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
545
Georg Brandl7cae87c2006-09-06 06:51:57 +0000546 def test_exec(self):
547 g = {}
548 exec('z = 1', g)
549 if '__builtins__' in g:
550 del g['__builtins__']
551 self.assertEqual(g, {'z': 1})
552
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000553 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000554 if '__builtins__' in g:
555 del g['__builtins__']
556 self.assertEqual(g, {'z': 2})
557 g = {}
558 l = {}
559
Brett Cannon77628992010-03-20 20:59:33 +0000560 with check_warnings():
561 warnings.filterwarnings("ignore", "global statement",
562 module="<string>")
563 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000564 if '__builtins__' in g:
565 del g['__builtins__']
566 if '__builtins__' in l:
567 del l['__builtins__']
568 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
569
Victor Stinnerb0b22422012-04-19 00:57:45 +0200570 def test_exec_globals(self):
571 code = compile("print('Hello World!')", "", "exec")
572 # no builtin function
573 self.assertRaisesRegex(NameError, "name 'print' is not defined",
574 exec, code, {'__builtins__': {}})
575 # __builtins__ must be a mapping type
576 self.assertRaises(TypeError,
577 exec, code, {'__builtins__': 123})
578
579 # no __build_class__ function
580 code = compile("class A: pass", "", "exec")
581 self.assertRaisesRegex(NameError, "__build_class__ not found",
582 exec, code, {'__builtins__': {}})
583
584 class frozendict_error(Exception):
585 pass
586
587 class frozendict(dict):
588 def __setitem__(self, key, value):
589 raise frozendict_error("frozendict is readonly")
590
591 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400592 if isinstance(__builtins__, types.ModuleType):
593 frozen_builtins = frozendict(__builtins__.__dict__)
594 else:
595 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200596 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
597 self.assertRaises(frozendict_error,
598 exec, code, {'__builtins__': frozen_builtins})
599
600 # read-only globals
601 namespace = frozendict({})
602 code = compile("x=1", "test", "exec")
603 self.assertRaises(frozendict_error,
604 exec, code, namespace)
605
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000606 def test_exec_redirected(self):
607 savestdout = sys.stdout
608 sys.stdout = None # Whatever that cannot flush()
609 try:
610 # Used to raise SystemError('error return without exception set')
611 exec('a')
612 except NameError:
613 pass
614 finally:
615 sys.stdout = savestdout
616
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000618 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
619 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
620 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
621 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
622 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000623 def identity(item):
624 return 1
625 filter(identity, Squares(5))
626 self.assertRaises(TypeError, filter)
627 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000628 def __getitem__(self, index):
629 if index<4:
630 return 42
631 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000632 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 def badfunc():
634 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000635 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000636
Walter Dörwaldbf517072003-01-27 15:57:14 +0000637 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000638 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
639 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
640 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000641
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000642 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200643 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
644 f1 = filter(filter_char, "abcdeabcde")
645 f2 = filter(filter_char, "abcdeabcde")
646 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000647
Walter Dörwald919497e2003-01-19 16:23:59 +0000648 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000649 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000650 self.assertRaises(TypeError, getattr, sys, 1)
651 self.assertRaises(TypeError, getattr, sys, 1, "foo")
652 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000653 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000654 # unicode surrogates are not encodable to the default encoding (utf8)
655 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000656
657 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000658 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000659 self.assertRaises(TypeError, hasattr, sys, 1)
660 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000661 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000662
Benjamin Peterson17689992010-08-24 03:26:23 +0000663 # Check that hasattr propagates all exceptions outside of
664 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000665 class A:
666 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000667 raise SystemExit
668 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000669 class B:
670 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000671 raise ValueError
672 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000673
Walter Dörwald919497e2003-01-19 16:23:59 +0000674 def test_hash(self):
675 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000676 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000677 self.assertEqual(hash(1), hash(1.0))
678 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000679 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 hash((0,1,2,3))
681 def f(): pass
682 self.assertRaises(TypeError, hash, [])
683 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000684 # Bug 1536021: Allow hash to return long objects
685 class X:
686 def __hash__(self):
687 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000688 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000689 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690 def __hash__(self):
691 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000692 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000693
694 def test_hex(self):
695 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000696 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000697 self.assertRaises(TypeError, hex, {})
698
699 def test_id(self):
700 id(None)
701 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000702 id(1.0)
703 id('spam')
704 id((0,1,2,3))
705 id([0,1,2,3])
706 id({'spam': 1, 'eggs': 2, 'ham': 3})
707
Guido van Rossuma88a0332007-02-26 16:59:55 +0000708 # Test input() later, alphabetized as if it were raw_input
709
Walter Dörwald919497e2003-01-19 16:23:59 +0000710 def test_iter(self):
711 self.assertRaises(TypeError, iter)
712 self.assertRaises(TypeError, iter, 42, 42)
713 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000714 for l in lists:
715 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000716 self.assertEqual(next(i), '1')
717 self.assertEqual(next(i), '2')
718 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000719
720 def test_isinstance(self):
721 class C:
722 pass
723 class D(C):
724 pass
725 class E:
726 pass
727 c = C()
728 d = D()
729 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000730 self.assertTrue(isinstance(c, C))
731 self.assertTrue(isinstance(d, C))
732 self.assertTrue(not isinstance(e, C))
733 self.assertTrue(not isinstance(c, D))
734 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000735 self.assertRaises(TypeError, isinstance, E, 'foo')
736 self.assertRaises(TypeError, isinstance)
737
738 def test_issubclass(self):
739 class C:
740 pass
741 class D(C):
742 pass
743 class E:
744 pass
745 c = C()
746 d = D()
747 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000748 self.assertTrue(issubclass(D, C))
749 self.assertTrue(issubclass(C, C))
750 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000751 self.assertRaises(TypeError, issubclass, 'foo', E)
752 self.assertRaises(TypeError, issubclass, E, 'foo')
753 self.assertRaises(TypeError, issubclass)
754
755 def test_len(self):
756 self.assertEqual(len('123'), 3)
757 self.assertEqual(len(()), 0)
758 self.assertEqual(len((1, 2, 3, 4)), 4)
759 self.assertEqual(len([1, 2, 3, 4]), 4)
760 self.assertEqual(len({}), 0)
761 self.assertEqual(len({'a':1, 'b': 2}), 2)
762 class BadSeq:
763 def __len__(self):
764 raise ValueError
765 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000766 class InvalidLen:
767 def __len__(self):
768 return None
769 self.assertRaises(TypeError, len, InvalidLen())
770 class FloatLen:
771 def __len__(self):
772 return 4.5
773 self.assertRaises(TypeError, len, FloatLen())
774 class HugeLen:
775 def __len__(self):
776 return sys.maxsize + 1
777 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000778 class NoLenMethod(object): pass
779 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000780
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 def test_map(self):
782 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000783 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000784 [1, 4, 9]
785 )
786 try:
787 from math import sqrt
788 except ImportError:
789 def sqrt(x):
790 return pow(x, 0.5)
791 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000792 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000793 [[4.0, 2.0], [9.0, 3.0]]
794 )
795 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000796 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000797 [10, 4, 6]
798 )
799
800 def plus(*v):
801 accu = 0
802 for i in v: accu = accu + i
803 return accu
804 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000805 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000806 [1, 3, 7]
807 )
808 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000809 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000810 [1+4, 3+9, 7+2]
811 )
812 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000813 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000814 [1+4+1, 3+9+1, 7+2+0]
815 )
816 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000817 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000818 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
819 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000820 def Max(a, b):
821 if a is None:
822 return b
823 if b is None:
824 return a
825 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000826 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000827 list(map(Max, Squares(3), Squares(2))),
828 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000829 )
830 self.assertRaises(TypeError, map)
831 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000832 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000833 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000834 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000835 yield None
836 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000837 def badfunc(x):
838 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000839 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000840
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000841 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200842 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
843 m1 = map(map_char, "Is this the real life?")
844 m2 = map(map_char, "Is this the real life?")
845 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000846
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 def test_max(self):
848 self.assertEqual(max('123123'), '3')
849 self.assertEqual(max(1, 2, 3), 3)
850 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
851 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
852
Guido van Rossume2a383d2007-01-15 16:59:06 +0000853 self.assertEqual(max(1, 2, 3.0), 3.0)
854 self.assertEqual(max(1, 2.0, 3), 3)
855 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000856
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700857 self.assertRaises(TypeError, max)
858 self.assertRaises(TypeError, max, 42)
859 self.assertRaises(ValueError, max, ())
860 class BadSeq:
861 def __getitem__(self, index):
862 raise ValueError
863 self.assertRaises(ValueError, max, BadSeq())
864
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000865 for stmt in (
866 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700867 "max(default=None)",
868 "max(1, 2, default=None)", # require container for default
869 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000870 "max(1, key=int)", # single arg not iterable
871 "max(1, 2, keystone=int)", # wrong keyword
872 "max(1, 2, key=int, abc=int)", # two many keywords
873 "max(1, 2, key=1)", # keyfunc is not callable
874 ):
Tim Peters7f061872004-12-07 21:17:46 +0000875 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000876 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000877 except TypeError:
878 pass
879 else:
880 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000881
882 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
883 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
884 self.assertEqual(max(1, 2, key=neg), 1) # two elems
885
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700886 self.assertEqual(max((), default=None), None) # zero elem iterable
887 self.assertEqual(max((1,), default=None), 1) # one elem iterable
888 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
889
890 self.assertEqual(max((), default=1, key=neg), 1)
891 self.assertEqual(max((1, 2), default=3, key=neg), 1)
892
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000893 data = [random.randrange(200) for i in range(100)]
894 keys = dict((elem, random.randrange(50)) for elem in data)
895 f = keys.__getitem__
896 self.assertEqual(max(data, key=f),
897 sorted(reversed(data), key=f)[-1])
898
Walter Dörwald919497e2003-01-19 16:23:59 +0000899 def test_min(self):
900 self.assertEqual(min('123123'), '1')
901 self.assertEqual(min(1, 2, 3), 1)
902 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
903 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
904
Guido van Rossume2a383d2007-01-15 16:59:06 +0000905 self.assertEqual(min(1, 2, 3.0), 1)
906 self.assertEqual(min(1, 2.0, 3), 1)
907 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000908
909 self.assertRaises(TypeError, min)
910 self.assertRaises(TypeError, min, 42)
911 self.assertRaises(ValueError, min, ())
912 class BadSeq:
913 def __getitem__(self, index):
914 raise ValueError
915 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000916
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000917 for stmt in (
918 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700919 "min(default=None)",
920 "min(1, 2, default=None)", # require container for default
921 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000922 "min(1, key=int)", # single arg not iterable
923 "min(1, 2, keystone=int)", # wrong keyword
924 "min(1, 2, key=int, abc=int)", # two many keywords
925 "min(1, 2, key=1)", # keyfunc is not callable
926 ):
Tim Peters7f061872004-12-07 21:17:46 +0000927 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000928 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000929 except TypeError:
930 pass
931 else:
932 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000933
934 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
935 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
936 self.assertEqual(min(1, 2, key=neg), 2) # two elems
937
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700938 self.assertEqual(min((), default=None), None) # zero elem iterable
939 self.assertEqual(min((1,), default=None), 1) # one elem iterable
940 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
941
942 self.assertEqual(min((), default=1, key=neg), 1)
943 self.assertEqual(min((1, 2), default=1, key=neg), 2)
944
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000945 data = [random.randrange(200) for i in range(100)]
946 keys = dict((elem, random.randrange(50)) for elem in data)
947 f = keys.__getitem__
948 self.assertEqual(min(data, key=f),
949 sorted(data, key=f)[0])
950
Georg Brandla18af4e2007-04-21 15:47:16 +0000951 def test_next(self):
952 it = iter(range(2))
953 self.assertEqual(next(it), 0)
954 self.assertEqual(next(it), 1)
955 self.assertRaises(StopIteration, next, it)
956 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000957 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000958
959 class Iter(object):
960 def __iter__(self):
961 return self
962 def __next__(self):
963 raise StopIteration
964
965 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000966 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000967 self.assertRaises(StopIteration, next, it)
968
969 def gen():
970 yield 1
971 return
972
973 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000974 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000975 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000976 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000977
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000979 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000980 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000981 self.assertRaises(TypeError, oct, ())
982
983 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000984 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000985 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +0200986 self.addCleanup(unlink, TESTFN)
987 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +0000988 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000989 fp.write('The quick brown fox jumps over the lazy dog')
990 fp.write('.\n')
991 fp.write('Dear John\n')
992 fp.write('XXX'*100)
993 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +0000994
995 def test_open(self):
996 self.write_testfile()
997 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +0200998 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +0000999 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1001 self.assertEqual(fp.readline(4), 'Dear')
1002 self.assertEqual(fp.readline(100), ' John\n')
1003 self.assertEqual(fp.read(300), 'XXX'*100)
1004 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001005
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001006 def test_open_default_encoding(self):
1007 old_environ = dict(os.environ)
1008 try:
1009 # try to get a user preferred encoding different than the current
1010 # locale encoding to check that open() uses the current locale
1011 # encoding and not the user preferred encoding
1012 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1013 if key in os.environ:
1014 del os.environ[key]
1015
1016 self.write_testfile()
1017 current_locale_encoding = locale.getpreferredencoding(False)
1018 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001019 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001020 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001021 finally:
1022 os.environ.clear()
1023 os.environ.update(old_environ)
1024
Victor Stinnerdaf45552013-08-28 00:53:59 +02001025 def test_open_non_inheritable(self):
1026 fileobj = open(__file__)
1027 with fileobj:
1028 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1029
Walter Dörwald919497e2003-01-19 16:23:59 +00001030 def test_ord(self):
1031 self.assertEqual(ord(' '), 32)
1032 self.assertEqual(ord('A'), 65)
1033 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001034 self.assertEqual(ord('\x80'), 128)
1035 self.assertEqual(ord('\xff'), 255)
1036
1037 self.assertEqual(ord(b' '), 32)
1038 self.assertEqual(ord(b'A'), 65)
1039 self.assertEqual(ord(b'a'), 97)
1040 self.assertEqual(ord(b'\x80'), 128)
1041 self.assertEqual(ord(b'\xff'), 255)
1042
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001043 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001044 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001045
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001046 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1047 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1048 self.assertEqual(ord("\U00010000"), 0x00010000)
1049 self.assertEqual(ord("\U00010001"), 0x00010001)
1050 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1051 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1052 self.assertEqual(ord("\U00100000"), 0x00100000)
1053 self.assertEqual(ord("\U00100001"), 0x00100001)
1054 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1055 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1056
Walter Dörwald919497e2003-01-19 16:23:59 +00001057 def test_pow(self):
1058 self.assertEqual(pow(0,0), 1)
1059 self.assertEqual(pow(0,1), 0)
1060 self.assertEqual(pow(1,0), 1)
1061 self.assertEqual(pow(1,1), 1)
1062
1063 self.assertEqual(pow(2,0), 1)
1064 self.assertEqual(pow(2,10), 1024)
1065 self.assertEqual(pow(2,20), 1024*1024)
1066 self.assertEqual(pow(2,30), 1024*1024*1024)
1067
1068 self.assertEqual(pow(-2,0), 1)
1069 self.assertEqual(pow(-2,1), -2)
1070 self.assertEqual(pow(-2,2), 4)
1071 self.assertEqual(pow(-2,3), -8)
1072
Walter Dörwald919497e2003-01-19 16:23:59 +00001073 self.assertAlmostEqual(pow(0.,0), 1.)
1074 self.assertAlmostEqual(pow(0.,1), 0.)
1075 self.assertAlmostEqual(pow(1.,0), 1.)
1076 self.assertAlmostEqual(pow(1.,1), 1.)
1077
1078 self.assertAlmostEqual(pow(2.,0), 1.)
1079 self.assertAlmostEqual(pow(2.,10), 1024.)
1080 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1081 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1082
1083 self.assertAlmostEqual(pow(-2.,0), 1.)
1084 self.assertAlmostEqual(pow(-2.,1), -2.)
1085 self.assertAlmostEqual(pow(-2.,2), 4.)
1086 self.assertAlmostEqual(pow(-2.,3), -8.)
1087
Mark Dickinson5c2db372009-12-05 20:28:34 +00001088 for x in 2, 2.0:
1089 for y in 10, 10.0:
1090 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001091 if isinstance(x, float) or \
1092 isinstance(y, float) or \
1093 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001094 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001095 else:
1096 self.assertAlmostEqual(pow(x, y, z), 24.0)
1097
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001098 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1099 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1100
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001101 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001102 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001103
1104 self.assertRaises(TypeError, pow)
1105
Guido van Rossuma88a0332007-02-26 16:59:55 +00001106 def test_input(self):
1107 self.write_testfile()
1108 fp = open(TESTFN, 'r')
1109 savestdin = sys.stdin
1110 savestdout = sys.stdout # Eats the echo
1111 try:
1112 sys.stdin = fp
1113 sys.stdout = BitBucket()
1114 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001115 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1116 self.assertEqual(input('testing\n'), 'Dear John')
1117
1118 # SF 1535165: don't segfault on closed stdin
1119 # sys.stdout must be a regular file for triggering
1120 sys.stdout = savestdout
1121 sys.stdin.close()
1122 self.assertRaises(ValueError, input)
1123
1124 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001125 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001126 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001127 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001128 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001129 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001130 self.assertRaises(EOFError, input)
1131
1132 del sys.stdout
1133 self.assertRaises(RuntimeError, input, 'prompt')
1134 del sys.stdin
1135 self.assertRaises(RuntimeError, input, 'prompt')
1136 finally:
1137 sys.stdin = savestdin
1138 sys.stdout = savestdout
1139 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001140
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001141 # test_int(): see test_int.py for tests of built-in function int().
1142
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 def test_repr(self):
1144 self.assertEqual(repr(''), '\'\'')
1145 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001146 self.assertEqual(repr(()), '()')
1147 self.assertEqual(repr([]), '[]')
1148 self.assertEqual(repr({}), '{}')
1149 a = []
1150 a.append(a)
1151 self.assertEqual(repr(a), '[[...]]')
1152 a = {}
1153 a[0] = a
1154 self.assertEqual(repr(a), '{0: {...}}')
1155
1156 def test_round(self):
1157 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001158 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 self.assertEqual(round(1.0), 1.0)
1160 self.assertEqual(round(10.0), 10.0)
1161 self.assertEqual(round(1000000000.0), 1000000000.0)
1162 self.assertEqual(round(1e20), 1e20)
1163
1164 self.assertEqual(round(-1.0), -1.0)
1165 self.assertEqual(round(-10.0), -10.0)
1166 self.assertEqual(round(-1000000000.0), -1000000000.0)
1167 self.assertEqual(round(-1e20), -1e20)
1168
1169 self.assertEqual(round(0.1), 0.0)
1170 self.assertEqual(round(1.1), 1.0)
1171 self.assertEqual(round(10.1), 10.0)
1172 self.assertEqual(round(1000000000.1), 1000000000.0)
1173
1174 self.assertEqual(round(-1.1), -1.0)
1175 self.assertEqual(round(-10.1), -10.0)
1176 self.assertEqual(round(-1000000000.1), -1000000000.0)
1177
1178 self.assertEqual(round(0.9), 1.0)
1179 self.assertEqual(round(9.9), 10.0)
1180 self.assertEqual(round(999999999.9), 1000000000.0)
1181
1182 self.assertEqual(round(-0.9), -1.0)
1183 self.assertEqual(round(-9.9), -10.0)
1184 self.assertEqual(round(-999999999.9), -1000000000.0)
1185
1186 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001187 self.assertEqual(type(round(-8.0, -1)), float)
1188
1189 self.assertEqual(type(round(-8.0, 0)), float)
1190 self.assertEqual(type(round(-8.0, 1)), float)
1191
1192 # Check even / odd rounding behaviour
1193 self.assertEqual(round(5.5), 6)
1194 self.assertEqual(round(6.5), 6)
1195 self.assertEqual(round(-5.5), -6)
1196 self.assertEqual(round(-6.5), -6)
1197
1198 # Check behavior on ints
1199 self.assertEqual(round(0), 0)
1200 self.assertEqual(round(8), 8)
1201 self.assertEqual(round(-8), -8)
1202 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001203 self.assertEqual(type(round(-8, -1)), int)
1204 self.assertEqual(type(round(-8, 0)), int)
1205 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001206
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001207 # test new kwargs
1208 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1209
Walter Dörwald919497e2003-01-19 16:23:59 +00001210 self.assertRaises(TypeError, round)
1211
Alex Martelliae211f92007-08-22 23:21:33 +00001212 # test generic rounding delegation for reals
1213 class TestRound:
1214 def __round__(self):
1215 return 23
1216
1217 class TestNoRound:
1218 pass
1219
1220 self.assertEqual(round(TestRound()), 23)
1221
1222 self.assertRaises(TypeError, round, 1, 2, 3)
1223 self.assertRaises(TypeError, round, TestNoRound())
1224
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001225 t = TestNoRound()
1226 t.__round__ = lambda *args: args
1227 self.assertRaises(TypeError, round, t)
1228 self.assertRaises(TypeError, round, t, 0)
1229
Mark Dickinsonad731b92009-11-09 17:12:30 +00001230 # Some versions of glibc for alpha have a bug that affects
1231 # float -> integer rounding (floor, ceil, rint, round) for
1232 # values in the range [2**52, 2**53). See:
1233 #
1234 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1235 #
1236 # We skip this test on Linux/alpha if it would fail.
1237 linux_alpha = (platform.system().startswith('Linux') and
1238 platform.machine().startswith('alpha'))
1239 system_round_bug = round(5e15+1) != 5e15+1
1240 @unittest.skipIf(linux_alpha and system_round_bug,
1241 "test will fail; failure is probably due to a "
1242 "buggy system round function")
1243 def test_round_large(self):
1244 # Issue #1869: integral floats should remain unchanged
1245 self.assertEqual(round(5e15-1), 5e15-1)
1246 self.assertEqual(round(5e15), 5e15)
1247 self.assertEqual(round(5e15+1), 5e15+1)
1248 self.assertEqual(round(5e15+2), 5e15+2)
1249 self.assertEqual(round(5e15+3), 5e15+3)
1250
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001251 def test_bug_27936(self):
1252 # Verify that ndigits=None means the same as passing in no argument
1253 for x in [1234,
1254 1234.56,
1255 decimal.Decimal('1234.56'),
1256 fractions.Fraction(123456, 100)]:
1257 self.assertEqual(round(x, None), round(x))
1258 self.assertEqual(type(round(x, None)), type(round(x)))
1259
Walter Dörwald919497e2003-01-19 16:23:59 +00001260 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001261 setattr(sys, 'spam', 1)
1262 self.assertEqual(sys.spam, 1)
1263 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1264 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001265
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001266 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001267
Alex Martellia70b1912003-04-22 08:12:33 +00001268 def test_sum(self):
1269 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001270 self.assertEqual(sum(list(range(2,8))), 27)
1271 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001272 self.assertEqual(sum(Squares(10)), 285)
1273 self.assertEqual(sum(iter(Squares(10))), 285)
1274 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1275
1276 self.assertRaises(TypeError, sum)
1277 self.assertRaises(TypeError, sum, 42)
1278 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1279 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001280 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1281 values = [bytearray(b'a'), bytearray(b'b')]
1282 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001283 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1284 self.assertRaises(TypeError, sum, [{2:3}])
1285 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1286
1287 class BadSeq:
1288 def __getitem__(self, index):
1289 raise ValueError
1290 self.assertRaises(ValueError, sum, BadSeq())
1291
Mark Dickinson3a22b472009-10-17 21:48:16 +00001292 empty = []
1293 sum(([x] for x in range(10)), empty)
1294 self.assertEqual(empty, [])
1295
Walter Dörwald919497e2003-01-19 16:23:59 +00001296 def test_type(self):
1297 self.assertEqual(type(''), type('123'))
1298 self.assertNotEqual(type(''), type(()))
1299
Guido van Rossumfee7b932005-01-16 00:21:28 +00001300 # We don't want self in vars(), so these are static methods
1301
1302 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001303 def get_vars_f0():
1304 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001305
Guido van Rossumfee7b932005-01-16 00:21:28 +00001306 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001307 def get_vars_f2():
1308 BuiltinTest.get_vars_f0()
1309 a = 1
1310 b = 2
1311 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001312
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001313 class C_get_vars(object):
1314 def getDict(self):
1315 return {'a':2}
1316 __dict__ = property(fget=getDict)
1317
Walter Dörwald919497e2003-01-19 16:23:59 +00001318 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001319 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001320 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001321 self.assertEqual(self.get_vars_f0(), {})
1322 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1323 self.assertRaises(TypeError, vars, 42, 42)
1324 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001325 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001326
1327 def test_zip(self):
1328 a = (1, 2, 3)
1329 b = (4, 5, 6)
1330 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001331 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001332 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001333 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001334 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001335 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001336 class I:
1337 def __getitem__(self, i):
1338 if i < 0 or i > 2: raise IndexError
1339 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001340 self.assertEqual(list(zip(a, I())), t)
1341 self.assertEqual(list(zip()), [])
1342 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001343 self.assertRaises(TypeError, zip, None)
1344 class G:
1345 pass
1346 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001347 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001348
1349 # Make sure zip doesn't try to allocate a billion elements for the
1350 # result list when one of its arguments doesn't say how long it is.
1351 # A MemoryError is the most likely failure mode.
1352 class SequenceWithoutALength:
1353 def __getitem__(self, i):
1354 if i == 5:
1355 raise IndexError
1356 else:
1357 return i
1358 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001359 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001360 list(enumerate(range(5)))
1361 )
1362
1363 class BadSeq:
1364 def __getitem__(self, i):
1365 if i == 5:
1366 raise ValueError
1367 else:
1368 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001369 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001370
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001371 def test_zip_pickle(self):
1372 a = (1, 2, 3)
1373 b = (4, 5, 6)
1374 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001375 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1376 z1 = zip(a, b)
1377 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001378
Eric Smithe4d63172010-09-13 20:48:43 +00001379 def test_format(self):
1380 # Test the basic machinery of the format() builtin. Don't test
1381 # the specifics of the various formatters
1382 self.assertEqual(format(3, ''), '3')
1383
1384 # Returns some classes to use for various tests. There's
1385 # an old-style version, and a new-style version
1386 def classes_new():
1387 class A(object):
1388 def __init__(self, x):
1389 self.x = x
1390 def __format__(self, format_spec):
1391 return str(self.x) + format_spec
1392 class DerivedFromA(A):
1393 pass
1394
1395 class Simple(object): pass
1396 class DerivedFromSimple(Simple):
1397 def __init__(self, x):
1398 self.x = x
1399 def __format__(self, format_spec):
1400 return str(self.x) + format_spec
1401 class DerivedFromSimple2(DerivedFromSimple): pass
1402 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1403
1404 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1405 self.assertEqual(format(A(3), 'spec'), '3spec')
1406 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1407 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1408 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1409 '10abcdef')
1410
1411 class_test(*classes_new())
1412
1413 def empty_format_spec(value):
1414 # test that:
1415 # format(x, '') == str(x)
1416 # format(x) == str(x)
1417 self.assertEqual(format(value, ""), str(value))
1418 self.assertEqual(format(value), str(value))
1419
1420 # for builtin types, format(x, "") == str(x)
1421 empty_format_spec(17**13)
1422 empty_format_spec(1.0)
1423 empty_format_spec(3.1415e104)
1424 empty_format_spec(-3.1415e104)
1425 empty_format_spec(3.1415e-104)
1426 empty_format_spec(-3.1415e-104)
1427 empty_format_spec(object)
1428 empty_format_spec(None)
1429
1430 # TypeError because self.__format__ returns the wrong type
1431 class BadFormatResult:
1432 def __format__(self, format_spec):
1433 return 1.0
1434 self.assertRaises(TypeError, format, BadFormatResult(), "")
1435
1436 # TypeError because format_spec is not unicode or str
1437 self.assertRaises(TypeError, format, object(), 4)
1438 self.assertRaises(TypeError, format, object(), object())
1439
1440 # tests for object.__format__ really belong elsewhere, but
1441 # there's no good place to put them
1442 x = object().__format__('')
1443 self.assertTrue(x.startswith('<object object at'))
1444
1445 # first argument to object.__format__ must be string
1446 self.assertRaises(TypeError, object().__format__, 3)
1447 self.assertRaises(TypeError, object().__format__, object())
1448 self.assertRaises(TypeError, object().__format__, None)
1449
1450 # --------------------------------------------------------------------
1451 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001452 # deprecated
Andrew Svetlov2cd8ce42012-12-23 14:27:17 +02001453 def test_deprecated_format_string(obj, fmt_str, should_raise):
1454 if should_raise:
1455 self.assertRaises(TypeError, format, obj, fmt_str)
Eric Smithe4d63172010-09-13 20:48:43 +00001456 else:
Andrew Svetlov2cd8ce42012-12-23 14:27:17 +02001457 format(obj, fmt_str)
Eric Smithe4d63172010-09-13 20:48:43 +00001458
1459 fmt_strs = ['', 's']
1460
1461 class A:
1462 def __format__(self, fmt_str):
1463 return format('', fmt_str)
1464
1465 for fmt_str in fmt_strs:
1466 test_deprecated_format_string(A(), fmt_str, False)
1467
1468 class B:
1469 pass
1470
1471 class C(object):
1472 pass
1473
1474 for cls in [object, B, C]:
1475 for fmt_str in fmt_strs:
1476 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1477 # --------------------------------------------------------------------
1478
1479 # make sure we can take a subclass of str as a format spec
1480 class DerivedFromStr(str): pass
1481 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1482
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001483 def test_bin(self):
1484 self.assertEqual(bin(0), '0b0')
1485 self.assertEqual(bin(1), '0b1')
1486 self.assertEqual(bin(-1), '-0b1')
1487 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1488 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1489 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1490 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1491
Georg Brandl953152f2009-07-22 12:03:59 +00001492 def test_bytearray_translate(self):
1493 x = bytearray(b"abc")
1494 self.assertRaises(ValueError, x.translate, b"1", 1)
1495 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1496
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001497 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001498 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001499 tp = type(const)
1500 self.assertIs(tp(), const)
1501 self.assertRaises(TypeError, tp, 1, 2)
1502 self.assertRaises(TypeError, tp, a=1, b=2)
1503
Martin Panterc9a6ab52015-10-10 01:25:38 +00001504@unittest.skipUnless(pty, "the pty and signal modules must be available")
1505class PtyTests(unittest.TestCase):
1506 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1507 terminals in the test environment"""
1508
Martin Pantere44dba32015-10-10 05:27:15 +00001509 def run_child(self, child, terminal_input):
1510 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001511 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001512 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001513 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001514 os.close(r)
1515 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001516 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001517 raise
1518 if pid == 0:
1519 # Child
1520 try:
1521 # Make sure we don't get stuck if there's a problem
1522 signal.alarm(2)
1523 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001524 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001525 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001526 except:
1527 traceback.print_exc()
1528 finally:
1529 # We don't want to return to unittest...
1530 os._exit(0)
1531 # Parent
1532 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001533 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001534 # Get results from the pipe
1535 with open(r, "r") as rpipe:
1536 lines = []
1537 while True:
1538 line = rpipe.readline().strip()
1539 if line == "":
1540 # The other end was closed => the child exited
1541 break
1542 lines.append(line)
1543 # Check the result was got and corresponds to the user's terminal input
1544 if len(lines) != 2:
1545 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001546 # Beware of Linux raising EIO when the slave is closed
1547 child_output = bytearray()
1548 while True:
1549 try:
1550 chunk = os.read(fd, 3000)
1551 except OSError: # Assume EIO
1552 break
1553 if not chunk:
1554 break
1555 child_output.extend(chunk)
1556 os.close(fd)
1557 child_output = child_output.decode("ascii", "ignore")
1558 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1559 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001560 os.close(fd)
Martin Pantere44dba32015-10-10 05:27:15 +00001561 return lines
1562
1563 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1564 if not sys.stdin.isatty() or not sys.stdout.isatty():
1565 self.skipTest("stdin and stdout must be ttys")
1566 def child(wpipe):
1567 # Check the error handlers are accounted for
1568 if stdio_encoding:
1569 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1570 encoding=stdio_encoding,
1571 errors='surrogateescape')
1572 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1573 encoding=stdio_encoding,
1574 errors='replace')
1575 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1576 print(ascii(input(prompt)), file=wpipe)
1577 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001578 # Check we did exercise the GNU readline path
1579 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1580 if lines[0] != 'tty = True':
1581 self.skipTest("standard IO in should have been a tty")
1582 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1583 if stdio_encoding:
1584 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1585 else:
1586 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1587 self.assertEqual(input_result, expected)
1588
1589 def test_input_tty(self):
1590 # Test input() functionality when wired to a tty (the code path
1591 # is different and invokes GNU readline if available).
1592 self.check_input_tty("prompt", b"quux")
1593
1594 def test_input_tty_non_ascii(self):
1595 # Check stdin/stdout encoding is used when invoking GNU readline
1596 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1597
1598 def test_input_tty_non_ascii_unicode_errors(self):
1599 # Check stdin/stdout error handler is used when invoking GNU readline
1600 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1601
1602 def test_input_no_stdout_fileno(self):
1603 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1604 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001605 def child(wpipe):
1606 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1607 sys.stdout = io.StringIO() # Does not support fileno()
1608 input("prompt")
1609 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1610 lines = self.run_child(child, b"quux\r")
1611 expected = (
1612 "stdin.isatty(): True",
1613 "captured: 'prompt'",
1614 )
1615 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001616
Raymond Hettinger64958a12003-12-17 20:43:33 +00001617class TestSorted(unittest.TestCase):
1618
1619 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001620 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001621 copy = data[:]
1622 random.shuffle(copy)
1623 self.assertEqual(data, sorted(copy))
1624 self.assertNotEqual(data, copy)
1625
1626 data.reverse()
1627 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001628 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1629 self.assertNotEqual(data, copy)
1630 random.shuffle(copy)
1631 self.assertEqual(data, sorted(copy, reverse=1))
1632 self.assertNotEqual(data, copy)
1633
1634 def test_inputtypes(self):
1635 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001636 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001637 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001638 self.assertEqual(sorted(s), sorted(T(s)))
1639
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001640 s = ''.join(set(s)) # unique letters only
1641 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001642 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001643 self.assertEqual(sorted(s), sorted(T(s)))
1644
1645 def test_baddecorator(self):
1646 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1647 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1648
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001649
1650class ShutdownTest(unittest.TestCase):
1651
1652 def test_cleanup(self):
1653 # Issue #19255: builtins are still available at shutdown
1654 code = """if 1:
1655 import builtins
1656 import sys
1657
1658 class C:
1659 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001660 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001661 # Check that builtins still exist
1662 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001663 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001664
1665 c = C()
1666 # Make this module survive until builtins and sys are cleaned
1667 builtins.here = sys.modules[__name__]
1668 sys.here = sys.modules[__name__]
1669 # Create a reference loop so that this module needs to go
1670 # through a GC phase.
1671 here = sys.modules[__name__]
1672 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001673 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1674 # otherwise the codec may be unloaded before C.__del__() is called, and
1675 # so print("before") fails because the codec cannot be used to encode
1676 # "before" to sys.stdout.encoding. For example, on Windows,
1677 # sys.stdout.encoding is the OEM code page and these code pages are
1678 # implemented in Python
1679 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001680 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001681 self.assertEqual(["before", "after"], out.decode().splitlines())
1682
1683
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001684class TestType(unittest.TestCase):
1685 def test_new_type(self):
1686 A = type('A', (), {})
1687 self.assertEqual(A.__name__, 'A')
1688 self.assertEqual(A.__qualname__, 'A')
1689 self.assertEqual(A.__module__, __name__)
1690 self.assertEqual(A.__bases__, (object,))
1691 self.assertIs(A.__base__, object)
1692 x = A()
1693 self.assertIs(type(x), A)
1694 self.assertIs(x.__class__, A)
1695
1696 class B:
1697 def ham(self):
1698 return 'ham%d' % self
1699 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1700 self.assertEqual(C.__name__, 'C')
1701 self.assertEqual(C.__qualname__, 'C')
1702 self.assertEqual(C.__module__, __name__)
1703 self.assertEqual(C.__bases__, (B, int))
1704 self.assertIs(C.__base__, int)
1705 self.assertIn('spam', C.__dict__)
1706 self.assertNotIn('ham', C.__dict__)
1707 x = C(42)
1708 self.assertEqual(x, 42)
1709 self.assertIs(type(x), C)
1710 self.assertIs(x.__class__, C)
1711 self.assertEqual(x.ham(), 'ham42')
1712 self.assertEqual(x.spam(), 'spam42')
1713 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1714
Nick Coghland78448e2016-07-30 16:26:03 +10001715 def test_type_nokwargs(self):
1716 with self.assertRaises(TypeError):
1717 type('a', (), {}, x=5)
1718 with self.assertRaises(TypeError):
1719 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001720
1721 def test_type_name(self):
1722 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1723 with self.subTest(name=name):
1724 A = type(name, (), {})
1725 self.assertEqual(A.__name__, name)
1726 self.assertEqual(A.__qualname__, name)
1727 self.assertEqual(A.__module__, __name__)
1728 with self.assertRaises(ValueError):
1729 type('A\x00B', (), {})
1730 with self.assertRaises(ValueError):
1731 type('A\udcdcB', (), {})
1732 with self.assertRaises(TypeError):
1733 type(b'A', (), {})
1734
1735 C = type('C', (), {})
1736 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1737 with self.subTest(name=name):
1738 C.__name__ = name
1739 self.assertEqual(C.__name__, name)
1740 self.assertEqual(C.__qualname__, 'C')
1741 self.assertEqual(C.__module__, __name__)
1742
1743 A = type('C', (), {})
1744 with self.assertRaises(ValueError):
1745 A.__name__ = 'A\x00B'
1746 self.assertEqual(A.__name__, 'C')
1747 with self.assertRaises(ValueError):
1748 A.__name__ = 'A\udcdcB'
1749 self.assertEqual(A.__name__, 'C')
1750 with self.assertRaises(TypeError):
1751 A.__name__ = b'A'
1752 self.assertEqual(A.__name__, 'C')
1753
1754 def test_type_qualname(self):
1755 A = type('A', (), {'__qualname__': 'B.C'})
1756 self.assertEqual(A.__name__, 'A')
1757 self.assertEqual(A.__qualname__, 'B.C')
1758 self.assertEqual(A.__module__, __name__)
1759 with self.assertRaises(TypeError):
1760 type('A', (), {'__qualname__': b'B'})
1761 self.assertEqual(A.__qualname__, 'B.C')
1762
1763 A.__qualname__ = 'D.E'
1764 self.assertEqual(A.__name__, 'A')
1765 self.assertEqual(A.__qualname__, 'D.E')
1766 with self.assertRaises(TypeError):
1767 A.__qualname__ = b'B'
1768 self.assertEqual(A.__qualname__, 'D.E')
1769
1770 def test_type_doc(self):
1771 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1772 A = type('A', (), {'__doc__': doc})
1773 self.assertEqual(A.__doc__, doc)
1774 with self.assertRaises(UnicodeEncodeError):
1775 type('A', (), {'__doc__': 'x\udcdcy'})
1776
1777 A = type('A', (), {})
1778 self.assertEqual(A.__doc__, None)
1779 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1780 A.__doc__ = doc
1781 self.assertEqual(A.__doc__, doc)
1782
Eric Snow92a6c172016-09-05 14:50:11 -07001783 def test_type_definition_order_nonempty(self):
1784 class Spam:
1785 b = 1
1786 c = 3
1787 a = 2
1788 d = 4
1789 eggs = 2
1790 e = 5
1791 b = 42
1792
1793 self.assertEqual(Spam.__definition_order__,
1794 ('__module__', '__qualname__',
1795 'b', 'c', 'a', 'd', 'eggs', 'e'))
1796
1797 def test_type_definition_order_empty(self):
1798 class Empty:
1799 pass
1800
1801 self.assertEqual(Empty.__definition_order__,
1802 ('__module__', '__qualname__'))
1803
1804 def test_type_definition_order_on_instance(self):
1805 class Spam:
1806 a = 2
1807 b = 1
1808 c = 3
1809 with self.assertRaises(AttributeError):
1810 Spam().__definition_order__
1811
1812 def test_type_definition_order_set_to_None(self):
1813 class Spam:
1814 a = 2
1815 b = 1
1816 c = 3
1817 Spam.__definition_order__ = None
1818 self.assertEqual(Spam.__definition_order__, None)
1819
1820 def test_type_definition_order_set_to_tuple(self):
1821 class Spam:
1822 a = 2
1823 b = 1
1824 c = 3
1825 Spam.__definition_order__ = ('x', 'y', 'z')
1826 self.assertEqual(Spam.__definition_order__, ('x', 'y', 'z'))
1827
1828 def test_type_definition_order_deleted(self):
1829 class Spam:
1830 a = 2
1831 b = 1
1832 c = 3
1833 del Spam.__definition_order__
1834 self.assertEqual(Spam.__definition_order__, None)
1835
1836 def test_type_definition_order_set_to_bad_type(self):
1837 class Spam:
1838 a = 2
1839 b = 1
1840 c = 3
1841 Spam.__definition_order__ = 42
1842 self.assertEqual(Spam.__definition_order__, 42)
1843
1844 def test_type_definition_order_builtins(self):
1845 self.assertEqual(object.__definition_order__, None)
1846 self.assertEqual(type.__definition_order__, None)
1847 self.assertEqual(dict.__definition_order__, None)
1848 self.assertEqual(type(None).__definition_order__, None)
1849
1850 def test_type_definition_order_dunder_names_included(self):
1851 class Dunder:
1852 VAR = 3
1853 def __init__(self):
1854 pass
1855
1856 self.assertEqual(Dunder.__definition_order__,
1857 ('__module__', '__qualname__',
1858 'VAR', '__init__'))
1859
1860 def test_type_definition_order_only_dunder_names(self):
1861 class DunderOnly:
1862 __xyz__ = None
1863 def __init__(self):
1864 pass
1865
1866 self.assertEqual(DunderOnly.__definition_order__,
1867 ('__module__', '__qualname__',
1868 '__xyz__', '__init__'))
1869
1870 def test_type_definition_order_underscore_names(self):
1871 class HalfDunder:
1872 __whether_to_be = True
1873 or_not_to_be__ = False
1874
1875 self.assertEqual(HalfDunder.__definition_order__,
1876 ('__module__', '__qualname__',
1877 '_HalfDunder__whether_to_be', 'or_not_to_be__'))
1878
1879 def test_type_definition_order_with_slots(self):
1880 class Slots:
1881 __slots__ = ('x', 'y')
1882 a = 1
1883 b = 2
1884
1885 self.assertEqual(Slots.__definition_order__,
1886 ('__module__', '__qualname__',
1887 '__slots__', 'a', 'b'))
1888
1889 def test_type_definition_order_overwritten_None(self):
1890 class OverwrittenNone:
1891 __definition_order__ = None
1892 a = 1
1893 b = 2
1894 c = 3
1895
1896 self.assertEqual(OverwrittenNone.__definition_order__, None)
1897
1898 def test_type_definition_order_overwritten_tuple(self):
1899 class OverwrittenTuple:
1900 __definition_order__ = ('x', 'y', 'z')
1901 a = 1
1902 b = 2
1903 c = 3
1904
1905 self.assertEqual(OverwrittenTuple.__definition_order__,
1906 ('x', 'y', 'z'))
1907
1908 def test_type_definition_order_overwritten_bad_item(self):
1909 with self.assertRaises(TypeError):
1910 class PoorlyOverwritten:
1911 __definition_order__ = ('a', 2, 'c')
1912 a = 1
1913 b = 2
1914 c = 3
1915
1916 def test_type_definition_order_overwritten_bad_type(self):
1917 with self.assertRaises(TypeError):
1918 class PoorlyOverwritten:
1919 __definition_order__ = ['a', 2, 'c']
1920 a = 1
1921 b = 2
1922 c = 3
1923
1924 def test_type_definition_order_metaclass(self):
1925 class Meta(type):
1926 SPAM = 42
1927
1928 def __init__(self, *args, **kwargs):
1929 super().__init__(*args, **kwargs)
1930
1931 self.assertEqual(Meta.__definition_order__,
1932 ('__module__', '__qualname__',
1933 'SPAM', '__init__'))
1934
1935 def test_type_definition_order_OrderedDict(self):
1936 class Meta(type):
1937 def __prepare__(self, *args, **kwargs):
1938 return OrderedDict()
1939
1940 class WithODict(metaclass=Meta):
1941 x='y'
1942
1943 self.assertEqual(WithODict.__definition_order__,
1944 ('__module__', '__qualname__', 'x'))
1945
1946 class Meta(type):
1947 def __prepare__(self, *args, **kwargs):
1948 class ODictSub(OrderedDict):
1949 pass
1950 return ODictSub()
1951
1952 class WithODictSub(metaclass=Meta):
1953 x='y'
1954
1955 self.assertEqual(WithODictSub.__definition_order__,
1956 ('__module__', '__qualname__', 'x'))
1957
1958 @cpython_only
1959 def test_type_definition_order_cpython(self):
1960 # some implementations will have an ordered-by-default dict.
1961
1962 class Meta(type):
1963 def __prepare__(self, *args, **kwargs):
1964 return {}
1965
1966 class NotOrdered(metaclass=Meta):
1967 x='y'
1968
1969 self.assertEqual(NotOrdered.__definition_order__, None)
1970
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001971 def test_bad_args(self):
1972 with self.assertRaises(TypeError):
1973 type()
1974 with self.assertRaises(TypeError):
1975 type('A', ())
1976 with self.assertRaises(TypeError):
1977 type('A', (), {}, ())
1978 with self.assertRaises(TypeError):
1979 type('A', (), dict={})
1980 with self.assertRaises(TypeError):
1981 type('A', [], {})
1982 with self.assertRaises(TypeError):
1983 type('A', (), types.MappingProxyType({}))
1984 with self.assertRaises(TypeError):
1985 type('A', (None,), {})
1986 with self.assertRaises(TypeError):
1987 type('A', (bool,), {})
1988 with self.assertRaises(TypeError):
1989 type('A', (int, str), {})
1990
1991 def test_bad_slots(self):
1992 with self.assertRaises(TypeError):
1993 type('A', (), {'__slots__': b'x'})
1994 with self.assertRaises(TypeError):
1995 type('A', (int,), {'__slots__': 'x'})
1996 with self.assertRaises(TypeError):
1997 type('A', (), {'__slots__': ''})
1998 with self.assertRaises(TypeError):
1999 type('A', (), {'__slots__': '42'})
2000 with self.assertRaises(TypeError):
2001 type('A', (), {'__slots__': 'x\x00y'})
2002 with self.assertRaises(ValueError):
2003 type('A', (), {'__slots__': 'x', 'x': 0})
2004 with self.assertRaises(TypeError):
2005 type('A', (), {'__slots__': ('__dict__', '__dict__')})
2006 with self.assertRaises(TypeError):
2007 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
2008
2009 class B:
2010 pass
2011 with self.assertRaises(TypeError):
2012 type('A', (B,), {'__slots__': '__dict__'})
2013 with self.assertRaises(TypeError):
2014 type('A', (B,), {'__slots__': '__weakref__'})
2015
2016
Zachary Warea4b7a752013-11-24 01:19:09 -06002017def load_tests(loader, tests, pattern):
2018 from doctest import DocTestSuite
2019 tests.addTest(DocTestSuite(builtins))
2020 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00002021
2022if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06002023 unittest.main()