blob: 88bccd9f3321dd07c4131a8a5f5259e2bfe6a54f [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
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000557 def test_exec_redirected(self):
558 savestdout = sys.stdout
559 sys.stdout = None # Whatever that cannot flush()
560 try:
561 # Used to raise SystemError('error return without exception set')
562 exec('a')
563 except NameError:
564 pass
565 finally:
566 sys.stdout = savestdout
567
Walter Dörwald919497e2003-01-19 16:23:59 +0000568 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000569 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
570 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
571 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
572 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
573 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000574 def identity(item):
575 return 1
576 filter(identity, Squares(5))
577 self.assertRaises(TypeError, filter)
578 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000579 def __getitem__(self, index):
580 if index<4:
581 return 42
582 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000583 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000584 def badfunc():
585 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000586 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000587
Walter Dörwaldbf517072003-01-27 15:57:14 +0000588 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000589 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
590 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
591 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000592
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000593 def test_filter_pickle(self):
594 f1 = filter(filter_char, "abcdeabcde")
595 f2 = filter(filter_char, "abcdeabcde")
596 self.check_iter_pickle(f1, list(f2))
597
Walter Dörwald919497e2003-01-19 16:23:59 +0000598 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000599 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000600 self.assertRaises(TypeError, getattr, sys, 1)
601 self.assertRaises(TypeError, getattr, sys, 1, "foo")
602 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000603 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000604 # unicode surrogates are not encodable to the default encoding (utf8)
605 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000606
607 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000608 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000609 self.assertRaises(TypeError, hasattr, sys, 1)
610 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000611 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000612
Benjamin Peterson17689992010-08-24 03:26:23 +0000613 # Check that hasattr propagates all exceptions outside of
614 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000615 class A:
616 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000617 raise SystemExit
618 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000619 class B:
620 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000621 raise ValueError
622 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000623
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 def test_hash(self):
625 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000626 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 self.assertEqual(hash(1), hash(1.0))
628 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000629 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000630 hash((0,1,2,3))
631 def f(): pass
632 self.assertRaises(TypeError, hash, [])
633 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634 # Bug 1536021: Allow hash to return long objects
635 class X:
636 def __hash__(self):
637 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000638 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000639 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000640 def __hash__(self):
641 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000642 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000643
644 def test_hex(self):
645 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000646 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 self.assertRaises(TypeError, hex, {})
648
649 def test_id(self):
650 id(None)
651 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 id(1.0)
653 id('spam')
654 id((0,1,2,3))
655 id([0,1,2,3])
656 id({'spam': 1, 'eggs': 2, 'ham': 3})
657
Guido van Rossuma88a0332007-02-26 16:59:55 +0000658 # Test input() later, alphabetized as if it were raw_input
659
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 def test_iter(self):
661 self.assertRaises(TypeError, iter)
662 self.assertRaises(TypeError, iter, 42, 42)
663 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 for l in lists:
665 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000666 self.assertEqual(next(i), '1')
667 self.assertEqual(next(i), '2')
668 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000669
670 def test_isinstance(self):
671 class C:
672 pass
673 class D(C):
674 pass
675 class E:
676 pass
677 c = C()
678 d = D()
679 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000680 self.assertTrue(isinstance(c, C))
681 self.assertTrue(isinstance(d, C))
682 self.assertTrue(not isinstance(e, C))
683 self.assertTrue(not isinstance(c, D))
684 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000685 self.assertRaises(TypeError, isinstance, E, 'foo')
686 self.assertRaises(TypeError, isinstance)
687
688 def test_issubclass(self):
689 class C:
690 pass
691 class D(C):
692 pass
693 class E:
694 pass
695 c = C()
696 d = D()
697 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000698 self.assertTrue(issubclass(D, C))
699 self.assertTrue(issubclass(C, C))
700 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000701 self.assertRaises(TypeError, issubclass, 'foo', E)
702 self.assertRaises(TypeError, issubclass, E, 'foo')
703 self.assertRaises(TypeError, issubclass)
704
705 def test_len(self):
706 self.assertEqual(len('123'), 3)
707 self.assertEqual(len(()), 0)
708 self.assertEqual(len((1, 2, 3, 4)), 4)
709 self.assertEqual(len([1, 2, 3, 4]), 4)
710 self.assertEqual(len({}), 0)
711 self.assertEqual(len({'a':1, 'b': 2}), 2)
712 class BadSeq:
713 def __len__(self):
714 raise ValueError
715 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000716 class InvalidLen:
717 def __len__(self):
718 return None
719 self.assertRaises(TypeError, len, InvalidLen())
720 class FloatLen:
721 def __len__(self):
722 return 4.5
723 self.assertRaises(TypeError, len, FloatLen())
724 class HugeLen:
725 def __len__(self):
726 return sys.maxsize + 1
727 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000728 class NoLenMethod(object): pass
729 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000730
Walter Dörwald919497e2003-01-19 16:23:59 +0000731 def test_map(self):
732 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000733 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 [1, 4, 9]
735 )
736 try:
737 from math import sqrt
738 except ImportError:
739 def sqrt(x):
740 return pow(x, 0.5)
741 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000742 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000743 [[4.0, 2.0], [9.0, 3.0]]
744 )
745 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000746 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000747 [10, 4, 6]
748 )
749
750 def plus(*v):
751 accu = 0
752 for i in v: accu = accu + i
753 return accu
754 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000755 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000756 [1, 3, 7]
757 )
758 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000759 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 [1+4, 3+9, 7+2]
761 )
762 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000763 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000764 [1+4+1, 3+9+1, 7+2+0]
765 )
766 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000767 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000768 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
769 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000770 def Max(a, b):
771 if a is None:
772 return b
773 if b is None:
774 return a
775 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000776 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000777 list(map(Max, Squares(3), Squares(2))),
778 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000779 )
780 self.assertRaises(TypeError, map)
781 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000782 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000783 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000784 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000785 yield None
786 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000787 def badfunc(x):
788 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000790
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000791 def test_map_pickle(self):
792 m1 = map(map_char, "Is this the real life?")
793 m2 = map(map_char, "Is this the real life?")
794 self.check_iter_pickle(m1, list(m2))
795
Walter Dörwald919497e2003-01-19 16:23:59 +0000796 def test_max(self):
797 self.assertEqual(max('123123'), '3')
798 self.assertEqual(max(1, 2, 3), 3)
799 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
800 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
801
Guido van Rossume2a383d2007-01-15 16:59:06 +0000802 self.assertEqual(max(1, 2, 3.0), 3.0)
803 self.assertEqual(max(1, 2.0, 3), 3)
804 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000805
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000806 for stmt in (
807 "max(key=int)", # no args
808 "max(1, key=int)", # single arg not iterable
809 "max(1, 2, keystone=int)", # wrong keyword
810 "max(1, 2, key=int, abc=int)", # two many keywords
811 "max(1, 2, key=1)", # keyfunc is not callable
812 ):
Tim Peters7f061872004-12-07 21:17:46 +0000813 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000814 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000815 except TypeError:
816 pass
817 else:
818 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000819
820 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
821 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
822 self.assertEqual(max(1, 2, key=neg), 1) # two elems
823
824 data = [random.randrange(200) for i in range(100)]
825 keys = dict((elem, random.randrange(50)) for elem in data)
826 f = keys.__getitem__
827 self.assertEqual(max(data, key=f),
828 sorted(reversed(data), key=f)[-1])
829
Walter Dörwald919497e2003-01-19 16:23:59 +0000830 def test_min(self):
831 self.assertEqual(min('123123'), '1')
832 self.assertEqual(min(1, 2, 3), 1)
833 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
834 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
835
Guido van Rossume2a383d2007-01-15 16:59:06 +0000836 self.assertEqual(min(1, 2, 3.0), 1)
837 self.assertEqual(min(1, 2.0, 3), 1)
838 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000839
840 self.assertRaises(TypeError, min)
841 self.assertRaises(TypeError, min, 42)
842 self.assertRaises(ValueError, min, ())
843 class BadSeq:
844 def __getitem__(self, index):
845 raise ValueError
846 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000847
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000848 for stmt in (
849 "min(key=int)", # no args
850 "min(1, key=int)", # single arg not iterable
851 "min(1, 2, keystone=int)", # wrong keyword
852 "min(1, 2, key=int, abc=int)", # two many keywords
853 "min(1, 2, key=1)", # keyfunc is not callable
854 ):
Tim Peters7f061872004-12-07 21:17:46 +0000855 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000856 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000857 except TypeError:
858 pass
859 else:
860 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000861
862 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
863 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
864 self.assertEqual(min(1, 2, key=neg), 2) # two elems
865
866 data = [random.randrange(200) for i in range(100)]
867 keys = dict((elem, random.randrange(50)) for elem in data)
868 f = keys.__getitem__
869 self.assertEqual(min(data, key=f),
870 sorted(data, key=f)[0])
871
Georg Brandla18af4e2007-04-21 15:47:16 +0000872 def test_next(self):
873 it = iter(range(2))
874 self.assertEqual(next(it), 0)
875 self.assertEqual(next(it), 1)
876 self.assertRaises(StopIteration, next, it)
877 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000878 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000879
880 class Iter(object):
881 def __iter__(self):
882 return self
883 def __next__(self):
884 raise StopIteration
885
886 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000887 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000888 self.assertRaises(StopIteration, next, it)
889
890 def gen():
891 yield 1
892 return
893
894 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000895 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000896 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000897 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000898
Walter Dörwald919497e2003-01-19 16:23:59 +0000899 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000900 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000901 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 self.assertRaises(TypeError, oct, ())
903
904 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000905 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 fp = open(TESTFN, 'w')
907 try:
908 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000909 fp.write('The quick brown fox jumps over the lazy dog')
910 fp.write('.\n')
911 fp.write('Dear John\n')
912 fp.write('XXX'*100)
913 fp.write('YYY'*100)
914 finally:
915 fp.close()
916
917 def test_open(self):
918 self.write_testfile()
919 fp = open(TESTFN, 'r')
920 try:
921 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
923 self.assertEqual(fp.readline(4), 'Dear')
924 self.assertEqual(fp.readline(100), ' John\n')
925 self.assertEqual(fp.read(300), 'XXX'*100)
926 self.assertEqual(fp.read(1000), 'YYY'*100)
927 finally:
928 fp.close()
929 unlink(TESTFN)
930
931 def test_ord(self):
932 self.assertEqual(ord(' '), 32)
933 self.assertEqual(ord('A'), 65)
934 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000935 self.assertEqual(ord('\x80'), 128)
936 self.assertEqual(ord('\xff'), 255)
937
938 self.assertEqual(ord(b' '), 32)
939 self.assertEqual(ord(b'A'), 65)
940 self.assertEqual(ord(b'a'), 97)
941 self.assertEqual(ord(b'\x80'), 128)
942 self.assertEqual(ord(b'\xff'), 255)
943
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000944 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000945 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000946
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000947 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
948 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
949 self.assertEqual(ord("\U00010000"), 0x00010000)
950 self.assertEqual(ord("\U00010001"), 0x00010001)
951 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
952 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
953 self.assertEqual(ord("\U00100000"), 0x00100000)
954 self.assertEqual(ord("\U00100001"), 0x00100001)
955 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
956 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
957
Walter Dörwald919497e2003-01-19 16:23:59 +0000958 def test_pow(self):
959 self.assertEqual(pow(0,0), 1)
960 self.assertEqual(pow(0,1), 0)
961 self.assertEqual(pow(1,0), 1)
962 self.assertEqual(pow(1,1), 1)
963
964 self.assertEqual(pow(2,0), 1)
965 self.assertEqual(pow(2,10), 1024)
966 self.assertEqual(pow(2,20), 1024*1024)
967 self.assertEqual(pow(2,30), 1024*1024*1024)
968
969 self.assertEqual(pow(-2,0), 1)
970 self.assertEqual(pow(-2,1), -2)
971 self.assertEqual(pow(-2,2), 4)
972 self.assertEqual(pow(-2,3), -8)
973
Walter Dörwald919497e2003-01-19 16:23:59 +0000974 self.assertAlmostEqual(pow(0.,0), 1.)
975 self.assertAlmostEqual(pow(0.,1), 0.)
976 self.assertAlmostEqual(pow(1.,0), 1.)
977 self.assertAlmostEqual(pow(1.,1), 1.)
978
979 self.assertAlmostEqual(pow(2.,0), 1.)
980 self.assertAlmostEqual(pow(2.,10), 1024.)
981 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
982 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
983
984 self.assertAlmostEqual(pow(-2.,0), 1.)
985 self.assertAlmostEqual(pow(-2.,1), -2.)
986 self.assertAlmostEqual(pow(-2.,2), 4.)
987 self.assertAlmostEqual(pow(-2.,3), -8.)
988
Mark Dickinson5c2db372009-12-05 20:28:34 +0000989 for x in 2, 2.0:
990 for y in 10, 10.0:
991 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 if isinstance(x, float) or \
993 isinstance(y, float) or \
994 isinstance(z, float):
995 self.assertRaises(TypeError, pow, x, y, z)
996 else:
997 self.assertAlmostEqual(pow(x, y, z), 24.0)
998
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000999 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1000 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1001
Walter Dörwald919497e2003-01-19 16:23:59 +00001002 self.assertRaises(TypeError, pow, -1, -2, 3)
1003 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001004
1005 self.assertRaises(TypeError, pow)
1006
Guido van Rossuma88a0332007-02-26 16:59:55 +00001007 def test_input(self):
1008 self.write_testfile()
1009 fp = open(TESTFN, 'r')
1010 savestdin = sys.stdin
1011 savestdout = sys.stdout # Eats the echo
1012 try:
1013 sys.stdin = fp
1014 sys.stdout = BitBucket()
1015 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001016 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1017 self.assertEqual(input('testing\n'), 'Dear John')
1018
1019 # SF 1535165: don't segfault on closed stdin
1020 # sys.stdout must be a regular file for triggering
1021 sys.stdout = savestdout
1022 sys.stdin.close()
1023 self.assertRaises(ValueError, input)
1024
1025 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001026 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001027 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001028 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001029 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001030 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001031 self.assertRaises(EOFError, input)
1032
1033 del sys.stdout
1034 self.assertRaises(RuntimeError, input, 'prompt')
1035 del sys.stdin
1036 self.assertRaises(RuntimeError, input, 'prompt')
1037 finally:
1038 sys.stdin = savestdin
1039 sys.stdout = savestdout
1040 fp.close()
1041 unlink(TESTFN)
1042
Antoine Pitrou772add72011-11-06 02:37:42 +01001043 @unittest.skipUnless(pty, "the pty and signal modules must be available")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001044 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
Antoine Pitrou1ce4b142011-11-06 03:03:18 +01001045 if not sys.stdin.isatty() or not sys.stdout.isatty():
1046 self.skipTest("stdin and stdout must be ttys")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001047 r, w = os.pipe()
1048 try:
1049 pid, fd = pty.fork()
1050 except (OSError, AttributeError) as e:
1051 os.close(r)
1052 os.close(w)
1053 self.skipTest("pty.fork() raised {}".format(e))
1054 if pid == 0:
1055 # Child
Antoine Pitrou772add72011-11-06 02:37:42 +01001056 try:
1057 # Make sure we don't get stuck if there's a problem
1058 signal.alarm(2)
1059 os.close(r)
1060 # Check the error handlers are accounted for
1061 if stdio_encoding:
1062 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1063 encoding=stdio_encoding,
1064 errors='surrogateescape')
1065 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1066 encoding=stdio_encoding,
1067 errors='replace')
1068 with open(w, "w") as wpipe:
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001069 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1070 print(ascii(input(prompt)), file=wpipe)
Antoine Pitrou772add72011-11-06 02:37:42 +01001071 except:
1072 traceback.print_exc()
1073 finally:
1074 # We don't want to return to unittest...
1075 os._exit(0)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001076 # Parent
1077 os.close(w)
1078 os.write(fd, terminal_input + b"\r\n")
1079 # Get results from the pipe
1080 with open(r, "r") as rpipe:
1081 lines = []
1082 while True:
1083 line = rpipe.readline().strip()
Antoine Pitrou772add72011-11-06 02:37:42 +01001084 if line == "":
1085 # The other end was closed => the child exited
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001086 break
1087 lines.append(line)
Antoine Pitrou772add72011-11-06 02:37:42 +01001088 # Check the result was got and corresponds to the user's terminal input
1089 if len(lines) != 2:
1090 # Something went wrong, try to get at stderr
1091 with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
1092 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1093 % (len(lines), child_output.read()))
1094 os.close(fd)
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001095 # Check we did exercise the GNU readline path
1096 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1097 if lines[0] != 'tty = True':
1098 self.skipTest("standard IO in should have been a tty")
Antoine Pitrou0d776b12011-11-06 00:34:26 +01001099 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1100 if stdio_encoding:
1101 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1102 else:
1103 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1104 self.assertEqual(input_result, expected)
1105
1106 def test_input_tty(self):
1107 # Test input() functionality when wired to a tty (the code path
1108 # is different and invokes GNU readline if available).
1109 self.check_input_tty("prompt", b"quux")
1110
1111 def test_input_tty_non_ascii(self):
1112 # Check stdin/stdout encoding is used when invoking GNU readline
1113 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1114
1115 def test_input_tty_non_ascii_unicode_errors(self):
1116 # Check stdin/stdout error handler is used when invoking GNU readline
1117 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1118
Walter Dörwald919497e2003-01-19 16:23:59 +00001119 def test_repr(self):
1120 self.assertEqual(repr(''), '\'\'')
1121 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001122 self.assertEqual(repr(()), '()')
1123 self.assertEqual(repr([]), '[]')
1124 self.assertEqual(repr({}), '{}')
1125 a = []
1126 a.append(a)
1127 self.assertEqual(repr(a), '[[...]]')
1128 a = {}
1129 a[0] = a
1130 self.assertEqual(repr(a), '{0: {...}}')
1131
1132 def test_round(self):
1133 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001134 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 self.assertEqual(round(1.0), 1.0)
1136 self.assertEqual(round(10.0), 10.0)
1137 self.assertEqual(round(1000000000.0), 1000000000.0)
1138 self.assertEqual(round(1e20), 1e20)
1139
1140 self.assertEqual(round(-1.0), -1.0)
1141 self.assertEqual(round(-10.0), -10.0)
1142 self.assertEqual(round(-1000000000.0), -1000000000.0)
1143 self.assertEqual(round(-1e20), -1e20)
1144
1145 self.assertEqual(round(0.1), 0.0)
1146 self.assertEqual(round(1.1), 1.0)
1147 self.assertEqual(round(10.1), 10.0)
1148 self.assertEqual(round(1000000000.1), 1000000000.0)
1149
1150 self.assertEqual(round(-1.1), -1.0)
1151 self.assertEqual(round(-10.1), -10.0)
1152 self.assertEqual(round(-1000000000.1), -1000000000.0)
1153
1154 self.assertEqual(round(0.9), 1.0)
1155 self.assertEqual(round(9.9), 10.0)
1156 self.assertEqual(round(999999999.9), 1000000000.0)
1157
1158 self.assertEqual(round(-0.9), -1.0)
1159 self.assertEqual(round(-9.9), -10.0)
1160 self.assertEqual(round(-999999999.9), -1000000000.0)
1161
1162 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001163 self.assertEqual(type(round(-8.0, -1)), float)
1164
1165 self.assertEqual(type(round(-8.0, 0)), float)
1166 self.assertEqual(type(round(-8.0, 1)), float)
1167
1168 # Check even / odd rounding behaviour
1169 self.assertEqual(round(5.5), 6)
1170 self.assertEqual(round(6.5), 6)
1171 self.assertEqual(round(-5.5), -6)
1172 self.assertEqual(round(-6.5), -6)
1173
1174 # Check behavior on ints
1175 self.assertEqual(round(0), 0)
1176 self.assertEqual(round(8), 8)
1177 self.assertEqual(round(-8), -8)
1178 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001179 self.assertEqual(type(round(-8, -1)), int)
1180 self.assertEqual(type(round(-8, 0)), int)
1181 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001182
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183 # test new kwargs
1184 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1185
Walter Dörwald919497e2003-01-19 16:23:59 +00001186 self.assertRaises(TypeError, round)
1187
Alex Martelliae211f92007-08-22 23:21:33 +00001188 # test generic rounding delegation for reals
1189 class TestRound:
1190 def __round__(self):
1191 return 23
1192
1193 class TestNoRound:
1194 pass
1195
1196 self.assertEqual(round(TestRound()), 23)
1197
1198 self.assertRaises(TypeError, round, 1, 2, 3)
1199 self.assertRaises(TypeError, round, TestNoRound())
1200
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001201 t = TestNoRound()
1202 t.__round__ = lambda *args: args
1203 self.assertRaises(TypeError, round, t)
1204 self.assertRaises(TypeError, round, t, 0)
1205
Mark Dickinsonad731b92009-11-09 17:12:30 +00001206 # Some versions of glibc for alpha have a bug that affects
1207 # float -> integer rounding (floor, ceil, rint, round) for
1208 # values in the range [2**52, 2**53). See:
1209 #
1210 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1211 #
1212 # We skip this test on Linux/alpha if it would fail.
1213 linux_alpha = (platform.system().startswith('Linux') and
1214 platform.machine().startswith('alpha'))
1215 system_round_bug = round(5e15+1) != 5e15+1
1216 @unittest.skipIf(linux_alpha and system_round_bug,
1217 "test will fail; failure is probably due to a "
1218 "buggy system round function")
1219 def test_round_large(self):
1220 # Issue #1869: integral floats should remain unchanged
1221 self.assertEqual(round(5e15-1), 5e15-1)
1222 self.assertEqual(round(5e15), 5e15)
1223 self.assertEqual(round(5e15+1), 5e15+1)
1224 self.assertEqual(round(5e15+2), 5e15+2)
1225 self.assertEqual(round(5e15+3), 5e15+3)
1226
Walter Dörwald919497e2003-01-19 16:23:59 +00001227 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001228 setattr(sys, 'spam', 1)
1229 self.assertEqual(sys.spam, 1)
1230 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1231 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001232
Walter Dörwald919497e2003-01-19 16:23:59 +00001233
Alex Martellia70b1912003-04-22 08:12:33 +00001234 def test_sum(self):
1235 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001236 self.assertEqual(sum(list(range(2,8))), 27)
1237 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001238 self.assertEqual(sum(Squares(10)), 285)
1239 self.assertEqual(sum(iter(Squares(10))), 285)
1240 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1241
1242 self.assertRaises(TypeError, sum)
1243 self.assertRaises(TypeError, sum, 42)
1244 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1245 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001246 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1247 values = [bytearray(b'a'), bytearray(b'b')]
1248 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001249 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1250 self.assertRaises(TypeError, sum, [{2:3}])
1251 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1252
1253 class BadSeq:
1254 def __getitem__(self, index):
1255 raise ValueError
1256 self.assertRaises(ValueError, sum, BadSeq())
1257
Mark Dickinson3a22b472009-10-17 21:48:16 +00001258 empty = []
1259 sum(([x] for x in range(10)), empty)
1260 self.assertEqual(empty, [])
1261
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 def test_type(self):
1263 self.assertEqual(type(''), type('123'))
1264 self.assertNotEqual(type(''), type(()))
1265
Guido van Rossumfee7b932005-01-16 00:21:28 +00001266 # We don't want self in vars(), so these are static methods
1267
1268 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001269 def get_vars_f0():
1270 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001271
Guido van Rossumfee7b932005-01-16 00:21:28 +00001272 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001273 def get_vars_f2():
1274 BuiltinTest.get_vars_f0()
1275 a = 1
1276 b = 2
1277 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001278
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001279 class C_get_vars(object):
1280 def getDict(self):
1281 return {'a':2}
1282 __dict__ = property(fget=getDict)
1283
Walter Dörwald919497e2003-01-19 16:23:59 +00001284 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001285 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001286 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001287 self.assertEqual(self.get_vars_f0(), {})
1288 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1289 self.assertRaises(TypeError, vars, 42, 42)
1290 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001291 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001292
1293 def test_zip(self):
1294 a = (1, 2, 3)
1295 b = (4, 5, 6)
1296 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001297 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001298 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001299 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001300 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001301 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001302 class I:
1303 def __getitem__(self, i):
1304 if i < 0 or i > 2: raise IndexError
1305 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001306 self.assertEqual(list(zip(a, I())), t)
1307 self.assertEqual(list(zip()), [])
1308 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001309 self.assertRaises(TypeError, zip, None)
1310 class G:
1311 pass
1312 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001313 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001314
1315 # Make sure zip doesn't try to allocate a billion elements for the
1316 # result list when one of its arguments doesn't say how long it is.
1317 # A MemoryError is the most likely failure mode.
1318 class SequenceWithoutALength:
1319 def __getitem__(self, i):
1320 if i == 5:
1321 raise IndexError
1322 else:
1323 return i
1324 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001325 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001326 list(enumerate(range(5)))
1327 )
1328
1329 class BadSeq:
1330 def __getitem__(self, i):
1331 if i == 5:
1332 raise ValueError
1333 else:
1334 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001335 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001336
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001337 def test_zip_pickle(self):
1338 a = (1, 2, 3)
1339 b = (4, 5, 6)
1340 t = [(1, 4), (2, 5), (3, 6)]
1341 z1 = zip(a, b)
1342 self.check_iter_pickle(z1, t)
1343
Eric Smithe4d63172010-09-13 20:48:43 +00001344 def test_format(self):
1345 # Test the basic machinery of the format() builtin. Don't test
1346 # the specifics of the various formatters
1347 self.assertEqual(format(3, ''), '3')
1348
1349 # Returns some classes to use for various tests. There's
1350 # an old-style version, and a new-style version
1351 def classes_new():
1352 class A(object):
1353 def __init__(self, x):
1354 self.x = x
1355 def __format__(self, format_spec):
1356 return str(self.x) + format_spec
1357 class DerivedFromA(A):
1358 pass
1359
1360 class Simple(object): pass
1361 class DerivedFromSimple(Simple):
1362 def __init__(self, x):
1363 self.x = x
1364 def __format__(self, format_spec):
1365 return str(self.x) + format_spec
1366 class DerivedFromSimple2(DerivedFromSimple): pass
1367 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1368
1369 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1370 self.assertEqual(format(A(3), 'spec'), '3spec')
1371 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1372 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1373 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1374 '10abcdef')
1375
1376 class_test(*classes_new())
1377
1378 def empty_format_spec(value):
1379 # test that:
1380 # format(x, '') == str(x)
1381 # format(x) == str(x)
1382 self.assertEqual(format(value, ""), str(value))
1383 self.assertEqual(format(value), str(value))
1384
1385 # for builtin types, format(x, "") == str(x)
1386 empty_format_spec(17**13)
1387 empty_format_spec(1.0)
1388 empty_format_spec(3.1415e104)
1389 empty_format_spec(-3.1415e104)
1390 empty_format_spec(3.1415e-104)
1391 empty_format_spec(-3.1415e-104)
1392 empty_format_spec(object)
1393 empty_format_spec(None)
1394
1395 # TypeError because self.__format__ returns the wrong type
1396 class BadFormatResult:
1397 def __format__(self, format_spec):
1398 return 1.0
1399 self.assertRaises(TypeError, format, BadFormatResult(), "")
1400
1401 # TypeError because format_spec is not unicode or str
1402 self.assertRaises(TypeError, format, object(), 4)
1403 self.assertRaises(TypeError, format, object(), object())
1404
1405 # tests for object.__format__ really belong elsewhere, but
1406 # there's no good place to put them
1407 x = object().__format__('')
1408 self.assertTrue(x.startswith('<object object at'))
1409
1410 # first argument to object.__format__ must be string
1411 self.assertRaises(TypeError, object().__format__, 3)
1412 self.assertRaises(TypeError, object().__format__, object())
1413 self.assertRaises(TypeError, object().__format__, None)
1414
1415 # --------------------------------------------------------------------
1416 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001417 # deprecated
Eric Smithe4d63172010-09-13 20:48:43 +00001418 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1419 with warnings.catch_warnings(record=True) as w:
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001420 warnings.simplefilter("always", DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001421 format(obj, fmt_str)
1422 if should_raise_warning:
1423 self.assertEqual(len(w), 1)
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001424 self.assertIsInstance(w[0].message, DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001425 self.assertIn('object.__format__ with a non-empty format '
1426 'string', str(w[0].message))
1427 else:
1428 self.assertEqual(len(w), 0)
1429
1430 fmt_strs = ['', 's']
1431
1432 class A:
1433 def __format__(self, fmt_str):
1434 return format('', fmt_str)
1435
1436 for fmt_str in fmt_strs:
1437 test_deprecated_format_string(A(), fmt_str, False)
1438
1439 class B:
1440 pass
1441
1442 class C(object):
1443 pass
1444
1445 for cls in [object, B, C]:
1446 for fmt_str in fmt_strs:
1447 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1448 # --------------------------------------------------------------------
1449
1450 # make sure we can take a subclass of str as a format spec
1451 class DerivedFromStr(str): pass
1452 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1453
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001454 def test_bin(self):
1455 self.assertEqual(bin(0), '0b0')
1456 self.assertEqual(bin(1), '0b1')
1457 self.assertEqual(bin(-1), '-0b1')
1458 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1459 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1460 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1461 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1462
Georg Brandl953152f2009-07-22 12:03:59 +00001463 def test_bytearray_translate(self):
1464 x = bytearray(b"abc")
1465 self.assertRaises(ValueError, x.translate, b"1", 1)
1466 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1467
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001468 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001469 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001470 tp = type(const)
1471 self.assertIs(tp(), const)
1472 self.assertRaises(TypeError, tp, 1, 2)
1473 self.assertRaises(TypeError, tp, a=1, b=2)
1474
Raymond Hettinger64958a12003-12-17 20:43:33 +00001475class TestSorted(unittest.TestCase):
1476
1477 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001478 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001479 copy = data[:]
1480 random.shuffle(copy)
1481 self.assertEqual(data, sorted(copy))
1482 self.assertNotEqual(data, copy)
1483
1484 data.reverse()
1485 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001486 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1487 self.assertNotEqual(data, copy)
1488 random.shuffle(copy)
1489 self.assertEqual(data, sorted(copy, reverse=1))
1490 self.assertNotEqual(data, copy)
1491
1492 def test_inputtypes(self):
1493 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001494 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001495 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001496 self.assertEqual(sorted(s), sorted(T(s)))
1497
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001498 s = ''.join(set(s)) # unique letters only
1499 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001500 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001501 self.assertEqual(sorted(s), sorted(T(s)))
1502
1503 def test_baddecorator(self):
1504 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1505 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1506
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001507def test_main(verbose=None):
1508 test_classes = (BuiltinTest, TestSorted)
1509
1510 run_unittest(*test_classes)
1511
1512 # verify reference counting
1513 if verbose and hasattr(sys, "gettotalrefcount"):
1514 import gc
1515 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001516 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001517 run_unittest(*test_classes)
1518 gc.collect()
1519 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001520 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001521
Walter Dörwald919497e2003-01-19 16:23:59 +00001522
1523if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001524 test_main(verbose=True)