blob: 036f4f2b39754ede55fbf8566a49a9a44c6e185b [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
Benjamin Peterson92722792012-12-15 12:51:05 -0500465 class X:
466 def __getitem__(self, key):
467 raise ValueError
468 self.assertRaises(ValueError, eval, "foo", {}, X())
469
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000470 def test_general_eval(self):
471 # Tests that general mappings can be used for the locals argument
472
473 class M:
474 "Test mapping interface versus possible calls from eval()."
475 def __getitem__(self, key):
476 if key == 'a':
477 return 12
478 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000479 def keys(self):
480 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000481
482 m = M()
483 g = globals()
484 self.assertEqual(eval('a', g, m), 12)
485 self.assertRaises(NameError, eval, 'b', g, m)
486 self.assertEqual(eval('dir()', g, m), list('xyz'))
487 self.assertEqual(eval('globals()', g, m), g)
488 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000489 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000490 class A:
491 "Non-mapping"
492 pass
493 m = A()
494 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000495
496 # Verify that dict subclasses work as well
497 class D(dict):
498 def __getitem__(self, key):
499 if key == 'a':
500 return 12
501 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000502 def keys(self):
503 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000504
505 d = D()
506 self.assertEqual(eval('a', g, d), 12)
507 self.assertRaises(NameError, eval, 'b', g, d)
508 self.assertEqual(eval('dir()', g, d), list('xyz'))
509 self.assertEqual(eval('globals()', g, d), g)
510 self.assertEqual(eval('locals()', g, d), d)
511
512 # Verify locals stores (used by list comps)
513 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000514 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000515
516 class SpreadSheet:
517 "Sample application showing nested, calculated lookups."
518 _cells = {}
519 def __setitem__(self, key, formula):
520 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000521 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000522 return eval(self._cells[key], globals(), self)
523
524 ss = SpreadSheet()
525 ss['a1'] = '5'
526 ss['a2'] = 'a1*6'
527 ss['a3'] = 'a2*7'
528 self.assertEqual(ss['a3'], 210)
529
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000530 # Verify that dir() catches a non-list returned by eval
531 # SF bug #1004669
532 class C:
533 def __getitem__(self, item):
534 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000535 def keys(self):
536 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000537 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
538
Georg Brandl7cae87c2006-09-06 06:51:57 +0000539 def test_exec(self):
540 g = {}
541 exec('z = 1', g)
542 if '__builtins__' in g:
543 del g['__builtins__']
544 self.assertEqual(g, {'z': 1})
545
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000546 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000547 if '__builtins__' in g:
548 del g['__builtins__']
549 self.assertEqual(g, {'z': 2})
550 g = {}
551 l = {}
552
Brett Cannon77628992010-03-20 20:59:33 +0000553 with check_warnings():
554 warnings.filterwarnings("ignore", "global statement",
555 module="<string>")
556 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000557 if '__builtins__' in g:
558 del g['__builtins__']
559 if '__builtins__' in l:
560 del l['__builtins__']
561 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
562
Victor Stinnerb0b22422012-04-19 00:57:45 +0200563 def test_exec_globals(self):
564 code = compile("print('Hello World!')", "", "exec")
565 # no builtin function
566 self.assertRaisesRegex(NameError, "name 'print' is not defined",
567 exec, code, {'__builtins__': {}})
568 # __builtins__ must be a mapping type
569 self.assertRaises(TypeError,
570 exec, code, {'__builtins__': 123})
571
572 # no __build_class__ function
573 code = compile("class A: pass", "", "exec")
574 self.assertRaisesRegex(NameError, "__build_class__ not found",
575 exec, code, {'__builtins__': {}})
576
577 class frozendict_error(Exception):
578 pass
579
580 class frozendict(dict):
581 def __setitem__(self, key, value):
582 raise frozendict_error("frozendict is readonly")
583
584 # read-only builtins
585 frozen_builtins = frozendict(__builtins__)
586 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
587 self.assertRaises(frozendict_error,
588 exec, code, {'__builtins__': frozen_builtins})
589
590 # read-only globals
591 namespace = frozendict({})
592 code = compile("x=1", "test", "exec")
593 self.assertRaises(frozendict_error,
594 exec, code, namespace)
595
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000596 def test_exec_redirected(self):
597 savestdout = sys.stdout
598 sys.stdout = None # Whatever that cannot flush()
599 try:
600 # Used to raise SystemError('error return without exception set')
601 exec('a')
602 except NameError:
603 pass
604 finally:
605 sys.stdout = savestdout
606
Walter Dörwald919497e2003-01-19 16:23:59 +0000607 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000608 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
609 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
610 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
611 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
612 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000613 def identity(item):
614 return 1
615 filter(identity, Squares(5))
616 self.assertRaises(TypeError, filter)
617 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000618 def __getitem__(self, index):
619 if index<4:
620 return 42
621 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000622 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000623 def badfunc():
624 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000625 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000626
Walter Dörwaldbf517072003-01-27 15:57:14 +0000627 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000628 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
629 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
630 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000631
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000632 def test_filter_pickle(self):
633 f1 = filter(filter_char, "abcdeabcde")
634 f2 = filter(filter_char, "abcdeabcde")
635 self.check_iter_pickle(f1, list(f2))
636
Walter Dörwald919497e2003-01-19 16:23:59 +0000637 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000638 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000639 self.assertRaises(TypeError, getattr, sys, 1)
640 self.assertRaises(TypeError, getattr, sys, 1, "foo")
641 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000642 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000643 # unicode surrogates are not encodable to the default encoding (utf8)
644 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000645
646 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000647 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000648 self.assertRaises(TypeError, hasattr, sys, 1)
649 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000650 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000651
Benjamin Peterson17689992010-08-24 03:26:23 +0000652 # Check that hasattr propagates all exceptions outside of
653 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000654 class A:
655 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000656 raise SystemExit
657 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000658 class B:
659 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000660 raise ValueError
661 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000662
Walter Dörwald919497e2003-01-19 16:23:59 +0000663 def test_hash(self):
664 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000665 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000666 self.assertEqual(hash(1), hash(1.0))
667 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000668 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000669 hash((0,1,2,3))
670 def f(): pass
671 self.assertRaises(TypeError, hash, [])
672 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673 # Bug 1536021: Allow hash to return long objects
674 class X:
675 def __hash__(self):
676 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000677 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000678 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679 def __hash__(self):
680 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000681 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000682
683 def test_hex(self):
684 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000685 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000686 self.assertRaises(TypeError, hex, {})
687
688 def test_id(self):
689 id(None)
690 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000691 id(1.0)
692 id('spam')
693 id((0,1,2,3))
694 id([0,1,2,3])
695 id({'spam': 1, 'eggs': 2, 'ham': 3})
696
Guido van Rossuma88a0332007-02-26 16:59:55 +0000697 # Test input() later, alphabetized as if it were raw_input
698
Walter Dörwald919497e2003-01-19 16:23:59 +0000699 def test_iter(self):
700 self.assertRaises(TypeError, iter)
701 self.assertRaises(TypeError, iter, 42, 42)
702 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 for l in lists:
704 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000705 self.assertEqual(next(i), '1')
706 self.assertEqual(next(i), '2')
707 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000708
709 def test_isinstance(self):
710 class C:
711 pass
712 class D(C):
713 pass
714 class E:
715 pass
716 c = C()
717 d = D()
718 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000719 self.assertTrue(isinstance(c, C))
720 self.assertTrue(isinstance(d, C))
721 self.assertTrue(not isinstance(e, C))
722 self.assertTrue(not isinstance(c, D))
723 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000724 self.assertRaises(TypeError, isinstance, E, 'foo')
725 self.assertRaises(TypeError, isinstance)
726
727 def test_issubclass(self):
728 class C:
729 pass
730 class D(C):
731 pass
732 class E:
733 pass
734 c = C()
735 d = D()
736 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000737 self.assertTrue(issubclass(D, C))
738 self.assertTrue(issubclass(C, C))
739 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000740 self.assertRaises(TypeError, issubclass, 'foo', E)
741 self.assertRaises(TypeError, issubclass, E, 'foo')
742 self.assertRaises(TypeError, issubclass)
743
744 def test_len(self):
745 self.assertEqual(len('123'), 3)
746 self.assertEqual(len(()), 0)
747 self.assertEqual(len((1, 2, 3, 4)), 4)
748 self.assertEqual(len([1, 2, 3, 4]), 4)
749 self.assertEqual(len({}), 0)
750 self.assertEqual(len({'a':1, 'b': 2}), 2)
751 class BadSeq:
752 def __len__(self):
753 raise ValueError
754 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000755 class InvalidLen:
756 def __len__(self):
757 return None
758 self.assertRaises(TypeError, len, InvalidLen())
759 class FloatLen:
760 def __len__(self):
761 return 4.5
762 self.assertRaises(TypeError, len, FloatLen())
763 class HugeLen:
764 def __len__(self):
765 return sys.maxsize + 1
766 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000767 class NoLenMethod(object): pass
768 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000769
Walter Dörwald919497e2003-01-19 16:23:59 +0000770 def test_map(self):
771 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000772 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000773 [1, 4, 9]
774 )
775 try:
776 from math import sqrt
777 except ImportError:
778 def sqrt(x):
779 return pow(x, 0.5)
780 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000781 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 [[4.0, 2.0], [9.0, 3.0]]
783 )
784 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000785 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000786 [10, 4, 6]
787 )
788
789 def plus(*v):
790 accu = 0
791 for i in v: accu = accu + i
792 return accu
793 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000794 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000795 [1, 3, 7]
796 )
797 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000798 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 [1+4, 3+9, 7+2]
800 )
801 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000802 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000803 [1+4+1, 3+9+1, 7+2+0]
804 )
805 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000806 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000807 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
808 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000809 def Max(a, b):
810 if a is None:
811 return b
812 if b is None:
813 return a
814 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000816 list(map(Max, Squares(3), Squares(2))),
817 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000818 )
819 self.assertRaises(TypeError, map)
820 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000822 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000823 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000824 yield None
825 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000826 def badfunc(x):
827 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000828 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000829
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000830 def test_map_pickle(self):
831 m1 = map(map_char, "Is this the real life?")
832 m2 = map(map_char, "Is this the real life?")
833 self.check_iter_pickle(m1, list(m2))
834
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 def test_max(self):
836 self.assertEqual(max('123123'), '3')
837 self.assertEqual(max(1, 2, 3), 3)
838 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
839 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
840
Guido van Rossume2a383d2007-01-15 16:59:06 +0000841 self.assertEqual(max(1, 2, 3.0), 3.0)
842 self.assertEqual(max(1, 2.0, 3), 3)
843 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000844
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000845 for stmt in (
846 "max(key=int)", # no args
847 "max(1, key=int)", # single arg not iterable
848 "max(1, 2, keystone=int)", # wrong keyword
849 "max(1, 2, key=int, abc=int)", # two many keywords
850 "max(1, 2, key=1)", # keyfunc is not callable
851 ):
Tim Peters7f061872004-12-07 21:17:46 +0000852 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000853 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000854 except TypeError:
855 pass
856 else:
857 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000858
859 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
860 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
861 self.assertEqual(max(1, 2, key=neg), 1) # two elems
862
863 data = [random.randrange(200) for i in range(100)]
864 keys = dict((elem, random.randrange(50)) for elem in data)
865 f = keys.__getitem__
866 self.assertEqual(max(data, key=f),
867 sorted(reversed(data), key=f)[-1])
868
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 def test_min(self):
870 self.assertEqual(min('123123'), '1')
871 self.assertEqual(min(1, 2, 3), 1)
872 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
873 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
874
Guido van Rossume2a383d2007-01-15 16:59:06 +0000875 self.assertEqual(min(1, 2, 3.0), 1)
876 self.assertEqual(min(1, 2.0, 3), 1)
877 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000878
879 self.assertRaises(TypeError, min)
880 self.assertRaises(TypeError, min, 42)
881 self.assertRaises(ValueError, min, ())
882 class BadSeq:
883 def __getitem__(self, index):
884 raise ValueError
885 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000886
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000887 for stmt in (
888 "min(key=int)", # no args
889 "min(1, key=int)", # single arg not iterable
890 "min(1, 2, keystone=int)", # wrong keyword
891 "min(1, 2, key=int, abc=int)", # two many keywords
892 "min(1, 2, key=1)", # keyfunc is not callable
893 ):
Tim Peters7f061872004-12-07 21:17:46 +0000894 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000895 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000896 except TypeError:
897 pass
898 else:
899 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000900
901 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
902 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
903 self.assertEqual(min(1, 2, key=neg), 2) # two elems
904
905 data = [random.randrange(200) for i in range(100)]
906 keys = dict((elem, random.randrange(50)) for elem in data)
907 f = keys.__getitem__
908 self.assertEqual(min(data, key=f),
909 sorted(data, key=f)[0])
910
Georg Brandla18af4e2007-04-21 15:47:16 +0000911 def test_next(self):
912 it = iter(range(2))
913 self.assertEqual(next(it), 0)
914 self.assertEqual(next(it), 1)
915 self.assertRaises(StopIteration, next, it)
916 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000917 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000918
919 class Iter(object):
920 def __iter__(self):
921 return self
922 def __next__(self):
923 raise StopIteration
924
925 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000926 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000927 self.assertRaises(StopIteration, next, it)
928
929 def gen():
930 yield 1
931 return
932
933 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000934 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000935 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000936 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000937
Walter Dörwald919497e2003-01-19 16:23:59 +0000938 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000939 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000940 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000941 self.assertRaises(TypeError, oct, ())
942
943 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000944 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000945 fp = open(TESTFN, 'w')
946 try:
947 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000948 fp.write('The quick brown fox jumps over the lazy dog')
949 fp.write('.\n')
950 fp.write('Dear John\n')
951 fp.write('XXX'*100)
952 fp.write('YYY'*100)
953 finally:
954 fp.close()
955
956 def test_open(self):
957 self.write_testfile()
958 fp = open(TESTFN, 'r')
959 try:
960 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000961 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
962 self.assertEqual(fp.readline(4), 'Dear')
963 self.assertEqual(fp.readline(100), ' John\n')
964 self.assertEqual(fp.read(300), 'XXX'*100)
965 self.assertEqual(fp.read(1000), 'YYY'*100)
966 finally:
967 fp.close()
Florent Xicluna3f4ce632012-07-08 12:08:45 +0200968 unlink(TESTFN)
Walter Dörwald919497e2003-01-19 16:23:59 +0000969
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200970 def test_open_default_encoding(self):
971 old_environ = dict(os.environ)
972 try:
973 # try to get a user preferred encoding different than the current
974 # locale encoding to check that open() uses the current locale
975 # encoding and not the user preferred encoding
976 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
977 if key in os.environ:
978 del os.environ[key]
979
980 self.write_testfile()
981 current_locale_encoding = locale.getpreferredencoding(False)
982 fp = open(TESTFN, 'w')
983 try:
984 self.assertEqual(fp.encoding, current_locale_encoding)
985 finally:
986 fp.close()
Florent Xicluna3f4ce632012-07-08 12:08:45 +0200987 unlink(TESTFN)
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200988 finally:
989 os.environ.clear()
990 os.environ.update(old_environ)
991
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 def test_ord(self):
993 self.assertEqual(ord(' '), 32)
994 self.assertEqual(ord('A'), 65)
995 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000996 self.assertEqual(ord('\x80'), 128)
997 self.assertEqual(ord('\xff'), 255)
998
999 self.assertEqual(ord(b' '), 32)
1000 self.assertEqual(ord(b'A'), 65)
1001 self.assertEqual(ord(b'a'), 97)
1002 self.assertEqual(ord(b'\x80'), 128)
1003 self.assertEqual(ord(b'\xff'), 255)
1004
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001005 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001006 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001007
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001008 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1009 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1010 self.assertEqual(ord("\U00010000"), 0x00010000)
1011 self.assertEqual(ord("\U00010001"), 0x00010001)
1012 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1013 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1014 self.assertEqual(ord("\U00100000"), 0x00100000)
1015 self.assertEqual(ord("\U00100001"), 0x00100001)
1016 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1017 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1018
Walter Dörwald919497e2003-01-19 16:23:59 +00001019 def test_pow(self):
1020 self.assertEqual(pow(0,0), 1)
1021 self.assertEqual(pow(0,1), 0)
1022 self.assertEqual(pow(1,0), 1)
1023 self.assertEqual(pow(1,1), 1)
1024
1025 self.assertEqual(pow(2,0), 1)
1026 self.assertEqual(pow(2,10), 1024)
1027 self.assertEqual(pow(2,20), 1024*1024)
1028 self.assertEqual(pow(2,30), 1024*1024*1024)
1029
1030 self.assertEqual(pow(-2,0), 1)
1031 self.assertEqual(pow(-2,1), -2)
1032 self.assertEqual(pow(-2,2), 4)
1033 self.assertEqual(pow(-2,3), -8)
1034
Walter Dörwald919497e2003-01-19 16:23:59 +00001035 self.assertAlmostEqual(pow(0.,0), 1.)
1036 self.assertAlmostEqual(pow(0.,1), 0.)
1037 self.assertAlmostEqual(pow(1.,0), 1.)
1038 self.assertAlmostEqual(pow(1.,1), 1.)
1039
1040 self.assertAlmostEqual(pow(2.,0), 1.)
1041 self.assertAlmostEqual(pow(2.,10), 1024.)
1042 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1043 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1044
1045 self.assertAlmostEqual(pow(-2.,0), 1.)
1046 self.assertAlmostEqual(pow(-2.,1), -2.)
1047 self.assertAlmostEqual(pow(-2.,2), 4.)
1048 self.assertAlmostEqual(pow(-2.,3), -8.)
1049
Mark Dickinson5c2db372009-12-05 20:28:34 +00001050 for x in 2, 2.0:
1051 for y in 10, 10.0:
1052 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001053 if isinstance(x, float) or \
1054 isinstance(y, float) or \
1055 isinstance(z, float):
1056 self.assertRaises(TypeError, pow, x, y, z)
1057 else:
1058 self.assertAlmostEqual(pow(x, y, z), 24.0)
1059
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001060 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1061 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 self.assertRaises(TypeError, pow, -1, -2, 3)
1064 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001065
1066 self.assertRaises(TypeError, pow)
1067
Guido van Rossuma88a0332007-02-26 16:59:55 +00001068 def test_input(self):
1069 self.write_testfile()
1070 fp = open(TESTFN, 'r')
1071 savestdin = sys.stdin
1072 savestdout = sys.stdout # Eats the echo
1073 try:
1074 sys.stdin = fp
1075 sys.stdout = BitBucket()
1076 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001077 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1078 self.assertEqual(input('testing\n'), 'Dear John')
1079
1080 # SF 1535165: don't segfault on closed stdin
1081 # sys.stdout must be a regular file for triggering
1082 sys.stdout = savestdout
1083 sys.stdin.close()
1084 self.assertRaises(ValueError, input)
1085
1086 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001087 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001088 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001089 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001090 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001091 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001092 self.assertRaises(EOFError, input)
1093
1094 del sys.stdout
1095 self.assertRaises(RuntimeError, input, 'prompt')
1096 del sys.stdin
1097 self.assertRaises(RuntimeError, input, 'prompt')
1098 finally:
1099 sys.stdin = savestdin
1100 sys.stdout = savestdout
1101 fp.close()
1102 unlink(TESTFN)
1103
Antoine Pitrou772add72011-11-06 02:37:42 +01001104 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001105 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001106 if not sys.stdin.isatty() or not sys.stdout.isatty():
1107 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001108 r, w = os.pipe()
1109 try:
1110 pid, fd = pty.fork()
1111 except (OSError, AttributeError) as e:
1112 os.close(r)
1113 os.close(w)
1114 self.skipTest("pty.fork() raised {}".format(e))
1115 if pid == 0:
1116 # Child
Antoine Pitrou772add72011-11-06 02:37:42 +01001117 try:
1118 # Make sure we don't get stuck if there's a problem
1119 signal.alarm(2)
1120 os.close(r)
1121 # Check the error handlers are accounted for
1122 if stdio_encoding:
1123 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1124 encoding=stdio_encoding,
1125 errors='surrogateescape')
1126 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1127 encoding=stdio_encoding,
1128 errors='replace')
1129 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001130 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1131 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou772add72011-11-06 02:37:42 +01001132 except:
1133 traceback.print_exc()
1134 finally:
1135 # We don't want to return to unittest...
1136 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001137 # Parent
1138 os.close(w)
1139 os.write(fd, terminal_input + b"\r\n")
1140 # Get results from the pipe
1141 with open(r, "r") as rpipe:
1142 lines = []
1143 while True:
1144 line = rpipe.readline().strip()
Antoine Pitrou772add72011-11-06 02:37:42 +01001145 if line == "":
1146 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001147 break
1148 lines.append(line)
Antoine Pitrou772add72011-11-06 02:37:42 +01001149 # Check the result was got and corresponds to the user's terminal input
1150 if len(lines) != 2:
1151 # Something went wrong, try to get at stderr
1152 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1153 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1154 % (len(lines), child_output.read()))
1155 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001156 # Check we did exercise the GNU readline path
1157 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1158 if lines[0] != 'tty = True':
1159 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001160 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1161 if stdio_encoding:
1162 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1163 else:
1164 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1165 self.assertEqual(input_result, expected)
1166
1167 def test_input_tty(self):
1168 # Test input() functionality when wired to a tty (the code path
1169 # is different and invokes GNU readline if available).
1170 self.check_input_tty("prompt", b"quux")
1171
1172 def test_input_tty_non_ascii(self):
1173 # Check stdin/stdout encoding is used when invoking GNU readline
1174 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1175
1176 def test_input_tty_non_ascii_unicode_errors(self):
1177 # Check stdin/stdout error handler is used when invoking GNU readline
1178 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1179
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001180 # test_int(): see test_int.py for tests of built-in function int().
1181
Walter Dörwald919497e2003-01-19 16:23:59 +00001182 def test_repr(self):
1183 self.assertEqual(repr(''), '\'\'')
1184 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001185 self.assertEqual(repr(()), '()')
1186 self.assertEqual(repr([]), '[]')
1187 self.assertEqual(repr({}), '{}')
1188 a = []
1189 a.append(a)
1190 self.assertEqual(repr(a), '[[...]]')
1191 a = {}
1192 a[0] = a
1193 self.assertEqual(repr(a), '{0: {...}}')
1194
1195 def test_round(self):
1196 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001197 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001198 self.assertEqual(round(1.0), 1.0)
1199 self.assertEqual(round(10.0), 10.0)
1200 self.assertEqual(round(1000000000.0), 1000000000.0)
1201 self.assertEqual(round(1e20), 1e20)
1202
1203 self.assertEqual(round(-1.0), -1.0)
1204 self.assertEqual(round(-10.0), -10.0)
1205 self.assertEqual(round(-1000000000.0), -1000000000.0)
1206 self.assertEqual(round(-1e20), -1e20)
1207
1208 self.assertEqual(round(0.1), 0.0)
1209 self.assertEqual(round(1.1), 1.0)
1210 self.assertEqual(round(10.1), 10.0)
1211 self.assertEqual(round(1000000000.1), 1000000000.0)
1212
1213 self.assertEqual(round(-1.1), -1.0)
1214 self.assertEqual(round(-10.1), -10.0)
1215 self.assertEqual(round(-1000000000.1), -1000000000.0)
1216
1217 self.assertEqual(round(0.9), 1.0)
1218 self.assertEqual(round(9.9), 10.0)
1219 self.assertEqual(round(999999999.9), 1000000000.0)
1220
1221 self.assertEqual(round(-0.9), -1.0)
1222 self.assertEqual(round(-9.9), -10.0)
1223 self.assertEqual(round(-999999999.9), -1000000000.0)
1224
1225 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001226 self.assertEqual(type(round(-8.0, -1)), float)
1227
1228 self.assertEqual(type(round(-8.0, 0)), float)
1229 self.assertEqual(type(round(-8.0, 1)), float)
1230
1231 # Check even / odd rounding behaviour
1232 self.assertEqual(round(5.5), 6)
1233 self.assertEqual(round(6.5), 6)
1234 self.assertEqual(round(-5.5), -6)
1235 self.assertEqual(round(-6.5), -6)
1236
1237 # Check behavior on ints
1238 self.assertEqual(round(0), 0)
1239 self.assertEqual(round(8), 8)
1240 self.assertEqual(round(-8), -8)
1241 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001242 self.assertEqual(type(round(-8, -1)), int)
1243 self.assertEqual(type(round(-8, 0)), int)
1244 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001245
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001246 # test new kwargs
1247 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1248
Walter Dörwald919497e2003-01-19 16:23:59 +00001249 self.assertRaises(TypeError, round)
1250
Alex Martelliae211f92007-08-22 23:21:33 +00001251 # test generic rounding delegation for reals
1252 class TestRound:
1253 def __round__(self):
1254 return 23
1255
1256 class TestNoRound:
1257 pass
1258
1259 self.assertEqual(round(TestRound()), 23)
1260
1261 self.assertRaises(TypeError, round, 1, 2, 3)
1262 self.assertRaises(TypeError, round, TestNoRound())
1263
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001264 t = TestNoRound()
1265 t.__round__ = lambda *args: args
1266 self.assertRaises(TypeError, round, t)
1267 self.assertRaises(TypeError, round, t, 0)
1268
Mark Dickinsonad731b92009-11-09 17:12:30 +00001269 # Some versions of glibc for alpha have a bug that affects
1270 # float -> integer rounding (floor, ceil, rint, round) for
1271 # values in the range [2**52, 2**53). See:
1272 #
1273 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1274 #
1275 # We skip this test on Linux/alpha if it would fail.
1276 linux_alpha = (platform.system().startswith('Linux') and
1277 platform.machine().startswith('alpha'))
1278 system_round_bug = round(5e15+1) != 5e15+1
1279 @unittest.skipIf(linux_alpha and system_round_bug,
1280 "test will fail; failure is probably due to a "
1281 "buggy system round function")
1282 def test_round_large(self):
1283 # Issue #1869: integral floats should remain unchanged
1284 self.assertEqual(round(5e15-1), 5e15-1)
1285 self.assertEqual(round(5e15), 5e15)
1286 self.assertEqual(round(5e15+1), 5e15+1)
1287 self.assertEqual(round(5e15+2), 5e15+2)
1288 self.assertEqual(round(5e15+3), 5e15+3)
1289
Walter Dörwald919497e2003-01-19 16:23:59 +00001290 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001291 setattr(sys, 'spam', 1)
1292 self.assertEqual(sys.spam, 1)
1293 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1294 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001295
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001296 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001297
Alex Martellia70b1912003-04-22 08:12:33 +00001298 def test_sum(self):
1299 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001300 self.assertEqual(sum(list(range(2,8))), 27)
1301 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001302 self.assertEqual(sum(Squares(10)), 285)
1303 self.assertEqual(sum(iter(Squares(10))), 285)
1304 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1305
1306 self.assertRaises(TypeError, sum)
1307 self.assertRaises(TypeError, sum, 42)
1308 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1309 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001310 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1311 values = [bytearray(b'a'), bytearray(b'b')]
1312 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001313 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1314 self.assertRaises(TypeError, sum, [{2:3}])
1315 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1316
1317 class BadSeq:
1318 def __getitem__(self, index):
1319 raise ValueError
1320 self.assertRaises(ValueError, sum, BadSeq())
1321
Mark Dickinson3a22b472009-10-17 21:48:16 +00001322 empty = []
1323 sum(([x] for x in range(10)), empty)
1324 self.assertEqual(empty, [])
1325
Walter Dörwald919497e2003-01-19 16:23:59 +00001326 def test_type(self):
1327 self.assertEqual(type(''), type('123'))
1328 self.assertNotEqual(type(''), type(()))
1329
Guido van Rossumfee7b932005-01-16 00:21:28 +00001330 # We don't want self in vars(), so these are static methods
1331
1332 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001333 def get_vars_f0():
1334 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001335
Guido van Rossumfee7b932005-01-16 00:21:28 +00001336 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001337 def get_vars_f2():
1338 BuiltinTest.get_vars_f0()
1339 a = 1
1340 b = 2
1341 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001342
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001343 class C_get_vars(object):
1344 def getDict(self):
1345 return {'a':2}
1346 __dict__ = property(fget=getDict)
1347
Walter Dörwald919497e2003-01-19 16:23:59 +00001348 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001349 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001350 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 self.assertEqual(self.get_vars_f0(), {})
1352 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1353 self.assertRaises(TypeError, vars, 42, 42)
1354 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001355 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001356
1357 def test_zip(self):
1358 a = (1, 2, 3)
1359 b = (4, 5, 6)
1360 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001361 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001362 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001363 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001364 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001365 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001366 class I:
1367 def __getitem__(self, i):
1368 if i < 0 or i > 2: raise IndexError
1369 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001370 self.assertEqual(list(zip(a, I())), t)
1371 self.assertEqual(list(zip()), [])
1372 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001373 self.assertRaises(TypeError, zip, None)
1374 class G:
1375 pass
1376 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001377 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001378
1379 # Make sure zip doesn't try to allocate a billion elements for the
1380 # result list when one of its arguments doesn't say how long it is.
1381 # A MemoryError is the most likely failure mode.
1382 class SequenceWithoutALength:
1383 def __getitem__(self, i):
1384 if i == 5:
1385 raise IndexError
1386 else:
1387 return i
1388 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001389 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001390 list(enumerate(range(5)))
1391 )
1392
1393 class BadSeq:
1394 def __getitem__(self, i):
1395 if i == 5:
1396 raise ValueError
1397 else:
1398 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001399 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001400
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001401 def test_zip_pickle(self):
1402 a = (1, 2, 3)
1403 b = (4, 5, 6)
1404 t = [(1, 4), (2, 5), (3, 6)]
1405 z1 = zip(a, b)
1406 self.check_iter_pickle(z1, t)
1407
Eric Smithe4d63172010-09-13 20:48:43 +00001408 def test_format(self):
1409 # Test the basic machinery of the format() builtin. Don't test
1410 # the specifics of the various formatters
1411 self.assertEqual(format(3, ''), '3')
1412
1413 # Returns some classes to use for various tests. There's
1414 # an old-style version, and a new-style version
1415 def classes_new():
1416 class A(object):
1417 def __init__(self, x):
1418 self.x = x
1419 def __format__(self, format_spec):
1420 return str(self.x) + format_spec
1421 class DerivedFromA(A):
1422 pass
1423
1424 class Simple(object): pass
1425 class DerivedFromSimple(Simple):
1426 def __init__(self, x):
1427 self.x = x
1428 def __format__(self, format_spec):
1429 return str(self.x) + format_spec
1430 class DerivedFromSimple2(DerivedFromSimple): pass
1431 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1432
1433 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1434 self.assertEqual(format(A(3), 'spec'), '3spec')
1435 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1436 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1437 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1438 '10abcdef')
1439
1440 class_test(*classes_new())
1441
1442 def empty_format_spec(value):
1443 # test that:
1444 # format(x, '') == str(x)
1445 # format(x) == str(x)
1446 self.assertEqual(format(value, ""), str(value))
1447 self.assertEqual(format(value), str(value))
1448
1449 # for builtin types, format(x, "") == str(x)
1450 empty_format_spec(17**13)
1451 empty_format_spec(1.0)
1452 empty_format_spec(3.1415e104)
1453 empty_format_spec(-3.1415e104)
1454 empty_format_spec(3.1415e-104)
1455 empty_format_spec(-3.1415e-104)
1456 empty_format_spec(object)
1457 empty_format_spec(None)
1458
1459 # TypeError because self.__format__ returns the wrong type
1460 class BadFormatResult:
1461 def __format__(self, format_spec):
1462 return 1.0
1463 self.assertRaises(TypeError, format, BadFormatResult(), "")
1464
1465 # TypeError because format_spec is not unicode or str
1466 self.assertRaises(TypeError, format, object(), 4)
1467 self.assertRaises(TypeError, format, object(), object())
1468
1469 # tests for object.__format__ really belong elsewhere, but
1470 # there's no good place to put them
1471 x = object().__format__('')
1472 self.assertTrue(x.startswith('<object object at'))
1473
1474 # first argument to object.__format__ must be string
1475 self.assertRaises(TypeError, object().__format__, 3)
1476 self.assertRaises(TypeError, object().__format__, object())
1477 self.assertRaises(TypeError, object().__format__, None)
1478
1479 # --------------------------------------------------------------------
1480 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001481 # deprecated
Andrew Svetlov2cd8ce42012-12-23 14:27:17 +02001482 def test_deprecated_format_string(obj, fmt_str, should_raise):
1483 if should_raise:
1484 self.assertRaises(TypeError, format, obj, fmt_str)
Eric Smithe4d63172010-09-13 20:48:43 +00001485 else:
Andrew Svetlov2cd8ce42012-12-23 14:27:17 +02001486 format(obj, fmt_str)
Eric Smithe4d63172010-09-13 20:48:43 +00001487
1488 fmt_strs = ['', 's']
1489
1490 class A:
1491 def __format__(self, fmt_str):
1492 return format('', fmt_str)
1493
1494 for fmt_str in fmt_strs:
1495 test_deprecated_format_string(A(), fmt_str, False)
1496
1497 class B:
1498 pass
1499
1500 class C(object):
1501 pass
1502
1503 for cls in [object, B, C]:
1504 for fmt_str in fmt_strs:
1505 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1506 # --------------------------------------------------------------------
1507
1508 # make sure we can take a subclass of str as a format spec
1509 class DerivedFromStr(str): pass
1510 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1511
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001512 def test_bin(self):
1513 self.assertEqual(bin(0), '0b0')
1514 self.assertEqual(bin(1), '0b1')
1515 self.assertEqual(bin(-1), '-0b1')
1516 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1517 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1518 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1519 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1520
Georg Brandl953152f2009-07-22 12:03:59 +00001521 def test_bytearray_translate(self):
1522 x = bytearray(b"abc")
1523 self.assertRaises(ValueError, x.translate, b"1", 1)
1524 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1525
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001526 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001527 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001528 tp = type(const)
1529 self.assertIs(tp(), const)
1530 self.assertRaises(TypeError, tp, 1, 2)
1531 self.assertRaises(TypeError, tp, a=1, b=2)
1532
Raymond Hettinger64958a12003-12-17 20:43:33 +00001533class TestSorted(unittest.TestCase):
1534
1535 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001536 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001537 copy = data[:]
1538 random.shuffle(copy)
1539 self.assertEqual(data, sorted(copy))
1540 self.assertNotEqual(data, copy)
1541
1542 data.reverse()
1543 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001544 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1545 self.assertNotEqual(data, copy)
1546 random.shuffle(copy)
1547 self.assertEqual(data, sorted(copy, reverse=1))
1548 self.assertNotEqual(data, copy)
1549
1550 def test_inputtypes(self):
1551 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001552 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001553 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001554 self.assertEqual(sorted(s), sorted(T(s)))
1555
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001556 s = ''.join(set(s)) # unique letters only
1557 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001558 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001559 self.assertEqual(sorted(s), sorted(T(s)))
1560
1561 def test_baddecorator(self):
1562 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1563 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1564
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001565def test_main(verbose=None):
1566 test_classes = (BuiltinTest, TestSorted)
1567
1568 run_unittest(*test_classes)
1569
1570 # verify reference counting
1571 if verbose and hasattr(sys, "gettotalrefcount"):
1572 import gc
1573 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001574 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001575 run_unittest(*test_classes)
1576 gc.collect()
1577 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001578 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001579
Walter Dörwald919497e2003-01-19 16:23:59 +00001580
1581if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001582 test_main(verbose=True)