blob: c32992cc898ef7c8abe840d640f15da09c60d5e1 [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()
Florent Xicluna3f4ce632012-07-08 12:08:45 +0200963 unlink(TESTFN)
Walter Dörwald919497e2003-01-19 16:23:59 +0000964
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()
Florent Xicluna3f4ce632012-07-08 12:08:45 +0200982 unlink(TESTFN)
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200983 finally:
984 os.environ.clear()
985 os.environ.update(old_environ)
986
Walter Dörwald919497e2003-01-19 16:23:59 +0000987 def test_ord(self):
988 self.assertEqual(ord(' '), 32)
989 self.assertEqual(ord('A'), 65)
990 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000991 self.assertEqual(ord('\x80'), 128)
992 self.assertEqual(ord('\xff'), 255)
993
994 self.assertEqual(ord(b' '), 32)
995 self.assertEqual(ord(b'A'), 65)
996 self.assertEqual(ord(b'a'), 97)
997 self.assertEqual(ord(b'\x80'), 128)
998 self.assertEqual(ord(b'\xff'), 255)
999
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001000 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001001 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001002
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001003 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1004 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1005 self.assertEqual(ord("\U00010000"), 0x00010000)
1006 self.assertEqual(ord("\U00010001"), 0x00010001)
1007 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1008 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1009 self.assertEqual(ord("\U00100000"), 0x00100000)
1010 self.assertEqual(ord("\U00100001"), 0x00100001)
1011 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1012 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1013
Walter Dörwald919497e2003-01-19 16:23:59 +00001014 def test_pow(self):
1015 self.assertEqual(pow(0,0), 1)
1016 self.assertEqual(pow(0,1), 0)
1017 self.assertEqual(pow(1,0), 1)
1018 self.assertEqual(pow(1,1), 1)
1019
1020 self.assertEqual(pow(2,0), 1)
1021 self.assertEqual(pow(2,10), 1024)
1022 self.assertEqual(pow(2,20), 1024*1024)
1023 self.assertEqual(pow(2,30), 1024*1024*1024)
1024
1025 self.assertEqual(pow(-2,0), 1)
1026 self.assertEqual(pow(-2,1), -2)
1027 self.assertEqual(pow(-2,2), 4)
1028 self.assertEqual(pow(-2,3), -8)
1029
Walter Dörwald919497e2003-01-19 16:23:59 +00001030 self.assertAlmostEqual(pow(0.,0), 1.)
1031 self.assertAlmostEqual(pow(0.,1), 0.)
1032 self.assertAlmostEqual(pow(1.,0), 1.)
1033 self.assertAlmostEqual(pow(1.,1), 1.)
1034
1035 self.assertAlmostEqual(pow(2.,0), 1.)
1036 self.assertAlmostEqual(pow(2.,10), 1024.)
1037 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1038 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1039
1040 self.assertAlmostEqual(pow(-2.,0), 1.)
1041 self.assertAlmostEqual(pow(-2.,1), -2.)
1042 self.assertAlmostEqual(pow(-2.,2), 4.)
1043 self.assertAlmostEqual(pow(-2.,3), -8.)
1044
Mark Dickinson5c2db372009-12-05 20:28:34 +00001045 for x in 2, 2.0:
1046 for y in 10, 10.0:
1047 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001048 if isinstance(x, float) or \
1049 isinstance(y, float) or \
1050 isinstance(z, float):
1051 self.assertRaises(TypeError, pow, x, y, z)
1052 else:
1053 self.assertAlmostEqual(pow(x, y, z), 24.0)
1054
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001055 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1056 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1057
Walter Dörwald919497e2003-01-19 16:23:59 +00001058 self.assertRaises(TypeError, pow, -1, -2, 3)
1059 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001060
1061 self.assertRaises(TypeError, pow)
1062
Guido van Rossuma88a0332007-02-26 16:59:55 +00001063 def test_input(self):
1064 self.write_testfile()
1065 fp = open(TESTFN, 'r')
1066 savestdin = sys.stdin
1067 savestdout = sys.stdout # Eats the echo
1068 try:
1069 sys.stdin = fp
1070 sys.stdout = BitBucket()
1071 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001072 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1073 self.assertEqual(input('testing\n'), 'Dear John')
1074
1075 # SF 1535165: don't segfault on closed stdin
1076 # sys.stdout must be a regular file for triggering
1077 sys.stdout = savestdout
1078 sys.stdin.close()
1079 self.assertRaises(ValueError, input)
1080
1081 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001082 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001083 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001084 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001085 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001086 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001087 self.assertRaises(EOFError, input)
1088
1089 del sys.stdout
1090 self.assertRaises(RuntimeError, input, 'prompt')
1091 del sys.stdin
1092 self.assertRaises(RuntimeError, input, 'prompt')
1093 finally:
1094 sys.stdin = savestdin
1095 sys.stdout = savestdout
1096 fp.close()
1097 unlink(TESTFN)
1098
Antoine Pitrou772add72011-11-06 02:37:42 +01001099 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001100 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001101 if not sys.stdin.isatty() or not sys.stdout.isatty():
1102 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001103 r, w = os.pipe()
1104 try:
1105 pid, fd = pty.fork()
1106 except (OSError, AttributeError) as e:
1107 os.close(r)
1108 os.close(w)
1109 self.skipTest("pty.fork() raised {}".format(e))
1110 if pid == 0:
1111 # Child
Antoine Pitrou772add72011-11-06 02:37:42 +01001112 try:
1113 # Make sure we don't get stuck if there's a problem
1114 signal.alarm(2)
1115 os.close(r)
1116 # Check the error handlers are accounted for
1117 if stdio_encoding:
1118 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1119 encoding=stdio_encoding,
1120 errors='surrogateescape')
1121 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1122 encoding=stdio_encoding,
1123 errors='replace')
1124 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001125 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1126 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou772add72011-11-06 02:37:42 +01001127 except:
1128 traceback.print_exc()
1129 finally:
1130 # We don't want to return to unittest...
1131 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001132 # Parent
1133 os.close(w)
1134 os.write(fd, terminal_input + b"\r\n")
1135 # Get results from the pipe
1136 with open(r, "r") as rpipe:
1137 lines = []
1138 while True:
1139 line = rpipe.readline().strip()
Antoine Pitrou772add72011-11-06 02:37:42 +01001140 if line == "":
1141 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001142 break
1143 lines.append(line)
Antoine Pitrou772add72011-11-06 02:37:42 +01001144 # Check the result was got and corresponds to the user's terminal input
1145 if len(lines) != 2:
1146 # Something went wrong, try to get at stderr
1147 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1148 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1149 % (len(lines), child_output.read()))
1150 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001151 # Check we did exercise the GNU readline path
1152 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1153 if lines[0] != 'tty = True':
1154 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001155 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1156 if stdio_encoding:
1157 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1158 else:
1159 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1160 self.assertEqual(input_result, expected)
1161
1162 def test_input_tty(self):
1163 # Test input() functionality when wired to a tty (the code path
1164 # is different and invokes GNU readline if available).
1165 self.check_input_tty("prompt", b"quux")
1166
1167 def test_input_tty_non_ascii(self):
1168 # Check stdin/stdout encoding is used when invoking GNU readline
1169 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1170
1171 def test_input_tty_non_ascii_unicode_errors(self):
1172 # Check stdin/stdout error handler is used when invoking GNU readline
1173 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1174
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 def test_repr(self):
1176 self.assertEqual(repr(''), '\'\'')
1177 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001178 self.assertEqual(repr(()), '()')
1179 self.assertEqual(repr([]), '[]')
1180 self.assertEqual(repr({}), '{}')
1181 a = []
1182 a.append(a)
1183 self.assertEqual(repr(a), '[[...]]')
1184 a = {}
1185 a[0] = a
1186 self.assertEqual(repr(a), '{0: {...}}')
1187
1188 def test_round(self):
1189 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001190 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001191 self.assertEqual(round(1.0), 1.0)
1192 self.assertEqual(round(10.0), 10.0)
1193 self.assertEqual(round(1000000000.0), 1000000000.0)
1194 self.assertEqual(round(1e20), 1e20)
1195
1196 self.assertEqual(round(-1.0), -1.0)
1197 self.assertEqual(round(-10.0), -10.0)
1198 self.assertEqual(round(-1000000000.0), -1000000000.0)
1199 self.assertEqual(round(-1e20), -1e20)
1200
1201 self.assertEqual(round(0.1), 0.0)
1202 self.assertEqual(round(1.1), 1.0)
1203 self.assertEqual(round(10.1), 10.0)
1204 self.assertEqual(round(1000000000.1), 1000000000.0)
1205
1206 self.assertEqual(round(-1.1), -1.0)
1207 self.assertEqual(round(-10.1), -10.0)
1208 self.assertEqual(round(-1000000000.1), -1000000000.0)
1209
1210 self.assertEqual(round(0.9), 1.0)
1211 self.assertEqual(round(9.9), 10.0)
1212 self.assertEqual(round(999999999.9), 1000000000.0)
1213
1214 self.assertEqual(round(-0.9), -1.0)
1215 self.assertEqual(round(-9.9), -10.0)
1216 self.assertEqual(round(-999999999.9), -1000000000.0)
1217
1218 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001219 self.assertEqual(type(round(-8.0, -1)), float)
1220
1221 self.assertEqual(type(round(-8.0, 0)), float)
1222 self.assertEqual(type(round(-8.0, 1)), float)
1223
1224 # Check even / odd rounding behaviour
1225 self.assertEqual(round(5.5), 6)
1226 self.assertEqual(round(6.5), 6)
1227 self.assertEqual(round(-5.5), -6)
1228 self.assertEqual(round(-6.5), -6)
1229
1230 # Check behavior on ints
1231 self.assertEqual(round(0), 0)
1232 self.assertEqual(round(8), 8)
1233 self.assertEqual(round(-8), -8)
1234 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001235 self.assertEqual(type(round(-8, -1)), int)
1236 self.assertEqual(type(round(-8, 0)), int)
1237 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001238
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001239 # test new kwargs
1240 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1241
Walter Dörwald919497e2003-01-19 16:23:59 +00001242 self.assertRaises(TypeError, round)
1243
Alex Martelliae211f92007-08-22 23:21:33 +00001244 # test generic rounding delegation for reals
1245 class TestRound:
1246 def __round__(self):
1247 return 23
1248
1249 class TestNoRound:
1250 pass
1251
1252 self.assertEqual(round(TestRound()), 23)
1253
1254 self.assertRaises(TypeError, round, 1, 2, 3)
1255 self.assertRaises(TypeError, round, TestNoRound())
1256
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001257 t = TestNoRound()
1258 t.__round__ = lambda *args: args
1259 self.assertRaises(TypeError, round, t)
1260 self.assertRaises(TypeError, round, t, 0)
1261
Mark Dickinsonad731b92009-11-09 17:12:30 +00001262 # Some versions of glibc for alpha have a bug that affects
1263 # float -> integer rounding (floor, ceil, rint, round) for
1264 # values in the range [2**52, 2**53). See:
1265 #
1266 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1267 #
1268 # We skip this test on Linux/alpha if it would fail.
1269 linux_alpha = (platform.system().startswith('Linux') and
1270 platform.machine().startswith('alpha'))
1271 system_round_bug = round(5e15+1) != 5e15+1
1272 @unittest.skipIf(linux_alpha and system_round_bug,
1273 "test will fail; failure is probably due to a "
1274 "buggy system round function")
1275 def test_round_large(self):
1276 # Issue #1869: integral floats should remain unchanged
1277 self.assertEqual(round(5e15-1), 5e15-1)
1278 self.assertEqual(round(5e15), 5e15)
1279 self.assertEqual(round(5e15+1), 5e15+1)
1280 self.assertEqual(round(5e15+2), 5e15+2)
1281 self.assertEqual(round(5e15+3), 5e15+3)
1282
Walter Dörwald919497e2003-01-19 16:23:59 +00001283 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001284 setattr(sys, 'spam', 1)
1285 self.assertEqual(sys.spam, 1)
1286 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1287 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001288
Walter Dörwald919497e2003-01-19 16:23:59 +00001289
Alex Martellia70b1912003-04-22 08:12:33 +00001290 def test_sum(self):
1291 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001292 self.assertEqual(sum(list(range(2,8))), 27)
1293 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001294 self.assertEqual(sum(Squares(10)), 285)
1295 self.assertEqual(sum(iter(Squares(10))), 285)
1296 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1297
1298 self.assertRaises(TypeError, sum)
1299 self.assertRaises(TypeError, sum, 42)
1300 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1301 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001302 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1303 values = [bytearray(b'a'), bytearray(b'b')]
1304 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001305 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1306 self.assertRaises(TypeError, sum, [{2:3}])
1307 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1308
1309 class BadSeq:
1310 def __getitem__(self, index):
1311 raise ValueError
1312 self.assertRaises(ValueError, sum, BadSeq())
1313
Mark Dickinson3a22b472009-10-17 21:48:16 +00001314 empty = []
1315 sum(([x] for x in range(10)), empty)
1316 self.assertEqual(empty, [])
1317
Walter Dörwald919497e2003-01-19 16:23:59 +00001318 def test_type(self):
1319 self.assertEqual(type(''), type('123'))
1320 self.assertNotEqual(type(''), type(()))
1321
Guido van Rossumfee7b932005-01-16 00:21:28 +00001322 # We don't want self in vars(), so these are static methods
1323
1324 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001325 def get_vars_f0():
1326 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001327
Guido van Rossumfee7b932005-01-16 00:21:28 +00001328 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001329 def get_vars_f2():
1330 BuiltinTest.get_vars_f0()
1331 a = 1
1332 b = 2
1333 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001334
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001335 class C_get_vars(object):
1336 def getDict(self):
1337 return {'a':2}
1338 __dict__ = property(fget=getDict)
1339
Walter Dörwald919497e2003-01-19 16:23:59 +00001340 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001341 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001342 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001343 self.assertEqual(self.get_vars_f0(), {})
1344 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1345 self.assertRaises(TypeError, vars, 42, 42)
1346 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001347 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001348
1349 def test_zip(self):
1350 a = (1, 2, 3)
1351 b = (4, 5, 6)
1352 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001353 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001354 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001355 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001356 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001357 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001358 class I:
1359 def __getitem__(self, i):
1360 if i < 0 or i > 2: raise IndexError
1361 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001362 self.assertEqual(list(zip(a, I())), t)
1363 self.assertEqual(list(zip()), [])
1364 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001365 self.assertRaises(TypeError, zip, None)
1366 class G:
1367 pass
1368 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001369 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001370
1371 # Make sure zip doesn't try to allocate a billion elements for the
1372 # result list when one of its arguments doesn't say how long it is.
1373 # A MemoryError is the most likely failure mode.
1374 class SequenceWithoutALength:
1375 def __getitem__(self, i):
1376 if i == 5:
1377 raise IndexError
1378 else:
1379 return i
1380 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001381 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001382 list(enumerate(range(5)))
1383 )
1384
1385 class BadSeq:
1386 def __getitem__(self, i):
1387 if i == 5:
1388 raise ValueError
1389 else:
1390 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001391 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001392
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001393 def test_zip_pickle(self):
1394 a = (1, 2, 3)
1395 b = (4, 5, 6)
1396 t = [(1, 4), (2, 5), (3, 6)]
1397 z1 = zip(a, b)
1398 self.check_iter_pickle(z1, t)
1399
Eric Smithe4d63172010-09-13 20:48:43 +00001400 def test_format(self):
1401 # Test the basic machinery of the format() builtin. Don't test
1402 # the specifics of the various formatters
1403 self.assertEqual(format(3, ''), '3')
1404
1405 # Returns some classes to use for various tests. There's
1406 # an old-style version, and a new-style version
1407 def classes_new():
1408 class A(object):
1409 def __init__(self, x):
1410 self.x = x
1411 def __format__(self, format_spec):
1412 return str(self.x) + format_spec
1413 class DerivedFromA(A):
1414 pass
1415
1416 class Simple(object): pass
1417 class DerivedFromSimple(Simple):
1418 def __init__(self, x):
1419 self.x = x
1420 def __format__(self, format_spec):
1421 return str(self.x) + format_spec
1422 class DerivedFromSimple2(DerivedFromSimple): pass
1423 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1424
1425 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1426 self.assertEqual(format(A(3), 'spec'), '3spec')
1427 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1428 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1429 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1430 '10abcdef')
1431
1432 class_test(*classes_new())
1433
1434 def empty_format_spec(value):
1435 # test that:
1436 # format(x, '') == str(x)
1437 # format(x) == str(x)
1438 self.assertEqual(format(value, ""), str(value))
1439 self.assertEqual(format(value), str(value))
1440
1441 # for builtin types, format(x, "") == str(x)
1442 empty_format_spec(17**13)
1443 empty_format_spec(1.0)
1444 empty_format_spec(3.1415e104)
1445 empty_format_spec(-3.1415e104)
1446 empty_format_spec(3.1415e-104)
1447 empty_format_spec(-3.1415e-104)
1448 empty_format_spec(object)
1449 empty_format_spec(None)
1450
1451 # TypeError because self.__format__ returns the wrong type
1452 class BadFormatResult:
1453 def __format__(self, format_spec):
1454 return 1.0
1455 self.assertRaises(TypeError, format, BadFormatResult(), "")
1456
1457 # TypeError because format_spec is not unicode or str
1458 self.assertRaises(TypeError, format, object(), 4)
1459 self.assertRaises(TypeError, format, object(), object())
1460
1461 # tests for object.__format__ really belong elsewhere, but
1462 # there's no good place to put them
1463 x = object().__format__('')
1464 self.assertTrue(x.startswith('<object object at'))
1465
1466 # first argument to object.__format__ must be string
1467 self.assertRaises(TypeError, object().__format__, 3)
1468 self.assertRaises(TypeError, object().__format__, object())
1469 self.assertRaises(TypeError, object().__format__, None)
1470
1471 # --------------------------------------------------------------------
1472 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001473 # deprecated
Eric Smithe4d63172010-09-13 20:48:43 +00001474 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1475 with warnings.catch_warnings(record=True) as w:
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001476 warnings.simplefilter("always", DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001477 format(obj, fmt_str)
1478 if should_raise_warning:
1479 self.assertEqual(len(w), 1)
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001480 self.assertIsInstance(w[0].message, DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001481 self.assertIn('object.__format__ with a non-empty format '
1482 'string', str(w[0].message))
1483 else:
1484 self.assertEqual(len(w), 0)
1485
1486 fmt_strs = ['', 's']
1487
1488 class A:
1489 def __format__(self, fmt_str):
1490 return format('', fmt_str)
1491
1492 for fmt_str in fmt_strs:
1493 test_deprecated_format_string(A(), fmt_str, False)
1494
1495 class B:
1496 pass
1497
1498 class C(object):
1499 pass
1500
1501 for cls in [object, B, C]:
1502 for fmt_str in fmt_strs:
1503 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1504 # --------------------------------------------------------------------
1505
1506 # make sure we can take a subclass of str as a format spec
1507 class DerivedFromStr(str): pass
1508 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1509
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001510 def test_bin(self):
1511 self.assertEqual(bin(0), '0b0')
1512 self.assertEqual(bin(1), '0b1')
1513 self.assertEqual(bin(-1), '-0b1')
1514 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1515 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1516 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1517 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1518
Georg Brandl953152f2009-07-22 12:03:59 +00001519 def test_bytearray_translate(self):
1520 x = bytearray(b"abc")
1521 self.assertRaises(ValueError, x.translate, b"1", 1)
1522 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1523
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001524 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001525 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001526 tp = type(const)
1527 self.assertIs(tp(), const)
1528 self.assertRaises(TypeError, tp, 1, 2)
1529 self.assertRaises(TypeError, tp, a=1, b=2)
1530
Raymond Hettinger64958a12003-12-17 20:43:33 +00001531class TestSorted(unittest.TestCase):
1532
1533 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001534 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001535 copy = data[:]
1536 random.shuffle(copy)
1537 self.assertEqual(data, sorted(copy))
1538 self.assertNotEqual(data, copy)
1539
1540 data.reverse()
1541 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001542 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1543 self.assertNotEqual(data, copy)
1544 random.shuffle(copy)
1545 self.assertEqual(data, sorted(copy, reverse=1))
1546 self.assertNotEqual(data, copy)
1547
1548 def test_inputtypes(self):
1549 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001550 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001551 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001552 self.assertEqual(sorted(s), sorted(T(s)))
1553
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001554 s = ''.join(set(s)) # unique letters only
1555 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001556 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001557 self.assertEqual(sorted(s), sorted(T(s)))
1558
1559 def test_baddecorator(self):
1560 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1561 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1562
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001563def test_main(verbose=None):
1564 test_classes = (BuiltinTest, TestSorted)
1565
1566 run_unittest(*test_classes)
1567
1568 # verify reference counting
1569 if verbose and hasattr(sys, "gettotalrefcount"):
1570 import gc
1571 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001572 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001573 run_unittest(*test_classes)
1574 gc.collect()
1575 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001576 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001577
Walter Dörwald919497e2003-01-19 16:23:59 +00001578
1579if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001580 test_main(verbose=True)