blob: dfe64bf09c335b6dabc9ad5c8dcd89df8b1f4568 [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
Mark Dickinsonad731b92009-11-09 17:12:30 +00003import platform
Georg Brandl1b37e872010-03-14 10:45:50 +00004import unittest
Benjamin Peterson076e0312010-08-23 21:58:59 +00005import sys
6import warnings
7import collections
8import io
Antoine Pitrou0d776b12011-11-06 00:34:26 +01009import os
Georg Brandl8334fd92010-12-04 10:26:46 +000010import ast
Benjamin Peterson076e0312010-08-23 21:58:59 +000011import types
12import builtins
13import random
Antoine Pitrou772add72011-11-06 02:37:42 +010014import traceback
Eli Bendersky67ebabd2011-02-25 10:14:17 +000015from test.support import TESTFN, unlink, run_unittest, check_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000016from operator import neg
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000017import pickle
Antoine Pitrou0d776b12011-11-06 00:34:26 +010018try:
Antoine Pitrou772add72011-11-06 02:37:42 +010019 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010020except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010021 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000022
Guido van Rossum3bead091992-01-27 17:00:37 +000023
Walter Dörwald919497e2003-01-19 16:23:59 +000024class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000025
Walter Dörwald919497e2003-01-19 16:23:59 +000026 def __init__(self, max):
27 self.max = max
28 self.sofar = []
29
30 def __len__(self): return len(self.sofar)
31
32 def __getitem__(self, i):
33 if not 0 <= i < self.max: raise IndexError
34 n = len(self.sofar)
35 while n <= i:
36 self.sofar.append(n*n)
37 n += 1
38 return self.sofar[i]
39
40class StrSquares:
41
42 def __init__(self, max):
43 self.max = max
44 self.sofar = []
45
46 def __len__(self):
47 return len(self.sofar)
48
49 def __getitem__(self, i):
50 if not 0 <= i < self.max:
51 raise IndexError
52 n = len(self.sofar)
53 while n <= i:
54 self.sofar.append(str(n*n))
55 n += 1
56 return self.sofar[i]
57
58class BitBucket:
59 def write(self, line):
60 pass
61
Facundo Batista2336bdd2008-01-19 19:12:01 +000062test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000063 ('0', 0),
64 ('1', 1),
65 ('9', 9),
66 ('10', 10),
67 ('99', 99),
68 ('100', 100),
69 ('314', 314),
70 (' 314', 314),
71 ('314 ', 314),
72 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000073 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000074 (' 1x', ValueError),
75 (' 1 ', 1),
76 (' 1\02 ', ValueError),
77 ('', ValueError),
78 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000079 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000080 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000081 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000082]
83
Facundo Batista2336bdd2008-01-19 19:12:01 +000084test_conv_sign = [
85 ('0', 0),
86 ('1', 1),
87 ('9', 9),
88 ('10', 10),
89 ('99', 99),
90 ('100', 100),
91 ('314', 314),
92 (' 314', ValueError),
93 ('314 ', 314),
94 (' \t\t 314 \t\t ', ValueError),
95 (repr(sys.maxsize), sys.maxsize),
96 (' 1x', ValueError),
97 (' 1 ', ValueError),
98 (' 1\02 ', ValueError),
99 ('', ValueError),
100 (' ', ValueError),
101 (' \t\t ', ValueError),
102 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
103 (chr(0x200), ValueError),
104]
105
Raymond Hettinger96229b12005-03-11 06:49:40 +0000106class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000107 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000108 raise RuntimeError
109
110class TestFailingIter:
111 def __iter__(self):
112 raise RuntimeError
113
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000114def filter_char(arg):
115 return ord(arg) > ord("d")
116
117def map_char(arg):
118 return chr(ord(arg)+1)
119
Walter Dörwald919497e2003-01-19 16:23:59 +0000120class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000121 # Helper to check picklability
122 def check_iter_pickle(self, it, seq):
123 itorg = it
124 d = pickle.dumps(it)
125 it = pickle.loads(d)
126 self.assertEqual(type(itorg), type(it))
127 self.assertEqual(list(it), seq)
128
129 #test the iterator after dropping one from it
130 it = pickle.loads(d)
131 try:
132 next(it)
133 except StopIteration:
134 return
135 d = pickle.dumps(it)
136 it = pickle.loads(d)
137 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000138
139 def test_import(self):
140 __import__('sys')
141 __import__('time')
142 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000143 __import__(name='sys')
144 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000145 self.assertRaises(ImportError, __import__, 'spamspam')
146 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000147 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000148 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000149
150 def test_abs(self):
151 # int
152 self.assertEqual(abs(0), 0)
153 self.assertEqual(abs(1234), 1234)
154 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000155 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000156 # float
157 self.assertEqual(abs(0.0), 0.0)
158 self.assertEqual(abs(3.14), 3.14)
159 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 # str
161 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000162 # bool
163 self.assertEqual(abs(True), 1)
164 self.assertEqual(abs(False), 0)
165 # other
166 self.assertRaises(TypeError, abs)
167 self.assertRaises(TypeError, abs, None)
168 class AbsClass(object):
169 def __abs__(self):
170 return -5
171 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000172
Raymond Hettinger96229b12005-03-11 06:49:40 +0000173 def test_all(self):
174 self.assertEqual(all([2, 4, 6]), True)
175 self.assertEqual(all([2, None, 6]), False)
176 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
177 self.assertRaises(RuntimeError, all, TestFailingIter())
178 self.assertRaises(TypeError, all, 10) # Non-iterable
179 self.assertRaises(TypeError, all) # No args
180 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
181 self.assertEqual(all([]), True) # Empty iterator
182 S = [50, 60]
183 self.assertEqual(all(x > 42 for x in S), True)
184 S = [50, 40, 60]
185 self.assertEqual(all(x > 42 for x in S), False)
186
187 def test_any(self):
188 self.assertEqual(any([None, None, None]), False)
189 self.assertEqual(any([None, 4, None]), True)
190 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
191 self.assertRaises(RuntimeError, all, TestFailingIter())
192 self.assertRaises(TypeError, any, 10) # Non-iterable
193 self.assertRaises(TypeError, any) # No args
194 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
195 self.assertEqual(any([]), False) # Empty iterator
196 S = [40, 60, 30]
197 self.assertEqual(any(x > 42 for x in S), True)
198 S = [10, 20, 30]
199 self.assertEqual(any(x > 42 for x in S), False)
200
Georg Brandl559e5d72008-06-11 18:37:52 +0000201 def test_ascii(self):
202 self.assertEqual(ascii(''), '\'\'')
203 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000204 self.assertEqual(ascii(()), '()')
205 self.assertEqual(ascii([]), '[]')
206 self.assertEqual(ascii({}), '{}')
207 a = []
208 a.append(a)
209 self.assertEqual(ascii(a), '[[...]]')
210 a = {}
211 a[0] = a
212 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000213 # Advanced checks for unicode strings
214 def _check_uni(s):
215 self.assertEqual(ascii(s), repr(s))
216 _check_uni("'")
217 _check_uni('"')
218 _check_uni('"\'')
219 _check_uni('\0')
220 _check_uni('\r\n\t .')
221 # Unprintable non-ASCII characters
222 _check_uni('\x85')
223 _check_uni('\u1fff')
224 _check_uni('\U00012fff')
225 # Lone surrogates
226 _check_uni('\ud800')
227 _check_uni('\udfff')
228 # Issue #9804: surrogates should be joined even for printable
229 # wide characters (UCS-2 builds).
230 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
231 # All together
232 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
233 self.assertEqual(ascii(s),
234 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000235
Thomas Wouters89f507f2006-12-13 04:49:30 +0000236 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000237 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000238 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000239 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000240
Walter Dörwald919497e2003-01-19 16:23:59 +0000241 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000242 self.assertTrue(callable(len))
243 self.assertFalse(callable("a"))
244 self.assertTrue(callable(callable))
245 self.assertTrue(callable(lambda x, y: x + y))
246 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000247 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000248 self.assertTrue(callable(f))
249
250 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000251 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000252 self.assertTrue(callable(C1))
253 c = C1()
254 self.assertTrue(callable(c.meth))
255 self.assertFalse(callable(c))
256
257 # __call__ is looked up on the class, not the instance
258 c.__call__ = None
259 self.assertFalse(callable(c))
260 c.__call__ = lambda self: 0
261 self.assertFalse(callable(c))
262 del c.__call__
263 self.assertFalse(callable(c))
264
265 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000266 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000267 c2 = C2()
268 self.assertTrue(callable(c2))
269 c2.__call__ = None
270 self.assertTrue(callable(c2))
271 class C3(C2): pass
272 c3 = C3()
273 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000274
275 def test_chr(self):
276 self.assertEqual(chr(32), ' ')
277 self.assertEqual(chr(65), 'A')
278 self.assertEqual(chr(97), 'a')
279 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000280 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000281 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300282 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000283 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000284 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
285 self.assertEqual(chr(0x00010000), "\U00010000")
286 self.assertEqual(chr(0x00010001), "\U00010001")
287 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
288 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
289 self.assertEqual(chr(0x00100000), "\U00100000")
290 self.assertEqual(chr(0x00100001), "\U00100001")
291 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
292 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
293 self.assertRaises(ValueError, chr, -1)
294 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000295 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000296
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000297 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000298 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000299
Walter Dörwald919497e2003-01-19 16:23:59 +0000300 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000301 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000302 bom = b'\xef\xbb\xbf'
303 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000304 compile(source='pass', filename='?', mode='exec')
305 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
306 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000307 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000308 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000309 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
310 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000311 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
313 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000314 compile('print("\xe5")\n', '', 'exec')
315 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
316 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317
Georg Brandl8334fd92010-12-04 10:26:46 +0000318 # test the optimize argument
319
320 codestr = '''def f():
321 """doc"""
322 try:
323 assert False
324 except AssertionError:
325 return (True, f.__doc__)
326 else:
327 return (False, f.__doc__)
328 '''
329 def f(): """doc"""
330 values = [(-1, __debug__, f.__doc__),
331 (0, True, 'doc'),
332 (1, False, 'doc'),
333 (2, False, None)]
334 for optval, debugval, docstring in values:
335 # test both direct compilation and compilation via AST
336 codeobjs = []
337 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
338 tree = ast.parse(codestr)
339 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
340 for code in codeobjs:
341 ns = {}
342 exec(code, ns)
343 rv = ns['f']()
344 self.assertEqual(rv, (debugval, docstring))
345
Walter Dörwald919497e2003-01-19 16:23:59 +0000346 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000347 sys.spam = 1
348 delattr(sys, 'spam')
349 self.assertRaises(TypeError, delattr)
350
351 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000352 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000353 self.assertRaises(TypeError, dir, 42, 42)
354
Georg Brandle32b4222007-03-10 22:13:27 +0000355 # dir() - local scope
356 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000357 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000358
359 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000360 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000361
362 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000363 class Foo(types.ModuleType):
364 __dict__ = 8
365 f = Foo("foo")
366 self.assertRaises(TypeError, dir, f)
367
368 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000369 self.assertIn("strip", dir(str))
370 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000371
372 # dir(obj)
373 class Foo(object):
374 def __init__(self):
375 self.x = 7
376 self.y = 8
377 self.z = 9
378 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000379 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000380
381 # dir(obj_no__dict__)
382 class Foo(object):
383 __slots__ = []
384 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000385 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000386
387 # dir(obj_no__class__with__dict__)
388 # (an ugly trick to cause getattr(f, "__class__") to fail)
389 class Foo(object):
390 __slots__ = ["__class__", "__dict__"]
391 def __init__(self):
392 self.bar = "wow"
393 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000394 self.assertNotIn("__repr__", dir(f))
395 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000396
397 # dir(obj_using __dir__)
398 class Foo(object):
399 def __dir__(self):
400 return ["kan", "ga", "roo"]
401 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000402 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000403
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500404 # dir(obj__dir__tuple)
405 class Foo(object):
406 def __dir__(self):
407 return ("b", "c", "a")
408 res = dir(Foo())
409 self.assertIsInstance(res, list)
410 self.assertTrue(res == ["a", "b", "c"])
411
412 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000413 class Foo(object):
414 def __dir__(self):
415 return 7
416 f = Foo()
417 self.assertRaises(TypeError, dir, f)
418
Collin Winter3eed7652007-08-14 17:53:54 +0000419 # dir(traceback)
420 try:
421 raise IndexError
422 except:
423 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
424
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500425 # test that object has a __dir__()
426 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000427
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 def test_divmod(self):
429 self.assertEqual(divmod(12, 7), (1, 5))
430 self.assertEqual(divmod(-12, 7), (-2, 2))
431 self.assertEqual(divmod(12, -7), (-2, -2))
432 self.assertEqual(divmod(-12, -7), (1, -5))
433
Mark Dickinson5c2db372009-12-05 20:28:34 +0000434 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000435
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000436 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
437 (-3.25, 1.0, (-4.0, 0.75)),
438 (3.25, -1.0, (-4.0, -0.75)),
439 (-3.25, -1.0, (3.0, -0.25))]:
440 result = divmod(num, denom)
441 self.assertAlmostEqual(result[0], exp_result[0])
442 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000443
444 self.assertRaises(TypeError, divmod)
445
446 def test_eval(self):
447 self.assertEqual(eval('1+1'), 2)
448 self.assertEqual(eval(' 1+1\n'), 2)
449 globals = {'a': 1, 'b': 2}
450 locals = {'b': 200, 'c': 300}
451 self.assertEqual(eval('a', globals) , 1)
452 self.assertEqual(eval('a', globals, locals), 1)
453 self.assertEqual(eval('b', globals, locals), 200)
454 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000455 globals = {'a': 1, 'b': 2}
456 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000457 bom = b'\xef\xbb\xbf'
458 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000459 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000460 self.assertRaises(TypeError, eval)
461 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000462 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000463
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000464 def test_general_eval(self):
465 # Tests that general mappings can be used for the locals argument
466
467 class M:
468 "Test mapping interface versus possible calls from eval()."
469 def __getitem__(self, key):
470 if key == 'a':
471 return 12
472 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000473 def keys(self):
474 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000475
476 m = M()
477 g = globals()
478 self.assertEqual(eval('a', g, m), 12)
479 self.assertRaises(NameError, eval, 'b', g, m)
480 self.assertEqual(eval('dir()', g, m), list('xyz'))
481 self.assertEqual(eval('globals()', g, m), g)
482 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000483 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000484 class A:
485 "Non-mapping"
486 pass
487 m = A()
488 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000489
490 # Verify that dict subclasses work as well
491 class D(dict):
492 def __getitem__(self, key):
493 if key == 'a':
494 return 12
495 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000496 def keys(self):
497 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000498
499 d = D()
500 self.assertEqual(eval('a', g, d), 12)
501 self.assertRaises(NameError, eval, 'b', g, d)
502 self.assertEqual(eval('dir()', g, d), list('xyz'))
503 self.assertEqual(eval('globals()', g, d), g)
504 self.assertEqual(eval('locals()', g, d), d)
505
506 # Verify locals stores (used by list comps)
507 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000508 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000509
510 class SpreadSheet:
511 "Sample application showing nested, calculated lookups."
512 _cells = {}
513 def __setitem__(self, key, formula):
514 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000515 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000516 return eval(self._cells[key], globals(), self)
517
518 ss = SpreadSheet()
519 ss['a1'] = '5'
520 ss['a2'] = 'a1*6'
521 ss['a3'] = 'a2*7'
522 self.assertEqual(ss['a3'], 210)
523
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000524 # Verify that dir() catches a non-list returned by eval
525 # SF bug #1004669
526 class C:
527 def __getitem__(self, item):
528 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000529 def keys(self):
530 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000531 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
532
Georg Brandl7cae87c2006-09-06 06:51:57 +0000533 def test_exec(self):
534 g = {}
535 exec('z = 1', g)
536 if '__builtins__' in g:
537 del g['__builtins__']
538 self.assertEqual(g, {'z': 1})
539
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000540 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000541 if '__builtins__' in g:
542 del g['__builtins__']
543 self.assertEqual(g, {'z': 2})
544 g = {}
545 l = {}
546
Brett Cannon77628992010-03-20 20:59:33 +0000547 with check_warnings():
548 warnings.filterwarnings("ignore", "global statement",
549 module="<string>")
550 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000551 if '__builtins__' in g:
552 del g['__builtins__']
553 if '__builtins__' in l:
554 del l['__builtins__']
555 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
556
Victor Stinnerb0b22422012-04-19 00:57:45 +0200557 def test_exec_globals(self):
558 code = compile("print('Hello World!')", "", "exec")
559 # no builtin function
560 self.assertRaisesRegex(NameError, "name 'print' is not defined",
561 exec, code, {'__builtins__': {}})
562 # __builtins__ must be a mapping type
563 self.assertRaises(TypeError,
564 exec, code, {'__builtins__': 123})
565
566 # no __build_class__ function
567 code = compile("class A: pass", "", "exec")
568 self.assertRaisesRegex(NameError, "__build_class__ not found",
569 exec, code, {'__builtins__': {}})
570
571 class frozendict_error(Exception):
572 pass
573
574 class frozendict(dict):
575 def __setitem__(self, key, value):
576 raise frozendict_error("frozendict is readonly")
577
578 # read-only builtins
579 frozen_builtins = frozendict(__builtins__)
580 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
581 self.assertRaises(frozendict_error,
582 exec, code, {'__builtins__': frozen_builtins})
583
584 # read-only globals
585 namespace = frozendict({})
586 code = compile("x=1", "test", "exec")
587 self.assertRaises(frozendict_error,
588 exec, code, namespace)
589
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000590 def test_exec_redirected(self):
591 savestdout = sys.stdout
592 sys.stdout = None # Whatever that cannot flush()
593 try:
594 # Used to raise SystemError('error return without exception set')
595 exec('a')
596 except NameError:
597 pass
598 finally:
599 sys.stdout = savestdout
600
Walter Dörwald919497e2003-01-19 16:23:59 +0000601 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000602 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
603 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
604 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
605 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
606 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000607 def identity(item):
608 return 1
609 filter(identity, Squares(5))
610 self.assertRaises(TypeError, filter)
611 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000612 def __getitem__(self, index):
613 if index<4:
614 return 42
615 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000616 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 def badfunc():
618 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000619 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000620
Walter Dörwaldbf517072003-01-27 15:57:14 +0000621 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000622 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
623 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
624 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000625
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000626 def test_filter_pickle(self):
627 f1 = filter(filter_char, "abcdeabcde")
628 f2 = filter(filter_char, "abcdeabcde")
629 self.check_iter_pickle(f1, list(f2))
630
Walter Dörwald919497e2003-01-19 16:23:59 +0000631 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000632 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 self.assertRaises(TypeError, getattr, sys, 1)
634 self.assertRaises(TypeError, getattr, sys, 1, "foo")
635 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000636 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000637 # unicode surrogates are not encodable to the default encoding (utf8)
638 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000639
640 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000641 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000642 self.assertRaises(TypeError, hasattr, sys, 1)
643 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000644 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000645
Benjamin Peterson17689992010-08-24 03:26:23 +0000646 # Check that hasattr propagates all exceptions outside of
647 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000648 class A:
649 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000650 raise SystemExit
651 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000652 class B:
653 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000654 raise ValueError
655 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000656
Walter Dörwald919497e2003-01-19 16:23:59 +0000657 def test_hash(self):
658 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000659 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 self.assertEqual(hash(1), hash(1.0))
661 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000662 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000663 hash((0,1,2,3))
664 def f(): pass
665 self.assertRaises(TypeError, hash, [])
666 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667 # Bug 1536021: Allow hash to return long objects
668 class X:
669 def __hash__(self):
670 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000671 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000672 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673 def __hash__(self):
674 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000675 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000676
677 def test_hex(self):
678 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000679 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 self.assertRaises(TypeError, hex, {})
681
682 def test_id(self):
683 id(None)
684 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000685 id(1.0)
686 id('spam')
687 id((0,1,2,3))
688 id([0,1,2,3])
689 id({'spam': 1, 'eggs': 2, 'ham': 3})
690
Guido van Rossuma88a0332007-02-26 16:59:55 +0000691 # Test input() later, alphabetized as if it were raw_input
692
Walter Dörwald919497e2003-01-19 16:23:59 +0000693 def test_iter(self):
694 self.assertRaises(TypeError, iter)
695 self.assertRaises(TypeError, iter, 42, 42)
696 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000697 for l in lists:
698 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000699 self.assertEqual(next(i), '1')
700 self.assertEqual(next(i), '2')
701 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000702
703 def test_isinstance(self):
704 class C:
705 pass
706 class D(C):
707 pass
708 class E:
709 pass
710 c = C()
711 d = D()
712 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000713 self.assertTrue(isinstance(c, C))
714 self.assertTrue(isinstance(d, C))
715 self.assertTrue(not isinstance(e, C))
716 self.assertTrue(not isinstance(c, D))
717 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000718 self.assertRaises(TypeError, isinstance, E, 'foo')
719 self.assertRaises(TypeError, isinstance)
720
721 def test_issubclass(self):
722 class C:
723 pass
724 class D(C):
725 pass
726 class E:
727 pass
728 c = C()
729 d = D()
730 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000731 self.assertTrue(issubclass(D, C))
732 self.assertTrue(issubclass(C, C))
733 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 self.assertRaises(TypeError, issubclass, 'foo', E)
735 self.assertRaises(TypeError, issubclass, E, 'foo')
736 self.assertRaises(TypeError, issubclass)
737
738 def test_len(self):
739 self.assertEqual(len('123'), 3)
740 self.assertEqual(len(()), 0)
741 self.assertEqual(len((1, 2, 3, 4)), 4)
742 self.assertEqual(len([1, 2, 3, 4]), 4)
743 self.assertEqual(len({}), 0)
744 self.assertEqual(len({'a':1, 'b': 2}), 2)
745 class BadSeq:
746 def __len__(self):
747 raise ValueError
748 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000749 class InvalidLen:
750 def __len__(self):
751 return None
752 self.assertRaises(TypeError, len, InvalidLen())
753 class FloatLen:
754 def __len__(self):
755 return 4.5
756 self.assertRaises(TypeError, len, FloatLen())
757 class HugeLen:
758 def __len__(self):
759 return sys.maxsize + 1
760 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000761 class NoLenMethod(object): pass
762 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000763
Walter Dörwald919497e2003-01-19 16:23:59 +0000764 def test_map(self):
765 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000766 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000767 [1, 4, 9]
768 )
769 try:
770 from math import sqrt
771 except ImportError:
772 def sqrt(x):
773 return pow(x, 0.5)
774 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000775 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000776 [[4.0, 2.0], [9.0, 3.0]]
777 )
778 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000779 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000780 [10, 4, 6]
781 )
782
783 def plus(*v):
784 accu = 0
785 for i in v: accu = accu + i
786 return accu
787 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000788 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000789 [1, 3, 7]
790 )
791 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000792 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000793 [1+4, 3+9, 7+2]
794 )
795 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000796 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000797 [1+4+1, 3+9+1, 7+2+0]
798 )
799 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000800 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
802 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000803 def Max(a, b):
804 if a is None:
805 return b
806 if b is None:
807 return a
808 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000809 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000810 list(map(Max, Squares(3), Squares(2))),
811 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000812 )
813 self.assertRaises(TypeError, map)
814 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000816 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000817 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000818 yield None
819 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000820 def badfunc(x):
821 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000822 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000823
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000824 def test_map_pickle(self):
825 m1 = map(map_char, "Is this the real life?")
826 m2 = map(map_char, "Is this the real life?")
827 self.check_iter_pickle(m1, list(m2))
828
Walter Dörwald919497e2003-01-19 16:23:59 +0000829 def test_max(self):
830 self.assertEqual(max('123123'), '3')
831 self.assertEqual(max(1, 2, 3), 3)
832 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
833 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
834
Guido van Rossume2a383d2007-01-15 16:59:06 +0000835 self.assertEqual(max(1, 2, 3.0), 3.0)
836 self.assertEqual(max(1, 2.0, 3), 3)
837 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000838
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000839 for stmt in (
840 "max(key=int)", # no args
841 "max(1, key=int)", # single arg not iterable
842 "max(1, 2, keystone=int)", # wrong keyword
843 "max(1, 2, key=int, abc=int)", # two many keywords
844 "max(1, 2, key=1)", # keyfunc is not callable
845 ):
Tim Peters7f061872004-12-07 21:17:46 +0000846 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000847 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000848 except TypeError:
849 pass
850 else:
851 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000852
853 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
854 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
855 self.assertEqual(max(1, 2, key=neg), 1) # two elems
856
857 data = [random.randrange(200) for i in range(100)]
858 keys = dict((elem, random.randrange(50)) for elem in data)
859 f = keys.__getitem__
860 self.assertEqual(max(data, key=f),
861 sorted(reversed(data), key=f)[-1])
862
Walter Dörwald919497e2003-01-19 16:23:59 +0000863 def test_min(self):
864 self.assertEqual(min('123123'), '1')
865 self.assertEqual(min(1, 2, 3), 1)
866 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
867 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
868
Guido van Rossume2a383d2007-01-15 16:59:06 +0000869 self.assertEqual(min(1, 2, 3.0), 1)
870 self.assertEqual(min(1, 2.0, 3), 1)
871 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000872
873 self.assertRaises(TypeError, min)
874 self.assertRaises(TypeError, min, 42)
875 self.assertRaises(ValueError, min, ())
876 class BadSeq:
877 def __getitem__(self, index):
878 raise ValueError
879 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000880
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000881 for stmt in (
882 "min(key=int)", # no args
883 "min(1, key=int)", # single arg not iterable
884 "min(1, 2, keystone=int)", # wrong keyword
885 "min(1, 2, key=int, abc=int)", # two many keywords
886 "min(1, 2, key=1)", # keyfunc is not callable
887 ):
Tim Peters7f061872004-12-07 21:17:46 +0000888 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000889 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000890 except TypeError:
891 pass
892 else:
893 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000894
895 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
896 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
897 self.assertEqual(min(1, 2, key=neg), 2) # two elems
898
899 data = [random.randrange(200) for i in range(100)]
900 keys = dict((elem, random.randrange(50)) for elem in data)
901 f = keys.__getitem__
902 self.assertEqual(min(data, key=f),
903 sorted(data, key=f)[0])
904
Georg Brandla18af4e2007-04-21 15:47:16 +0000905 def test_next(self):
906 it = iter(range(2))
907 self.assertEqual(next(it), 0)
908 self.assertEqual(next(it), 1)
909 self.assertRaises(StopIteration, next, it)
910 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000911 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000912
913 class Iter(object):
914 def __iter__(self):
915 return self
916 def __next__(self):
917 raise StopIteration
918
919 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000920 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000921 self.assertRaises(StopIteration, next, it)
922
923 def gen():
924 yield 1
925 return
926
927 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000928 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000929 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000930 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000931
Walter Dörwald919497e2003-01-19 16:23:59 +0000932 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000933 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000934 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000935 self.assertRaises(TypeError, oct, ())
936
937 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000938 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 fp = open(TESTFN, 'w')
940 try:
941 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000942 fp.write('The quick brown fox jumps over the lazy dog')
943 fp.write('.\n')
944 fp.write('Dear John\n')
945 fp.write('XXX'*100)
946 fp.write('YYY'*100)
947 finally:
948 fp.close()
949
950 def test_open(self):
951 self.write_testfile()
952 fp = open(TESTFN, 'r')
953 try:
954 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000955 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
956 self.assertEqual(fp.readline(4), 'Dear')
957 self.assertEqual(fp.readline(100), ' John\n')
958 self.assertEqual(fp.read(300), 'XXX'*100)
959 self.assertEqual(fp.read(1000), 'YYY'*100)
960 finally:
961 fp.close()
962 unlink(TESTFN)
963
964 def test_ord(self):
965 self.assertEqual(ord(' '), 32)
966 self.assertEqual(ord('A'), 65)
967 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000968 self.assertEqual(ord('\x80'), 128)
969 self.assertEqual(ord('\xff'), 255)
970
971 self.assertEqual(ord(b' '), 32)
972 self.assertEqual(ord(b'A'), 65)
973 self.assertEqual(ord(b'a'), 97)
974 self.assertEqual(ord(b'\x80'), 128)
975 self.assertEqual(ord(b'\xff'), 255)
976
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000977 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000979
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000980 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
981 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
982 self.assertEqual(ord("\U00010000"), 0x00010000)
983 self.assertEqual(ord("\U00010001"), 0x00010001)
984 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
985 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
986 self.assertEqual(ord("\U00100000"), 0x00100000)
987 self.assertEqual(ord("\U00100001"), 0x00100001)
988 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
989 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
990
Walter Dörwald919497e2003-01-19 16:23:59 +0000991 def test_pow(self):
992 self.assertEqual(pow(0,0), 1)
993 self.assertEqual(pow(0,1), 0)
994 self.assertEqual(pow(1,0), 1)
995 self.assertEqual(pow(1,1), 1)
996
997 self.assertEqual(pow(2,0), 1)
998 self.assertEqual(pow(2,10), 1024)
999 self.assertEqual(pow(2,20), 1024*1024)
1000 self.assertEqual(pow(2,30), 1024*1024*1024)
1001
1002 self.assertEqual(pow(-2,0), 1)
1003 self.assertEqual(pow(-2,1), -2)
1004 self.assertEqual(pow(-2,2), 4)
1005 self.assertEqual(pow(-2,3), -8)
1006
Walter Dörwald919497e2003-01-19 16:23:59 +00001007 self.assertAlmostEqual(pow(0.,0), 1.)
1008 self.assertAlmostEqual(pow(0.,1), 0.)
1009 self.assertAlmostEqual(pow(1.,0), 1.)
1010 self.assertAlmostEqual(pow(1.,1), 1.)
1011
1012 self.assertAlmostEqual(pow(2.,0), 1.)
1013 self.assertAlmostEqual(pow(2.,10), 1024.)
1014 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1015 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1016
1017 self.assertAlmostEqual(pow(-2.,0), 1.)
1018 self.assertAlmostEqual(pow(-2.,1), -2.)
1019 self.assertAlmostEqual(pow(-2.,2), 4.)
1020 self.assertAlmostEqual(pow(-2.,3), -8.)
1021
Mark Dickinson5c2db372009-12-05 20:28:34 +00001022 for x in 2, 2.0:
1023 for y in 10, 10.0:
1024 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001025 if isinstance(x, float) or \
1026 isinstance(y, float) or \
1027 isinstance(z, float):
1028 self.assertRaises(TypeError, pow, x, y, z)
1029 else:
1030 self.assertAlmostEqual(pow(x, y, z), 24.0)
1031
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001032 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1033 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1034
Walter Dörwald919497e2003-01-19 16:23:59 +00001035 self.assertRaises(TypeError, pow, -1, -2, 3)
1036 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001037
1038 self.assertRaises(TypeError, pow)
1039
Guido van Rossuma88a0332007-02-26 16:59:55 +00001040 def test_input(self):
1041 self.write_testfile()
1042 fp = open(TESTFN, 'r')
1043 savestdin = sys.stdin
1044 savestdout = sys.stdout # Eats the echo
1045 try:
1046 sys.stdin = fp
1047 sys.stdout = BitBucket()
1048 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001049 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1050 self.assertEqual(input('testing\n'), 'Dear John')
1051
1052 # SF 1535165: don't segfault on closed stdin
1053 # sys.stdout must be a regular file for triggering
1054 sys.stdout = savestdout
1055 sys.stdin.close()
1056 self.assertRaises(ValueError, input)
1057
1058 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001059 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001060 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001061 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001062 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001063 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001064 self.assertRaises(EOFError, input)
1065
1066 del sys.stdout
1067 self.assertRaises(RuntimeError, input, 'prompt')
1068 del sys.stdin
1069 self.assertRaises(RuntimeError, input, 'prompt')
1070 finally:
1071 sys.stdin = savestdin
1072 sys.stdout = savestdout
1073 fp.close()
1074 unlink(TESTFN)
1075
Antoine Pitrou772add72011-11-06 02:37:42 +01001076 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001077 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001078 if not sys.stdin.isatty() or not sys.stdout.isatty():
1079 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001080 r, w = os.pipe()
1081 try:
1082 pid, fd = pty.fork()
1083 except (OSError, AttributeError) as e:
1084 os.close(r)
1085 os.close(w)
1086 self.skipTest("pty.fork() raised {}".format(e))
1087 if pid == 0:
1088 # Child
Antoine Pitrou772add72011-11-06 02:37:42 +01001089 try:
1090 # Make sure we don't get stuck if there's a problem
1091 signal.alarm(2)
1092 os.close(r)
1093 # Check the error handlers are accounted for
1094 if stdio_encoding:
1095 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1096 encoding=stdio_encoding,
1097 errors='surrogateescape')
1098 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1099 encoding=stdio_encoding,
1100 errors='replace')
1101 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001102 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1103 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou772add72011-11-06 02:37:42 +01001104 except:
1105 traceback.print_exc()
1106 finally:
1107 # We don't want to return to unittest...
1108 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001109 # Parent
1110 os.close(w)
1111 os.write(fd, terminal_input + b"\r\n")
1112 # Get results from the pipe
1113 with open(r, "r") as rpipe:
1114 lines = []
1115 while True:
1116 line = rpipe.readline().strip()
Antoine Pitrou772add72011-11-06 02:37:42 +01001117 if line == "":
1118 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001119 break
1120 lines.append(line)
Antoine Pitrou772add72011-11-06 02:37:42 +01001121 # Check the result was got and corresponds to the user's terminal input
1122 if len(lines) != 2:
1123 # Something went wrong, try to get at stderr
1124 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1125 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1126 % (len(lines), child_output.read()))
1127 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001128 # Check we did exercise the GNU readline path
1129 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1130 if lines[0] != 'tty = True':
1131 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001132 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1133 if stdio_encoding:
1134 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1135 else:
1136 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1137 self.assertEqual(input_result, expected)
1138
1139 def test_input_tty(self):
1140 # Test input() functionality when wired to a tty (the code path
1141 # is different and invokes GNU readline if available).
1142 self.check_input_tty("prompt", b"quux")
1143
1144 def test_input_tty_non_ascii(self):
1145 # Check stdin/stdout encoding is used when invoking GNU readline
1146 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1147
1148 def test_input_tty_non_ascii_unicode_errors(self):
1149 # Check stdin/stdout error handler is used when invoking GNU readline
1150 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1151
Walter Dörwald919497e2003-01-19 16:23:59 +00001152 def test_repr(self):
1153 self.assertEqual(repr(''), '\'\'')
1154 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 self.assertEqual(repr(()), '()')
1156 self.assertEqual(repr([]), '[]')
1157 self.assertEqual(repr({}), '{}')
1158 a = []
1159 a.append(a)
1160 self.assertEqual(repr(a), '[[...]]')
1161 a = {}
1162 a[0] = a
1163 self.assertEqual(repr(a), '{0: {...}}')
1164
1165 def test_round(self):
1166 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001167 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 self.assertEqual(round(1.0), 1.0)
1169 self.assertEqual(round(10.0), 10.0)
1170 self.assertEqual(round(1000000000.0), 1000000000.0)
1171 self.assertEqual(round(1e20), 1e20)
1172
1173 self.assertEqual(round(-1.0), -1.0)
1174 self.assertEqual(round(-10.0), -10.0)
1175 self.assertEqual(round(-1000000000.0), -1000000000.0)
1176 self.assertEqual(round(-1e20), -1e20)
1177
1178 self.assertEqual(round(0.1), 0.0)
1179 self.assertEqual(round(1.1), 1.0)
1180 self.assertEqual(round(10.1), 10.0)
1181 self.assertEqual(round(1000000000.1), 1000000000.0)
1182
1183 self.assertEqual(round(-1.1), -1.0)
1184 self.assertEqual(round(-10.1), -10.0)
1185 self.assertEqual(round(-1000000000.1), -1000000000.0)
1186
1187 self.assertEqual(round(0.9), 1.0)
1188 self.assertEqual(round(9.9), 10.0)
1189 self.assertEqual(round(999999999.9), 1000000000.0)
1190
1191 self.assertEqual(round(-0.9), -1.0)
1192 self.assertEqual(round(-9.9), -10.0)
1193 self.assertEqual(round(-999999999.9), -1000000000.0)
1194
1195 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001196 self.assertEqual(type(round(-8.0, -1)), float)
1197
1198 self.assertEqual(type(round(-8.0, 0)), float)
1199 self.assertEqual(type(round(-8.0, 1)), float)
1200
1201 # Check even / odd rounding behaviour
1202 self.assertEqual(round(5.5), 6)
1203 self.assertEqual(round(6.5), 6)
1204 self.assertEqual(round(-5.5), -6)
1205 self.assertEqual(round(-6.5), -6)
1206
1207 # Check behavior on ints
1208 self.assertEqual(round(0), 0)
1209 self.assertEqual(round(8), 8)
1210 self.assertEqual(round(-8), -8)
1211 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001212 self.assertEqual(type(round(-8, -1)), int)
1213 self.assertEqual(type(round(-8, 0)), int)
1214 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001215
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001216 # test new kwargs
1217 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1218
Walter Dörwald919497e2003-01-19 16:23:59 +00001219 self.assertRaises(TypeError, round)
1220
Alex Martelliae211f92007-08-22 23:21:33 +00001221 # test generic rounding delegation for reals
1222 class TestRound:
1223 def __round__(self):
1224 return 23
1225
1226 class TestNoRound:
1227 pass
1228
1229 self.assertEqual(round(TestRound()), 23)
1230
1231 self.assertRaises(TypeError, round, 1, 2, 3)
1232 self.assertRaises(TypeError, round, TestNoRound())
1233
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001234 t = TestNoRound()
1235 t.__round__ = lambda *args: args
1236 self.assertRaises(TypeError, round, t)
1237 self.assertRaises(TypeError, round, t, 0)
1238
Mark Dickinsonad731b92009-11-09 17:12:30 +00001239 # Some versions of glibc for alpha have a bug that affects
1240 # float -> integer rounding (floor, ceil, rint, round) for
1241 # values in the range [2**52, 2**53). See:
1242 #
1243 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1244 #
1245 # We skip this test on Linux/alpha if it would fail.
1246 linux_alpha = (platform.system().startswith('Linux') and
1247 platform.machine().startswith('alpha'))
1248 system_round_bug = round(5e15+1) != 5e15+1
1249 @unittest.skipIf(linux_alpha and system_round_bug,
1250 "test will fail; failure is probably due to a "
1251 "buggy system round function")
1252 def test_round_large(self):
1253 # Issue #1869: integral floats should remain unchanged
1254 self.assertEqual(round(5e15-1), 5e15-1)
1255 self.assertEqual(round(5e15), 5e15)
1256 self.assertEqual(round(5e15+1), 5e15+1)
1257 self.assertEqual(round(5e15+2), 5e15+2)
1258 self.assertEqual(round(5e15+3), 5e15+3)
1259
Walter Dörwald919497e2003-01-19 16:23:59 +00001260 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001261 setattr(sys, 'spam', 1)
1262 self.assertEqual(sys.spam, 1)
1263 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1264 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001265
Walter Dörwald919497e2003-01-19 16:23:59 +00001266
Alex Martellia70b1912003-04-22 08:12:33 +00001267 def test_sum(self):
1268 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001269 self.assertEqual(sum(list(range(2,8))), 27)
1270 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001271 self.assertEqual(sum(Squares(10)), 285)
1272 self.assertEqual(sum(iter(Squares(10))), 285)
1273 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1274
1275 self.assertRaises(TypeError, sum)
1276 self.assertRaises(TypeError, sum, 42)
1277 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1278 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001279 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1280 values = [bytearray(b'a'), bytearray(b'b')]
1281 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001282 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1283 self.assertRaises(TypeError, sum, [{2:3}])
1284 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1285
1286 class BadSeq:
1287 def __getitem__(self, index):
1288 raise ValueError
1289 self.assertRaises(ValueError, sum, BadSeq())
1290
Mark Dickinson3a22b472009-10-17 21:48:16 +00001291 empty = []
1292 sum(([x] for x in range(10)), empty)
1293 self.assertEqual(empty, [])
1294
Walter Dörwald919497e2003-01-19 16:23:59 +00001295 def test_type(self):
1296 self.assertEqual(type(''), type('123'))
1297 self.assertNotEqual(type(''), type(()))
1298
Guido van Rossumfee7b932005-01-16 00:21:28 +00001299 # We don't want self in vars(), so these are static methods
1300
1301 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001302 def get_vars_f0():
1303 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001304
Guido van Rossumfee7b932005-01-16 00:21:28 +00001305 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001306 def get_vars_f2():
1307 BuiltinTest.get_vars_f0()
1308 a = 1
1309 b = 2
1310 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001311
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001312 class C_get_vars(object):
1313 def getDict(self):
1314 return {'a':2}
1315 __dict__ = property(fget=getDict)
1316
Walter Dörwald919497e2003-01-19 16:23:59 +00001317 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001318 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001319 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001320 self.assertEqual(self.get_vars_f0(), {})
1321 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1322 self.assertRaises(TypeError, vars, 42, 42)
1323 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001324 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001325
1326 def test_zip(self):
1327 a = (1, 2, 3)
1328 b = (4, 5, 6)
1329 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001330 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001331 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001332 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001333 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001334 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001335 class I:
1336 def __getitem__(self, i):
1337 if i < 0 or i > 2: raise IndexError
1338 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001339 self.assertEqual(list(zip(a, I())), t)
1340 self.assertEqual(list(zip()), [])
1341 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001342 self.assertRaises(TypeError, zip, None)
1343 class G:
1344 pass
1345 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001346 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001347
1348 # Make sure zip doesn't try to allocate a billion elements for the
1349 # result list when one of its arguments doesn't say how long it is.
1350 # A MemoryError is the most likely failure mode.
1351 class SequenceWithoutALength:
1352 def __getitem__(self, i):
1353 if i == 5:
1354 raise IndexError
1355 else:
1356 return i
1357 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001358 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001359 list(enumerate(range(5)))
1360 )
1361
1362 class BadSeq:
1363 def __getitem__(self, i):
1364 if i == 5:
1365 raise ValueError
1366 else:
1367 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001368 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001369
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001370 def test_zip_pickle(self):
1371 a = (1, 2, 3)
1372 b = (4, 5, 6)
1373 t = [(1, 4), (2, 5), (3, 6)]
1374 z1 = zip(a, b)
1375 self.check_iter_pickle(z1, t)
1376
Eric Smithe4d63172010-09-13 20:48:43 +00001377 def test_format(self):
1378 # Test the basic machinery of the format() builtin. Don't test
1379 # the specifics of the various formatters
1380 self.assertEqual(format(3, ''), '3')
1381
1382 # Returns some classes to use for various tests. There's
1383 # an old-style version, and a new-style version
1384 def classes_new():
1385 class A(object):
1386 def __init__(self, x):
1387 self.x = x
1388 def __format__(self, format_spec):
1389 return str(self.x) + format_spec
1390 class DerivedFromA(A):
1391 pass
1392
1393 class Simple(object): pass
1394 class DerivedFromSimple(Simple):
1395 def __init__(self, x):
1396 self.x = x
1397 def __format__(self, format_spec):
1398 return str(self.x) + format_spec
1399 class DerivedFromSimple2(DerivedFromSimple): pass
1400 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1401
1402 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1403 self.assertEqual(format(A(3), 'spec'), '3spec')
1404 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1405 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1406 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1407 '10abcdef')
1408
1409 class_test(*classes_new())
1410
1411 def empty_format_spec(value):
1412 # test that:
1413 # format(x, '') == str(x)
1414 # format(x) == str(x)
1415 self.assertEqual(format(value, ""), str(value))
1416 self.assertEqual(format(value), str(value))
1417
1418 # for builtin types, format(x, "") == str(x)
1419 empty_format_spec(17**13)
1420 empty_format_spec(1.0)
1421 empty_format_spec(3.1415e104)
1422 empty_format_spec(-3.1415e104)
1423 empty_format_spec(3.1415e-104)
1424 empty_format_spec(-3.1415e-104)
1425 empty_format_spec(object)
1426 empty_format_spec(None)
1427
1428 # TypeError because self.__format__ returns the wrong type
1429 class BadFormatResult:
1430 def __format__(self, format_spec):
1431 return 1.0
1432 self.assertRaises(TypeError, format, BadFormatResult(), "")
1433
1434 # TypeError because format_spec is not unicode or str
1435 self.assertRaises(TypeError, format, object(), 4)
1436 self.assertRaises(TypeError, format, object(), object())
1437
1438 # tests for object.__format__ really belong elsewhere, but
1439 # there's no good place to put them
1440 x = object().__format__('')
1441 self.assertTrue(x.startswith('<object object at'))
1442
1443 # first argument to object.__format__ must be string
1444 self.assertRaises(TypeError, object().__format__, 3)
1445 self.assertRaises(TypeError, object().__format__, object())
1446 self.assertRaises(TypeError, object().__format__, None)
1447
1448 # --------------------------------------------------------------------
1449 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001450 # deprecated
Eric Smithe4d63172010-09-13 20:48:43 +00001451 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1452 with warnings.catch_warnings(record=True) as w:
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001453 warnings.simplefilter("always", DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001454 format(obj, fmt_str)
1455 if should_raise_warning:
1456 self.assertEqual(len(w), 1)
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001457 self.assertIsInstance(w[0].message, DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001458 self.assertIn('object.__format__ with a non-empty format '
1459 'string', str(w[0].message))
1460 else:
1461 self.assertEqual(len(w), 0)
1462
1463 fmt_strs = ['', 's']
1464
1465 class A:
1466 def __format__(self, fmt_str):
1467 return format('', fmt_str)
1468
1469 for fmt_str in fmt_strs:
1470 test_deprecated_format_string(A(), fmt_str, False)
1471
1472 class B:
1473 pass
1474
1475 class C(object):
1476 pass
1477
1478 for cls in [object, B, C]:
1479 for fmt_str in fmt_strs:
1480 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1481 # --------------------------------------------------------------------
1482
1483 # make sure we can take a subclass of str as a format spec
1484 class DerivedFromStr(str): pass
1485 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1486
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001487 def test_bin(self):
1488 self.assertEqual(bin(0), '0b0')
1489 self.assertEqual(bin(1), '0b1')
1490 self.assertEqual(bin(-1), '-0b1')
1491 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1492 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1493 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1494 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1495
Georg Brandl953152f2009-07-22 12:03:59 +00001496 def test_bytearray_translate(self):
1497 x = bytearray(b"abc")
1498 self.assertRaises(ValueError, x.translate, b"1", 1)
1499 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1500
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001501 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001502 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001503 tp = type(const)
1504 self.assertIs(tp(), const)
1505 self.assertRaises(TypeError, tp, 1, 2)
1506 self.assertRaises(TypeError, tp, a=1, b=2)
1507
Raymond Hettinger64958a12003-12-17 20:43:33 +00001508class TestSorted(unittest.TestCase):
1509
1510 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001511 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001512 copy = data[:]
1513 random.shuffle(copy)
1514 self.assertEqual(data, sorted(copy))
1515 self.assertNotEqual(data, copy)
1516
1517 data.reverse()
1518 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001519 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1520 self.assertNotEqual(data, copy)
1521 random.shuffle(copy)
1522 self.assertEqual(data, sorted(copy, reverse=1))
1523 self.assertNotEqual(data, copy)
1524
1525 def test_inputtypes(self):
1526 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001527 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001528 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001529 self.assertEqual(sorted(s), sorted(T(s)))
1530
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001531 s = ''.join(set(s)) # unique letters only
1532 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001533 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001534 self.assertEqual(sorted(s), sorted(T(s)))
1535
1536 def test_baddecorator(self):
1537 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1538 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1539
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001540def test_main(verbose=None):
1541 test_classes = (BuiltinTest, TestSorted)
1542
1543 run_unittest(*test_classes)
1544
1545 # verify reference counting
1546 if verbose and hasattr(sys, "gettotalrefcount"):
1547 import gc
1548 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001549 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001550 run_unittest(*test_classes)
1551 gc.collect()
1552 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001553 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001554
Walter Dörwald919497e2003-01-19 16:23:59 +00001555
1556if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001557 test_main(verbose=True)