blob: d0d17c76dfd9dc78b6994f492188d6ab160154c8 [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
6import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +02007import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +01008import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00009import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020010import platform
11import random
12import sys
13import traceback
14import types
15import unittest
16import warnings
17from operator import neg
18from test.support import TESTFN, unlink, run_unittest, check_warnings
Antoine Pitrou0d776b12011-11-06 00:34:26 +010019try:
Antoine Pitrou772add72011-11-06 02:37:42 +010020 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010021except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010022 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000023
Guido van Rossum3bead091992-01-27 17:00:37 +000024
Walter Dörwald919497e2003-01-19 16:23:59 +000025class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000026
Walter Dörwald919497e2003-01-19 16:23:59 +000027 def __init__(self, max):
28 self.max = max
29 self.sofar = []
30
31 def __len__(self): return len(self.sofar)
32
33 def __getitem__(self, i):
34 if not 0 <= i < self.max: raise IndexError
35 n = len(self.sofar)
36 while n <= i:
37 self.sofar.append(n*n)
38 n += 1
39 return self.sofar[i]
40
41class StrSquares:
42
43 def __init__(self, max):
44 self.max = max
45 self.sofar = []
46
47 def __len__(self):
48 return len(self.sofar)
49
50 def __getitem__(self, i):
51 if not 0 <= i < self.max:
52 raise IndexError
53 n = len(self.sofar)
54 while n <= i:
55 self.sofar.append(str(n*n))
56 n += 1
57 return self.sofar[i]
58
59class BitBucket:
60 def write(self, line):
61 pass
62
Facundo Batista2336bdd2008-01-19 19:12:01 +000063test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000064 ('0', 0),
65 ('1', 1),
66 ('9', 9),
67 ('10', 10),
68 ('99', 99),
69 ('100', 100),
70 ('314', 314),
71 (' 314', 314),
72 ('314 ', 314),
73 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000074 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000075 (' 1x', ValueError),
76 (' 1 ', 1),
77 (' 1\02 ', ValueError),
78 ('', ValueError),
79 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000080 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000081 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000082 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000083]
84
Facundo Batista2336bdd2008-01-19 19:12:01 +000085test_conv_sign = [
86 ('0', 0),
87 ('1', 1),
88 ('9', 9),
89 ('10', 10),
90 ('99', 99),
91 ('100', 100),
92 ('314', 314),
93 (' 314', ValueError),
94 ('314 ', 314),
95 (' \t\t 314 \t\t ', ValueError),
96 (repr(sys.maxsize), sys.maxsize),
97 (' 1x', ValueError),
98 (' 1 ', ValueError),
99 (' 1\02 ', ValueError),
100 ('', ValueError),
101 (' ', ValueError),
102 (' \t\t ', ValueError),
103 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
104 (chr(0x200), ValueError),
105]
106
Raymond Hettinger96229b12005-03-11 06:49:40 +0000107class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000108 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000109 raise RuntimeError
110
111class TestFailingIter:
112 def __iter__(self):
113 raise RuntimeError
114
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000115def filter_char(arg):
116 return ord(arg) > ord("d")
117
118def map_char(arg):
119 return chr(ord(arg)+1)
120
Walter Dörwald919497e2003-01-19 16:23:59 +0000121class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000122 # Helper to check picklability
123 def check_iter_pickle(self, it, seq):
124 itorg = it
125 d = pickle.dumps(it)
126 it = pickle.loads(d)
127 self.assertEqual(type(itorg), type(it))
128 self.assertEqual(list(it), seq)
129
130 #test the iterator after dropping one from it
131 it = pickle.loads(d)
132 try:
133 next(it)
134 except StopIteration:
135 return
136 d = pickle.dumps(it)
137 it = pickle.loads(d)
138 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000139
140 def test_import(self):
141 __import__('sys')
142 __import__('time')
143 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000144 __import__(name='sys')
145 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000146 self.assertRaises(ImportError, __import__, 'spamspam')
147 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000148 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000149 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000150
151 def test_abs(self):
152 # int
153 self.assertEqual(abs(0), 0)
154 self.assertEqual(abs(1234), 1234)
155 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000156 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000157 # float
158 self.assertEqual(abs(0.0), 0.0)
159 self.assertEqual(abs(3.14), 3.14)
160 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000161 # str
162 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000163 # bool
164 self.assertEqual(abs(True), 1)
165 self.assertEqual(abs(False), 0)
166 # other
167 self.assertRaises(TypeError, abs)
168 self.assertRaises(TypeError, abs, None)
169 class AbsClass(object):
170 def __abs__(self):
171 return -5
172 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000173
Raymond Hettinger96229b12005-03-11 06:49:40 +0000174 def test_all(self):
175 self.assertEqual(all([2, 4, 6]), True)
176 self.assertEqual(all([2, None, 6]), False)
177 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
178 self.assertRaises(RuntimeError, all, TestFailingIter())
179 self.assertRaises(TypeError, all, 10) # Non-iterable
180 self.assertRaises(TypeError, all) # No args
181 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
182 self.assertEqual(all([]), True) # Empty iterator
183 S = [50, 60]
184 self.assertEqual(all(x > 42 for x in S), True)
185 S = [50, 40, 60]
186 self.assertEqual(all(x > 42 for x in S), False)
187
188 def test_any(self):
189 self.assertEqual(any([None, None, None]), False)
190 self.assertEqual(any([None, 4, None]), True)
191 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
192 self.assertRaises(RuntimeError, all, TestFailingIter())
193 self.assertRaises(TypeError, any, 10) # Non-iterable
194 self.assertRaises(TypeError, any) # No args
195 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
196 self.assertEqual(any([]), False) # Empty iterator
197 S = [40, 60, 30]
198 self.assertEqual(any(x > 42 for x in S), True)
199 S = [10, 20, 30]
200 self.assertEqual(any(x > 42 for x in S), False)
201
Georg Brandl559e5d72008-06-11 18:37:52 +0000202 def test_ascii(self):
203 self.assertEqual(ascii(''), '\'\'')
204 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000205 self.assertEqual(ascii(()), '()')
206 self.assertEqual(ascii([]), '[]')
207 self.assertEqual(ascii({}), '{}')
208 a = []
209 a.append(a)
210 self.assertEqual(ascii(a), '[[...]]')
211 a = {}
212 a[0] = a
213 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000214 # Advanced checks for unicode strings
215 def _check_uni(s):
216 self.assertEqual(ascii(s), repr(s))
217 _check_uni("'")
218 _check_uni('"')
219 _check_uni('"\'')
220 _check_uni('\0')
221 _check_uni('\r\n\t .')
222 # Unprintable non-ASCII characters
223 _check_uni('\x85')
224 _check_uni('\u1fff')
225 _check_uni('\U00012fff')
226 # Lone surrogates
227 _check_uni('\ud800')
228 _check_uni('\udfff')
229 # Issue #9804: surrogates should be joined even for printable
230 # wide characters (UCS-2 builds).
231 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
232 # All together
233 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
234 self.assertEqual(ascii(s),
235 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000236
Thomas Wouters89f507f2006-12-13 04:49:30 +0000237 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000238 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000239 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000240 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000241
Walter Dörwald919497e2003-01-19 16:23:59 +0000242 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000243 self.assertTrue(callable(len))
244 self.assertFalse(callable("a"))
245 self.assertTrue(callable(callable))
246 self.assertTrue(callable(lambda x, y: x + y))
247 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000249 self.assertTrue(callable(f))
250
251 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000252 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000253 self.assertTrue(callable(C1))
254 c = C1()
255 self.assertTrue(callable(c.meth))
256 self.assertFalse(callable(c))
257
258 # __call__ is looked up on the class, not the instance
259 c.__call__ = None
260 self.assertFalse(callable(c))
261 c.__call__ = lambda self: 0
262 self.assertFalse(callable(c))
263 del c.__call__
264 self.assertFalse(callable(c))
265
266 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000267 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000268 c2 = C2()
269 self.assertTrue(callable(c2))
270 c2.__call__ = None
271 self.assertTrue(callable(c2))
272 class C3(C2): pass
273 c3 = C3()
274 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000275
276 def test_chr(self):
277 self.assertEqual(chr(32), ' ')
278 self.assertEqual(chr(65), 'A')
279 self.assertEqual(chr(97), 'a')
280 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000281 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000282 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300283 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000284 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000285 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
286 self.assertEqual(chr(0x00010000), "\U00010000")
287 self.assertEqual(chr(0x00010001), "\U00010001")
288 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
289 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
290 self.assertEqual(chr(0x00100000), "\U00100000")
291 self.assertEqual(chr(0x00100001), "\U00100001")
292 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
293 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
294 self.assertRaises(ValueError, chr, -1)
295 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000296 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000297
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000298 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000299 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000300
Walter Dörwald919497e2003-01-19 16:23:59 +0000301 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000302 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000303 bom = b'\xef\xbb\xbf'
304 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000305 compile(source='pass', filename='?', mode='exec')
306 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
307 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000308 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000309 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000310 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
311 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000312 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000313 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
314 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000315 compile('print("\xe5")\n', '', 'exec')
316 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
317 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000318
Georg Brandl8334fd92010-12-04 10:26:46 +0000319 # test the optimize argument
320
321 codestr = '''def f():
322 """doc"""
323 try:
324 assert False
325 except AssertionError:
326 return (True, f.__doc__)
327 else:
328 return (False, f.__doc__)
329 '''
330 def f(): """doc"""
331 values = [(-1, __debug__, f.__doc__),
332 (0, True, 'doc'),
333 (1, False, 'doc'),
334 (2, False, None)]
335 for optval, debugval, docstring in values:
336 # test both direct compilation and compilation via AST
337 codeobjs = []
338 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
339 tree = ast.parse(codestr)
340 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
341 for code in codeobjs:
342 ns = {}
343 exec(code, ns)
344 rv = ns['f']()
345 self.assertEqual(rv, (debugval, docstring))
346
Walter Dörwald919497e2003-01-19 16:23:59 +0000347 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000348 sys.spam = 1
349 delattr(sys, 'spam')
350 self.assertRaises(TypeError, delattr)
351
352 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000353 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000354 self.assertRaises(TypeError, dir, 42, 42)
355
Georg Brandle32b4222007-03-10 22:13:27 +0000356 # dir() - local scope
357 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000358 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000359
360 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000361 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000362
363 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000364 class Foo(types.ModuleType):
365 __dict__ = 8
366 f = Foo("foo")
367 self.assertRaises(TypeError, dir, f)
368
369 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000370 self.assertIn("strip", dir(str))
371 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000372
373 # dir(obj)
374 class Foo(object):
375 def __init__(self):
376 self.x = 7
377 self.y = 8
378 self.z = 9
379 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000380 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000381
382 # dir(obj_no__dict__)
383 class Foo(object):
384 __slots__ = []
385 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000386 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000387
388 # dir(obj_no__class__with__dict__)
389 # (an ugly trick to cause getattr(f, "__class__") to fail)
390 class Foo(object):
391 __slots__ = ["__class__", "__dict__"]
392 def __init__(self):
393 self.bar = "wow"
394 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000395 self.assertNotIn("__repr__", dir(f))
396 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000397
398 # dir(obj_using __dir__)
399 class Foo(object):
400 def __dir__(self):
401 return ["kan", "ga", "roo"]
402 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000403 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000404
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500405 # dir(obj__dir__tuple)
406 class Foo(object):
407 def __dir__(self):
408 return ("b", "c", "a")
409 res = dir(Foo())
410 self.assertIsInstance(res, list)
411 self.assertTrue(res == ["a", "b", "c"])
412
413 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000414 class Foo(object):
415 def __dir__(self):
416 return 7
417 f = Foo()
418 self.assertRaises(TypeError, dir, f)
419
Collin Winter3eed7652007-08-14 17:53:54 +0000420 # dir(traceback)
421 try:
422 raise IndexError
423 except:
424 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
425
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500426 # test that object has a __dir__()
427 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000428
Walter Dörwald919497e2003-01-19 16:23:59 +0000429 def test_divmod(self):
430 self.assertEqual(divmod(12, 7), (1, 5))
431 self.assertEqual(divmod(-12, 7), (-2, 2))
432 self.assertEqual(divmod(12, -7), (-2, -2))
433 self.assertEqual(divmod(-12, -7), (1, -5))
434
Mark Dickinson5c2db372009-12-05 20:28:34 +0000435 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000436
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000437 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
438 (-3.25, 1.0, (-4.0, 0.75)),
439 (3.25, -1.0, (-4.0, -0.75)),
440 (-3.25, -1.0, (3.0, -0.25))]:
441 result = divmod(num, denom)
442 self.assertAlmostEqual(result[0], exp_result[0])
443 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000444
445 self.assertRaises(TypeError, divmod)
446
447 def test_eval(self):
448 self.assertEqual(eval('1+1'), 2)
449 self.assertEqual(eval(' 1+1\n'), 2)
450 globals = {'a': 1, 'b': 2}
451 locals = {'b': 200, 'c': 300}
452 self.assertEqual(eval('a', globals) , 1)
453 self.assertEqual(eval('a', globals, locals), 1)
454 self.assertEqual(eval('b', globals, locals), 200)
455 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000456 globals = {'a': 1, 'b': 2}
457 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000458 bom = b'\xef\xbb\xbf'
459 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000460 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000461 self.assertRaises(TypeError, eval)
462 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000463 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000464
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000465 def test_general_eval(self):
466 # Tests that general mappings can be used for the locals argument
467
468 class M:
469 "Test mapping interface versus possible calls from eval()."
470 def __getitem__(self, key):
471 if key == 'a':
472 return 12
473 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000474 def keys(self):
475 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000476
477 m = M()
478 g = globals()
479 self.assertEqual(eval('a', g, m), 12)
480 self.assertRaises(NameError, eval, 'b', g, m)
481 self.assertEqual(eval('dir()', g, m), list('xyz'))
482 self.assertEqual(eval('globals()', g, m), g)
483 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000484 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000485 class A:
486 "Non-mapping"
487 pass
488 m = A()
489 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000490
491 # Verify that dict subclasses work as well
492 class D(dict):
493 def __getitem__(self, key):
494 if key == 'a':
495 return 12
496 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000497 def keys(self):
498 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000499
500 d = D()
501 self.assertEqual(eval('a', g, d), 12)
502 self.assertRaises(NameError, eval, 'b', g, d)
503 self.assertEqual(eval('dir()', g, d), list('xyz'))
504 self.assertEqual(eval('globals()', g, d), g)
505 self.assertEqual(eval('locals()', g, d), d)
506
507 # Verify locals stores (used by list comps)
508 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000509 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000510
511 class SpreadSheet:
512 "Sample application showing nested, calculated lookups."
513 _cells = {}
514 def __setitem__(self, key, formula):
515 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000516 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000517 return eval(self._cells[key], globals(), self)
518
519 ss = SpreadSheet()
520 ss['a1'] = '5'
521 ss['a2'] = 'a1*6'
522 ss['a3'] = 'a2*7'
523 self.assertEqual(ss['a3'], 210)
524
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000525 # Verify that dir() catches a non-list returned by eval
526 # SF bug #1004669
527 class C:
528 def __getitem__(self, item):
529 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000530 def keys(self):
531 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000532 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
533
Georg Brandl7cae87c2006-09-06 06:51:57 +0000534 def test_exec(self):
535 g = {}
536 exec('z = 1', g)
537 if '__builtins__' in g:
538 del g['__builtins__']
539 self.assertEqual(g, {'z': 1})
540
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000541 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000542 if '__builtins__' in g:
543 del g['__builtins__']
544 self.assertEqual(g, {'z': 2})
545 g = {}
546 l = {}
547
Brett Cannon77628992010-03-20 20:59:33 +0000548 with check_warnings():
549 warnings.filterwarnings("ignore", "global statement",
550 module="<string>")
551 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000552 if '__builtins__' in g:
553 del g['__builtins__']
554 if '__builtins__' in l:
555 del l['__builtins__']
556 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
557
Victor Stinnerb0b22422012-04-19 00:57:45 +0200558 def test_exec_globals(self):
559 code = compile("print('Hello World!')", "", "exec")
560 # no builtin function
561 self.assertRaisesRegex(NameError, "name 'print' is not defined",
562 exec, code, {'__builtins__': {}})
563 # __builtins__ must be a mapping type
564 self.assertRaises(TypeError,
565 exec, code, {'__builtins__': 123})
566
567 # no __build_class__ function
568 code = compile("class A: pass", "", "exec")
569 self.assertRaisesRegex(NameError, "__build_class__ not found",
570 exec, code, {'__builtins__': {}})
571
572 class frozendict_error(Exception):
573 pass
574
575 class frozendict(dict):
576 def __setitem__(self, key, value):
577 raise frozendict_error("frozendict is readonly")
578
579 # read-only builtins
580 frozen_builtins = frozendict(__builtins__)
581 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
582 self.assertRaises(frozendict_error,
583 exec, code, {'__builtins__': frozen_builtins})
584
585 # read-only globals
586 namespace = frozendict({})
587 code = compile("x=1", "test", "exec")
588 self.assertRaises(frozendict_error,
589 exec, code, namespace)
590
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000591 def test_exec_redirected(self):
592 savestdout = sys.stdout
593 sys.stdout = None # Whatever that cannot flush()
594 try:
595 # Used to raise SystemError('error return without exception set')
596 exec('a')
597 except NameError:
598 pass
599 finally:
600 sys.stdout = savestdout
601
Walter Dörwald919497e2003-01-19 16:23:59 +0000602 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000603 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
604 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
605 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
606 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
607 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000608 def identity(item):
609 return 1
610 filter(identity, Squares(5))
611 self.assertRaises(TypeError, filter)
612 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000613 def __getitem__(self, index):
614 if index<4:
615 return 42
616 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000617 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000618 def badfunc():
619 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000620 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000621
Walter Dörwaldbf517072003-01-27 15:57:14 +0000622 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000623 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
624 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
625 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000626
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000627 def test_filter_pickle(self):
628 f1 = filter(filter_char, "abcdeabcde")
629 f2 = filter(filter_char, "abcdeabcde")
630 self.check_iter_pickle(f1, list(f2))
631
Walter Dörwald919497e2003-01-19 16:23:59 +0000632 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000633 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000634 self.assertRaises(TypeError, getattr, sys, 1)
635 self.assertRaises(TypeError, getattr, sys, 1, "foo")
636 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000637 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000638 # unicode surrogates are not encodable to the default encoding (utf8)
639 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000640
641 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000642 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000643 self.assertRaises(TypeError, hasattr, sys, 1)
644 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000645 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000646
Benjamin Peterson17689992010-08-24 03:26:23 +0000647 # Check that hasattr propagates all exceptions outside of
648 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000649 class A:
650 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000651 raise SystemExit
652 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000653 class B:
654 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000655 raise ValueError
656 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000657
Walter Dörwald919497e2003-01-19 16:23:59 +0000658 def test_hash(self):
659 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000660 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 self.assertEqual(hash(1), hash(1.0))
662 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000663 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 hash((0,1,2,3))
665 def f(): pass
666 self.assertRaises(TypeError, hash, [])
667 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668 # Bug 1536021: Allow hash to return long objects
669 class X:
670 def __hash__(self):
671 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000672 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000673 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674 def __hash__(self):
675 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000676 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000677
678 def test_hex(self):
679 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000680 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 self.assertRaises(TypeError, hex, {})
682
683 def test_id(self):
684 id(None)
685 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000686 id(1.0)
687 id('spam')
688 id((0,1,2,3))
689 id([0,1,2,3])
690 id({'spam': 1, 'eggs': 2, 'ham': 3})
691
Guido van Rossuma88a0332007-02-26 16:59:55 +0000692 # Test input() later, alphabetized as if it were raw_input
693
Walter Dörwald919497e2003-01-19 16:23:59 +0000694 def test_iter(self):
695 self.assertRaises(TypeError, iter)
696 self.assertRaises(TypeError, iter, 42, 42)
697 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000698 for l in lists:
699 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000700 self.assertEqual(next(i), '1')
701 self.assertEqual(next(i), '2')
702 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000703
704 def test_isinstance(self):
705 class C:
706 pass
707 class D(C):
708 pass
709 class E:
710 pass
711 c = C()
712 d = D()
713 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000714 self.assertTrue(isinstance(c, C))
715 self.assertTrue(isinstance(d, C))
716 self.assertTrue(not isinstance(e, C))
717 self.assertTrue(not isinstance(c, D))
718 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000719 self.assertRaises(TypeError, isinstance, E, 'foo')
720 self.assertRaises(TypeError, isinstance)
721
722 def test_issubclass(self):
723 class C:
724 pass
725 class D(C):
726 pass
727 class E:
728 pass
729 c = C()
730 d = D()
731 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000732 self.assertTrue(issubclass(D, C))
733 self.assertTrue(issubclass(C, C))
734 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000735 self.assertRaises(TypeError, issubclass, 'foo', E)
736 self.assertRaises(TypeError, issubclass, E, 'foo')
737 self.assertRaises(TypeError, issubclass)
738
739 def test_len(self):
740 self.assertEqual(len('123'), 3)
741 self.assertEqual(len(()), 0)
742 self.assertEqual(len((1, 2, 3, 4)), 4)
743 self.assertEqual(len([1, 2, 3, 4]), 4)
744 self.assertEqual(len({}), 0)
745 self.assertEqual(len({'a':1, 'b': 2}), 2)
746 class BadSeq:
747 def __len__(self):
748 raise ValueError
749 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000750 class InvalidLen:
751 def __len__(self):
752 return None
753 self.assertRaises(TypeError, len, InvalidLen())
754 class FloatLen:
755 def __len__(self):
756 return 4.5
757 self.assertRaises(TypeError, len, FloatLen())
758 class HugeLen:
759 def __len__(self):
760 return sys.maxsize + 1
761 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000762 class NoLenMethod(object): pass
763 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000764
Walter Dörwald919497e2003-01-19 16:23:59 +0000765 def test_map(self):
766 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000767 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000768 [1, 4, 9]
769 )
770 try:
771 from math import sqrt
772 except ImportError:
773 def sqrt(x):
774 return pow(x, 0.5)
775 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000776 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 [[4.0, 2.0], [9.0, 3.0]]
778 )
779 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000780 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 [10, 4, 6]
782 )
783
784 def plus(*v):
785 accu = 0
786 for i in v: accu = accu + i
787 return accu
788 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 [1, 3, 7]
791 )
792 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000793 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000794 [1+4, 3+9, 7+2]
795 )
796 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000797 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000798 [1+4+1, 3+9+1, 7+2+0]
799 )
800 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000801 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
803 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000804 def Max(a, b):
805 if a is None:
806 return b
807 if b is None:
808 return a
809 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000810 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000811 list(map(Max, Squares(3), Squares(2))),
812 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 )
814 self.assertRaises(TypeError, map)
815 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000816 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000817 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000818 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000819 yield None
820 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000821 def badfunc(x):
822 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000823 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000824
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000825 def test_map_pickle(self):
826 m1 = map(map_char, "Is this the real life?")
827 m2 = map(map_char, "Is this the real life?")
828 self.check_iter_pickle(m1, list(m2))
829
Walter Dörwald919497e2003-01-19 16:23:59 +0000830 def test_max(self):
831 self.assertEqual(max('123123'), '3')
832 self.assertEqual(max(1, 2, 3), 3)
833 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
834 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
835
Guido van Rossume2a383d2007-01-15 16:59:06 +0000836 self.assertEqual(max(1, 2, 3.0), 3.0)
837 self.assertEqual(max(1, 2.0, 3), 3)
838 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000839
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000840 for stmt in (
841 "max(key=int)", # no args
842 "max(1, key=int)", # single arg not iterable
843 "max(1, 2, keystone=int)", # wrong keyword
844 "max(1, 2, key=int, abc=int)", # two many keywords
845 "max(1, 2, key=1)", # keyfunc is not callable
846 ):
Tim Peters7f061872004-12-07 21:17:46 +0000847 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000848 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000849 except TypeError:
850 pass
851 else:
852 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000853
854 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
855 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
856 self.assertEqual(max(1, 2, key=neg), 1) # two elems
857
858 data = [random.randrange(200) for i in range(100)]
859 keys = dict((elem, random.randrange(50)) for elem in data)
860 f = keys.__getitem__
861 self.assertEqual(max(data, key=f),
862 sorted(reversed(data), key=f)[-1])
863
Walter Dörwald919497e2003-01-19 16:23:59 +0000864 def test_min(self):
865 self.assertEqual(min('123123'), '1')
866 self.assertEqual(min(1, 2, 3), 1)
867 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
868 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
869
Guido van Rossume2a383d2007-01-15 16:59:06 +0000870 self.assertEqual(min(1, 2, 3.0), 1)
871 self.assertEqual(min(1, 2.0, 3), 1)
872 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
874 self.assertRaises(TypeError, min)
875 self.assertRaises(TypeError, min, 42)
876 self.assertRaises(ValueError, min, ())
877 class BadSeq:
878 def __getitem__(self, index):
879 raise ValueError
880 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000881
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000882 for stmt in (
883 "min(key=int)", # no args
884 "min(1, key=int)", # single arg not iterable
885 "min(1, 2, keystone=int)", # wrong keyword
886 "min(1, 2, key=int, abc=int)", # two many keywords
887 "min(1, 2, key=1)", # keyfunc is not callable
888 ):
Tim Peters7f061872004-12-07 21:17:46 +0000889 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000890 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000891 except TypeError:
892 pass
893 else:
894 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000895
896 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
897 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
898 self.assertEqual(min(1, 2, key=neg), 2) # two elems
899
900 data = [random.randrange(200) for i in range(100)]
901 keys = dict((elem, random.randrange(50)) for elem in data)
902 f = keys.__getitem__
903 self.assertEqual(min(data, key=f),
904 sorted(data, key=f)[0])
905
Georg Brandla18af4e2007-04-21 15:47:16 +0000906 def test_next(self):
907 it = iter(range(2))
908 self.assertEqual(next(it), 0)
909 self.assertEqual(next(it), 1)
910 self.assertRaises(StopIteration, next, it)
911 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000912 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000913
914 class Iter(object):
915 def __iter__(self):
916 return self
917 def __next__(self):
918 raise StopIteration
919
920 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000921 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000922 self.assertRaises(StopIteration, next, it)
923
924 def gen():
925 yield 1
926 return
927
928 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000929 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000930 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000931 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000932
Walter Dörwald919497e2003-01-19 16:23:59 +0000933 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000934 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000935 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000936 self.assertRaises(TypeError, oct, ())
937
938 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000939 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000940 fp = open(TESTFN, 'w')
941 try:
942 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000943 fp.write('The quick brown fox jumps over the lazy dog')
944 fp.write('.\n')
945 fp.write('Dear John\n')
946 fp.write('XXX'*100)
947 fp.write('YYY'*100)
948 finally:
949 fp.close()
950
951 def test_open(self):
952 self.write_testfile()
953 fp = open(TESTFN, 'r')
954 try:
955 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000956 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
957 self.assertEqual(fp.readline(4), 'Dear')
958 self.assertEqual(fp.readline(100), ' John\n')
959 self.assertEqual(fp.read(300), 'XXX'*100)
960 self.assertEqual(fp.read(1000), 'YYY'*100)
961 finally:
962 fp.close()
963 unlink(TESTFN)
964
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200965 def test_open_default_encoding(self):
966 old_environ = dict(os.environ)
967 try:
968 # try to get a user preferred encoding different than the current
969 # locale encoding to check that open() uses the current locale
970 # encoding and not the user preferred encoding
971 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
972 if key in os.environ:
973 del os.environ[key]
974
975 self.write_testfile()
976 current_locale_encoding = locale.getpreferredencoding(False)
977 fp = open(TESTFN, 'w')
978 try:
979 self.assertEqual(fp.encoding, current_locale_encoding)
980 finally:
981 fp.close()
982 finally:
983 os.environ.clear()
984 os.environ.update(old_environ)
985
Walter Dörwald919497e2003-01-19 16:23:59 +0000986 def test_ord(self):
987 self.assertEqual(ord(' '), 32)
988 self.assertEqual(ord('A'), 65)
989 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000990 self.assertEqual(ord('\x80'), 128)
991 self.assertEqual(ord('\xff'), 255)
992
993 self.assertEqual(ord(b' '), 32)
994 self.assertEqual(ord(b'A'), 65)
995 self.assertEqual(ord(b'a'), 97)
996 self.assertEqual(ord(b'\x80'), 128)
997 self.assertEqual(ord(b'\xff'), 255)
998
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000999 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001001
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001002 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1003 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1004 self.assertEqual(ord("\U00010000"), 0x00010000)
1005 self.assertEqual(ord("\U00010001"), 0x00010001)
1006 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1007 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1008 self.assertEqual(ord("\U00100000"), 0x00100000)
1009 self.assertEqual(ord("\U00100001"), 0x00100001)
1010 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1011 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1012
Walter Dörwald919497e2003-01-19 16:23:59 +00001013 def test_pow(self):
1014 self.assertEqual(pow(0,0), 1)
1015 self.assertEqual(pow(0,1), 0)
1016 self.assertEqual(pow(1,0), 1)
1017 self.assertEqual(pow(1,1), 1)
1018
1019 self.assertEqual(pow(2,0), 1)
1020 self.assertEqual(pow(2,10), 1024)
1021 self.assertEqual(pow(2,20), 1024*1024)
1022 self.assertEqual(pow(2,30), 1024*1024*1024)
1023
1024 self.assertEqual(pow(-2,0), 1)
1025 self.assertEqual(pow(-2,1), -2)
1026 self.assertEqual(pow(-2,2), 4)
1027 self.assertEqual(pow(-2,3), -8)
1028
Walter Dörwald919497e2003-01-19 16:23:59 +00001029 self.assertAlmostEqual(pow(0.,0), 1.)
1030 self.assertAlmostEqual(pow(0.,1), 0.)
1031 self.assertAlmostEqual(pow(1.,0), 1.)
1032 self.assertAlmostEqual(pow(1.,1), 1.)
1033
1034 self.assertAlmostEqual(pow(2.,0), 1.)
1035 self.assertAlmostEqual(pow(2.,10), 1024.)
1036 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1037 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1038
1039 self.assertAlmostEqual(pow(-2.,0), 1.)
1040 self.assertAlmostEqual(pow(-2.,1), -2.)
1041 self.assertAlmostEqual(pow(-2.,2), 4.)
1042 self.assertAlmostEqual(pow(-2.,3), -8.)
1043
Mark Dickinson5c2db372009-12-05 20:28:34 +00001044 for x in 2, 2.0:
1045 for y in 10, 10.0:
1046 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001047 if isinstance(x, float) or \
1048 isinstance(y, float) or \
1049 isinstance(z, float):
1050 self.assertRaises(TypeError, pow, x, y, z)
1051 else:
1052 self.assertAlmostEqual(pow(x, y, z), 24.0)
1053
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001054 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1055 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1056
Walter Dörwald919497e2003-01-19 16:23:59 +00001057 self.assertRaises(TypeError, pow, -1, -2, 3)
1058 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001059
1060 self.assertRaises(TypeError, pow)
1061
Guido van Rossuma88a0332007-02-26 16:59:55 +00001062 def test_input(self):
1063 self.write_testfile()
1064 fp = open(TESTFN, 'r')
1065 savestdin = sys.stdin
1066 savestdout = sys.stdout # Eats the echo
1067 try:
1068 sys.stdin = fp
1069 sys.stdout = BitBucket()
1070 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001071 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1072 self.assertEqual(input('testing\n'), 'Dear John')
1073
1074 # SF 1535165: don't segfault on closed stdin
1075 # sys.stdout must be a regular file for triggering
1076 sys.stdout = savestdout
1077 sys.stdin.close()
1078 self.assertRaises(ValueError, input)
1079
1080 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001081 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001082 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001083 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001084 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001085 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001086 self.assertRaises(EOFError, input)
1087
1088 del sys.stdout
1089 self.assertRaises(RuntimeError, input, 'prompt')
1090 del sys.stdin
1091 self.assertRaises(RuntimeError, input, 'prompt')
1092 finally:
1093 sys.stdin = savestdin
1094 sys.stdout = savestdout
1095 fp.close()
1096 unlink(TESTFN)
1097
Antoine Pitrou772add72011-11-06 02:37:42 +01001098 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001099 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001100 if not sys.stdin.isatty() or not sys.stdout.isatty():
1101 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001102 r, w = os.pipe()
1103 try:
1104 pid, fd = pty.fork()
1105 except (OSError, AttributeError) as e:
1106 os.close(r)
1107 os.close(w)
1108 self.skipTest("pty.fork() raised {}".format(e))
1109 if pid == 0:
1110 # Child
Antoine Pitrou772add72011-11-06 02:37:42 +01001111 try:
1112 # Make sure we don't get stuck if there's a problem
1113 signal.alarm(2)
1114 os.close(r)
1115 # Check the error handlers are accounted for
1116 if stdio_encoding:
1117 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1118 encoding=stdio_encoding,
1119 errors='surrogateescape')
1120 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1121 encoding=stdio_encoding,
1122 errors='replace')
1123 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001124 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1125 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou772add72011-11-06 02:37:42 +01001126 except:
1127 traceback.print_exc()
1128 finally:
1129 # We don't want to return to unittest...
1130 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001131 # Parent
1132 os.close(w)
1133 os.write(fd, terminal_input + b"\r\n")
1134 # Get results from the pipe
1135 with open(r, "r") as rpipe:
1136 lines = []
1137 while True:
1138 line = rpipe.readline().strip()
Antoine Pitrou772add72011-11-06 02:37:42 +01001139 if line == "":
1140 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001141 break
1142 lines.append(line)
Antoine Pitrou772add72011-11-06 02:37:42 +01001143 # Check the result was got and corresponds to the user's terminal input
1144 if len(lines) != 2:
1145 # Something went wrong, try to get at stderr
1146 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1147 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1148 % (len(lines), child_output.read()))
1149 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001150 # Check we did exercise the GNU readline path
1151 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1152 if lines[0] != 'tty = True':
1153 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001154 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1155 if stdio_encoding:
1156 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1157 else:
1158 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1159 self.assertEqual(input_result, expected)
1160
1161 def test_input_tty(self):
1162 # Test input() functionality when wired to a tty (the code path
1163 # is different and invokes GNU readline if available).
1164 self.check_input_tty("prompt", b"quux")
1165
1166 def test_input_tty_non_ascii(self):
1167 # Check stdin/stdout encoding is used when invoking GNU readline
1168 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1169
1170 def test_input_tty_non_ascii_unicode_errors(self):
1171 # Check stdin/stdout error handler is used when invoking GNU readline
1172 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1173
Walter Dörwald919497e2003-01-19 16:23:59 +00001174 def test_repr(self):
1175 self.assertEqual(repr(''), '\'\'')
1176 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001177 self.assertEqual(repr(()), '()')
1178 self.assertEqual(repr([]), '[]')
1179 self.assertEqual(repr({}), '{}')
1180 a = []
1181 a.append(a)
1182 self.assertEqual(repr(a), '[[...]]')
1183 a = {}
1184 a[0] = a
1185 self.assertEqual(repr(a), '{0: {...}}')
1186
1187 def test_round(self):
1188 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001189 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 self.assertEqual(round(1.0), 1.0)
1191 self.assertEqual(round(10.0), 10.0)
1192 self.assertEqual(round(1000000000.0), 1000000000.0)
1193 self.assertEqual(round(1e20), 1e20)
1194
1195 self.assertEqual(round(-1.0), -1.0)
1196 self.assertEqual(round(-10.0), -10.0)
1197 self.assertEqual(round(-1000000000.0), -1000000000.0)
1198 self.assertEqual(round(-1e20), -1e20)
1199
1200 self.assertEqual(round(0.1), 0.0)
1201 self.assertEqual(round(1.1), 1.0)
1202 self.assertEqual(round(10.1), 10.0)
1203 self.assertEqual(round(1000000000.1), 1000000000.0)
1204
1205 self.assertEqual(round(-1.1), -1.0)
1206 self.assertEqual(round(-10.1), -10.0)
1207 self.assertEqual(round(-1000000000.1), -1000000000.0)
1208
1209 self.assertEqual(round(0.9), 1.0)
1210 self.assertEqual(round(9.9), 10.0)
1211 self.assertEqual(round(999999999.9), 1000000000.0)
1212
1213 self.assertEqual(round(-0.9), -1.0)
1214 self.assertEqual(round(-9.9), -10.0)
1215 self.assertEqual(round(-999999999.9), -1000000000.0)
1216
1217 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001218 self.assertEqual(type(round(-8.0, -1)), float)
1219
1220 self.assertEqual(type(round(-8.0, 0)), float)
1221 self.assertEqual(type(round(-8.0, 1)), float)
1222
1223 # Check even / odd rounding behaviour
1224 self.assertEqual(round(5.5), 6)
1225 self.assertEqual(round(6.5), 6)
1226 self.assertEqual(round(-5.5), -6)
1227 self.assertEqual(round(-6.5), -6)
1228
1229 # Check behavior on ints
1230 self.assertEqual(round(0), 0)
1231 self.assertEqual(round(8), 8)
1232 self.assertEqual(round(-8), -8)
1233 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001234 self.assertEqual(type(round(-8, -1)), int)
1235 self.assertEqual(type(round(-8, 0)), int)
1236 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001237
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001238 # test new kwargs
1239 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 self.assertRaises(TypeError, round)
1242
Alex Martelliae211f92007-08-22 23:21:33 +00001243 # test generic rounding delegation for reals
1244 class TestRound:
1245 def __round__(self):
1246 return 23
1247
1248 class TestNoRound:
1249 pass
1250
1251 self.assertEqual(round(TestRound()), 23)
1252
1253 self.assertRaises(TypeError, round, 1, 2, 3)
1254 self.assertRaises(TypeError, round, TestNoRound())
1255
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001256 t = TestNoRound()
1257 t.__round__ = lambda *args: args
1258 self.assertRaises(TypeError, round, t)
1259 self.assertRaises(TypeError, round, t, 0)
1260
Mark Dickinsonad731b92009-11-09 17:12:30 +00001261 # Some versions of glibc for alpha have a bug that affects
1262 # float -> integer rounding (floor, ceil, rint, round) for
1263 # values in the range [2**52, 2**53). See:
1264 #
1265 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1266 #
1267 # We skip this test on Linux/alpha if it would fail.
1268 linux_alpha = (platform.system().startswith('Linux') and
1269 platform.machine().startswith('alpha'))
1270 system_round_bug = round(5e15+1) != 5e15+1
1271 @unittest.skipIf(linux_alpha and system_round_bug,
1272 "test will fail; failure is probably due to a "
1273 "buggy system round function")
1274 def test_round_large(self):
1275 # Issue #1869: integral floats should remain unchanged
1276 self.assertEqual(round(5e15-1), 5e15-1)
1277 self.assertEqual(round(5e15), 5e15)
1278 self.assertEqual(round(5e15+1), 5e15+1)
1279 self.assertEqual(round(5e15+2), 5e15+2)
1280 self.assertEqual(round(5e15+3), 5e15+3)
1281
Walter Dörwald919497e2003-01-19 16:23:59 +00001282 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001283 setattr(sys, 'spam', 1)
1284 self.assertEqual(sys.spam, 1)
1285 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1286 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001287
Walter Dörwald919497e2003-01-19 16:23:59 +00001288
Alex Martellia70b1912003-04-22 08:12:33 +00001289 def test_sum(self):
1290 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001291 self.assertEqual(sum(list(range(2,8))), 27)
1292 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001293 self.assertEqual(sum(Squares(10)), 285)
1294 self.assertEqual(sum(iter(Squares(10))), 285)
1295 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1296
1297 self.assertRaises(TypeError, sum)
1298 self.assertRaises(TypeError, sum, 42)
1299 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1300 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001301 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1302 values = [bytearray(b'a'), bytearray(b'b')]
1303 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001304 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1305 self.assertRaises(TypeError, sum, [{2:3}])
1306 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1307
1308 class BadSeq:
1309 def __getitem__(self, index):
1310 raise ValueError
1311 self.assertRaises(ValueError, sum, BadSeq())
1312
Mark Dickinson3a22b472009-10-17 21:48:16 +00001313 empty = []
1314 sum(([x] for x in range(10)), empty)
1315 self.assertEqual(empty, [])
1316
Walter Dörwald919497e2003-01-19 16:23:59 +00001317 def test_type(self):
1318 self.assertEqual(type(''), type('123'))
1319 self.assertNotEqual(type(''), type(()))
1320
Guido van Rossumfee7b932005-01-16 00:21:28 +00001321 # We don't want self in vars(), so these are static methods
1322
1323 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001324 def get_vars_f0():
1325 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001326
Guido van Rossumfee7b932005-01-16 00:21:28 +00001327 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001328 def get_vars_f2():
1329 BuiltinTest.get_vars_f0()
1330 a = 1
1331 b = 2
1332 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001333
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001334 class C_get_vars(object):
1335 def getDict(self):
1336 return {'a':2}
1337 __dict__ = property(fget=getDict)
1338
Walter Dörwald919497e2003-01-19 16:23:59 +00001339 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001340 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001341 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001342 self.assertEqual(self.get_vars_f0(), {})
1343 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1344 self.assertRaises(TypeError, vars, 42, 42)
1345 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001346 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001347
1348 def test_zip(self):
1349 a = (1, 2, 3)
1350 b = (4, 5, 6)
1351 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001352 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001353 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001354 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001355 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001356 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001357 class I:
1358 def __getitem__(self, i):
1359 if i < 0 or i > 2: raise IndexError
1360 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001361 self.assertEqual(list(zip(a, I())), t)
1362 self.assertEqual(list(zip()), [])
1363 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001364 self.assertRaises(TypeError, zip, None)
1365 class G:
1366 pass
1367 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001368 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001369
1370 # Make sure zip doesn't try to allocate a billion elements for the
1371 # result list when one of its arguments doesn't say how long it is.
1372 # A MemoryError is the most likely failure mode.
1373 class SequenceWithoutALength:
1374 def __getitem__(self, i):
1375 if i == 5:
1376 raise IndexError
1377 else:
1378 return i
1379 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001380 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001381 list(enumerate(range(5)))
1382 )
1383
1384 class BadSeq:
1385 def __getitem__(self, i):
1386 if i == 5:
1387 raise ValueError
1388 else:
1389 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001390 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001391
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001392 def test_zip_pickle(self):
1393 a = (1, 2, 3)
1394 b = (4, 5, 6)
1395 t = [(1, 4), (2, 5), (3, 6)]
1396 z1 = zip(a, b)
1397 self.check_iter_pickle(z1, t)
1398
Eric Smithe4d63172010-09-13 20:48:43 +00001399 def test_format(self):
1400 # Test the basic machinery of the format() builtin. Don't test
1401 # the specifics of the various formatters
1402 self.assertEqual(format(3, ''), '3')
1403
1404 # Returns some classes to use for various tests. There's
1405 # an old-style version, and a new-style version
1406 def classes_new():
1407 class A(object):
1408 def __init__(self, x):
1409 self.x = x
1410 def __format__(self, format_spec):
1411 return str(self.x) + format_spec
1412 class DerivedFromA(A):
1413 pass
1414
1415 class Simple(object): pass
1416 class DerivedFromSimple(Simple):
1417 def __init__(self, x):
1418 self.x = x
1419 def __format__(self, format_spec):
1420 return str(self.x) + format_spec
1421 class DerivedFromSimple2(DerivedFromSimple): pass
1422 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1423
1424 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1425 self.assertEqual(format(A(3), 'spec'), '3spec')
1426 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1427 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1428 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1429 '10abcdef')
1430
1431 class_test(*classes_new())
1432
1433 def empty_format_spec(value):
1434 # test that:
1435 # format(x, '') == str(x)
1436 # format(x) == str(x)
1437 self.assertEqual(format(value, ""), str(value))
1438 self.assertEqual(format(value), str(value))
1439
1440 # for builtin types, format(x, "") == str(x)
1441 empty_format_spec(17**13)
1442 empty_format_spec(1.0)
1443 empty_format_spec(3.1415e104)
1444 empty_format_spec(-3.1415e104)
1445 empty_format_spec(3.1415e-104)
1446 empty_format_spec(-3.1415e-104)
1447 empty_format_spec(object)
1448 empty_format_spec(None)
1449
1450 # TypeError because self.__format__ returns the wrong type
1451 class BadFormatResult:
1452 def __format__(self, format_spec):
1453 return 1.0
1454 self.assertRaises(TypeError, format, BadFormatResult(), "")
1455
1456 # TypeError because format_spec is not unicode or str
1457 self.assertRaises(TypeError, format, object(), 4)
1458 self.assertRaises(TypeError, format, object(), object())
1459
1460 # tests for object.__format__ really belong elsewhere, but
1461 # there's no good place to put them
1462 x = object().__format__('')
1463 self.assertTrue(x.startswith('<object object at'))
1464
1465 # first argument to object.__format__ must be string
1466 self.assertRaises(TypeError, object().__format__, 3)
1467 self.assertRaises(TypeError, object().__format__, object())
1468 self.assertRaises(TypeError, object().__format__, None)
1469
1470 # --------------------------------------------------------------------
1471 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001472 # deprecated
Eric Smithe4d63172010-09-13 20:48:43 +00001473 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1474 with warnings.catch_warnings(record=True) as w:
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001475 warnings.simplefilter("always", DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001476 format(obj, fmt_str)
1477 if should_raise_warning:
1478 self.assertEqual(len(w), 1)
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001479 self.assertIsInstance(w[0].message, DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001480 self.assertIn('object.__format__ with a non-empty format '
1481 'string', str(w[0].message))
1482 else:
1483 self.assertEqual(len(w), 0)
1484
1485 fmt_strs = ['', 's']
1486
1487 class A:
1488 def __format__(self, fmt_str):
1489 return format('', fmt_str)
1490
1491 for fmt_str in fmt_strs:
1492 test_deprecated_format_string(A(), fmt_str, False)
1493
1494 class B:
1495 pass
1496
1497 class C(object):
1498 pass
1499
1500 for cls in [object, B, C]:
1501 for fmt_str in fmt_strs:
1502 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1503 # --------------------------------------------------------------------
1504
1505 # make sure we can take a subclass of str as a format spec
1506 class DerivedFromStr(str): pass
1507 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1508
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001509 def test_bin(self):
1510 self.assertEqual(bin(0), '0b0')
1511 self.assertEqual(bin(1), '0b1')
1512 self.assertEqual(bin(-1), '-0b1')
1513 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1514 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1515 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1516 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1517
Georg Brandl953152f2009-07-22 12:03:59 +00001518 def test_bytearray_translate(self):
1519 x = bytearray(b"abc")
1520 self.assertRaises(ValueError, x.translate, b"1", 1)
1521 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1522
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001523 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001524 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001525 tp = type(const)
1526 self.assertIs(tp(), const)
1527 self.assertRaises(TypeError, tp, 1, 2)
1528 self.assertRaises(TypeError, tp, a=1, b=2)
1529
Raymond Hettinger64958a12003-12-17 20:43:33 +00001530class TestSorted(unittest.TestCase):
1531
1532 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001533 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001534 copy = data[:]
1535 random.shuffle(copy)
1536 self.assertEqual(data, sorted(copy))
1537 self.assertNotEqual(data, copy)
1538
1539 data.reverse()
1540 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001541 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1542 self.assertNotEqual(data, copy)
1543 random.shuffle(copy)
1544 self.assertEqual(data, sorted(copy, reverse=1))
1545 self.assertNotEqual(data, copy)
1546
1547 def test_inputtypes(self):
1548 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001549 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001550 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001551 self.assertEqual(sorted(s), sorted(T(s)))
1552
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001553 s = ''.join(set(s)) # unique letters only
1554 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001555 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001556 self.assertEqual(sorted(s), sorted(T(s)))
1557
1558 def test_baddecorator(self):
1559 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1560 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1561
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001562def test_main(verbose=None):
1563 test_classes = (BuiltinTest, TestSorted)
1564
1565 run_unittest(*test_classes)
1566
1567 # verify reference counting
1568 if verbose and hasattr(sys, "gettotalrefcount"):
1569 import gc
1570 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001571 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001572 run_unittest(*test_classes)
1573 gc.collect()
1574 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001575 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001576
Walter Dörwald919497e2003-01-19 16:23:59 +00001577
1578if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001579 test_main(verbose=True)