blob: 52b337c21c7d3327e8b3855763bdcb78bd68238f [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
Walter Dörwald919497e2003-01-19 16:23:59 +00003import test.test_support, unittest
Walter Dörwald1f5947b2007-05-22 16:52:54 +00004from test.test_support import fcmp, TESTFN, unlink, run_unittest, \
5 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Raymond Hettinger53dbe392008-02-12 20:03:09 +00008import sys, warnings, random, collections, io, fractions
Walter Dörwald919497e2003-01-19 16:23:59 +00009warnings.filterwarnings("ignore", "hex../oct.. of negative int",
10 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000011warnings.filterwarnings("ignore", "integer argument expected",
12 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Walter Dörwald919497e2003-01-19 16:23:59 +000016 def __init__(self, max):
17 self.max = max
18 self.sofar = []
19
20 def __len__(self): return len(self.sofar)
21
22 def __getitem__(self, i):
23 if not 0 <= i < self.max: raise IndexError
24 n = len(self.sofar)
25 while n <= i:
26 self.sofar.append(n*n)
27 n += 1
28 return self.sofar[i]
29
30class StrSquares:
31
32 def __init__(self, max):
33 self.max = max
34 self.sofar = []
35
36 def __len__(self):
37 return len(self.sofar)
38
39 def __getitem__(self, i):
40 if not 0 <= i < self.max:
41 raise IndexError
42 n = len(self.sofar)
43 while n <= i:
44 self.sofar.append(str(n*n))
45 n += 1
46 return self.sofar[i]
47
48class BitBucket:
49 def write(self, line):
50 pass
51
Facundo Batista2336bdd2008-01-19 19:12:01 +000052test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000053 ('0', 0),
54 ('1', 1),
55 ('9', 9),
56 ('10', 10),
57 ('99', 99),
58 ('100', 100),
59 ('314', 314),
60 (' 314', 314),
61 ('314 ', 314),
62 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000063 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000064 (' 1x', ValueError),
65 (' 1 ', 1),
66 (' 1\02 ', ValueError),
67 ('', ValueError),
68 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000069 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000070 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000071 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000072]
73
Facundo Batista2336bdd2008-01-19 19:12:01 +000074test_conv_sign = [
75 ('0', 0),
76 ('1', 1),
77 ('9', 9),
78 ('10', 10),
79 ('99', 99),
80 ('100', 100),
81 ('314', 314),
82 (' 314', ValueError),
83 ('314 ', 314),
84 (' \t\t 314 \t\t ', ValueError),
85 (repr(sys.maxsize), sys.maxsize),
86 (' 1x', ValueError),
87 (' 1 ', ValueError),
88 (' 1\02 ', ValueError),
89 ('', ValueError),
90 (' ', ValueError),
91 (' \t\t ', ValueError),
92 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
93 (chr(0x200), ValueError),
94]
95
Raymond Hettinger96229b12005-03-11 06:49:40 +000096class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000097 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000098 raise RuntimeError
99
100class TestFailingIter:
101 def __iter__(self):
102 raise RuntimeError
103
Walter Dörwald919497e2003-01-19 16:23:59 +0000104class BuiltinTest(unittest.TestCase):
105
106 def test_import(self):
107 __import__('sys')
108 __import__('time')
109 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000110 __import__(name='sys')
111 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000112 self.assertRaises(ImportError, __import__, 'spamspam')
113 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000114 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000115 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000116
117 def test_abs(self):
118 # int
119 self.assertEqual(abs(0), 0)
120 self.assertEqual(abs(1234), 1234)
121 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000122 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000123 # float
124 self.assertEqual(abs(0.0), 0.0)
125 self.assertEqual(abs(3.14), 3.14)
126 self.assertEqual(abs(-3.14), 3.14)
127 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000128 self.assertEqual(abs(0), 0)
129 self.assertEqual(abs(1234), 1234)
130 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000131 # str
132 self.assertRaises(TypeError, abs, 'a')
133
Raymond Hettinger96229b12005-03-11 06:49:40 +0000134 def test_all(self):
135 self.assertEqual(all([2, 4, 6]), True)
136 self.assertEqual(all([2, None, 6]), False)
137 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
138 self.assertRaises(RuntimeError, all, TestFailingIter())
139 self.assertRaises(TypeError, all, 10) # Non-iterable
140 self.assertRaises(TypeError, all) # No args
141 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
142 self.assertEqual(all([]), True) # Empty iterator
143 S = [50, 60]
144 self.assertEqual(all(x > 42 for x in S), True)
145 S = [50, 40, 60]
146 self.assertEqual(all(x > 42 for x in S), False)
147
148 def test_any(self):
149 self.assertEqual(any([None, None, None]), False)
150 self.assertEqual(any([None, 4, None]), True)
151 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
152 self.assertRaises(RuntimeError, all, TestFailingIter())
153 self.assertRaises(TypeError, any, 10) # Non-iterable
154 self.assertRaises(TypeError, any) # No args
155 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
156 self.assertEqual(any([]), False) # Empty iterator
157 S = [40, 60, 30]
158 self.assertEqual(any(x > 42 for x in S), True)
159 S = [10, 20, 30]
160 self.assertEqual(any(x > 42 for x in S), False)
161
Thomas Wouters89f507f2006-12-13 04:49:30 +0000162 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000163 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000164 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000165 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000166
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000167 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000168 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000169 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000171 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000172 class C:
173 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000174 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000175 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000176 self.assert_(hasattr(x.meth, '__call__'))
177 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000178 class D(C):
179 def __call__(self): pass
180 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000181 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 y()
183
184 def test_chr(self):
185 self.assertEqual(chr(32), ' ')
186 self.assertEqual(chr(65), 'A')
187 self.assertEqual(chr(97), 'a')
188 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000189 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000190 self.assertEqual(chr(sys.maxunicode),
191 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
192 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000194 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
195 self.assertEqual(chr(0x00010000), "\U00010000")
196 self.assertEqual(chr(0x00010001), "\U00010001")
197 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
198 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
199 self.assertEqual(chr(0x00100000), "\U00100000")
200 self.assertEqual(chr(0x00100001), "\U00100001")
201 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
202 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
203 self.assertRaises(ValueError, chr, -1)
204 self.assertRaises(ValueError, chr, 0x00110000)
Walter Dörwald919497e2003-01-19 16:23:59 +0000205
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000206 def test_cmp(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000207 self.assertEqual(cmp(-1, 1), -1)
208 self.assertEqual(cmp(1, -1), 1)
209 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000210 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 a = []; a.append(a)
212 b = []; b.append(b)
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000213 from collections import UserList
Walter Dörwald919497e2003-01-19 16:23:59 +0000214 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000215 self.assertRaises(RuntimeError, cmp, a, b)
216 self.assertRaises(RuntimeError, cmp, b, c)
217 self.assertRaises(RuntimeError, cmp, c, a)
218 self.assertRaises(RuntimeError, cmp, a, c)
219 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 a.pop(); b.pop(); c.pop()
221 self.assertRaises(TypeError, cmp)
222
Walter Dörwald919497e2003-01-19 16:23:59 +0000223 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000224 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000225 bom = b'\xef\xbb\xbf'
226 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227 compile(source='pass', filename='?', mode='exec')
228 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
229 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000230 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000231 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
232 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000233 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
235 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000236 compile('print("\xe5")\n', '', 'exec')
237 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
238 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000239
Walter Dörwald919497e2003-01-19 16:23:59 +0000240 def test_delattr(self):
241 import sys
242 sys.spam = 1
243 delattr(sys, 'spam')
244 self.assertRaises(TypeError, delattr)
245
246 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000247 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 self.assertRaises(TypeError, dir, 42, 42)
249
Georg Brandle32b4222007-03-10 22:13:27 +0000250 # dir() - local scope
251 local_var = 1
252 self.assert_('local_var' in dir())
253
254 # dir(module)
255 import sys
256 self.assert_('exit' in dir(sys))
257
258 # dir(module_with_invalid__dict__)
259 import types
260 class Foo(types.ModuleType):
261 __dict__ = 8
262 f = Foo("foo")
263 self.assertRaises(TypeError, dir, f)
264
265 # dir(type)
266 self.assert_("strip" in dir(str))
267 self.assert_("__mro__" not in dir(str))
268
269 # dir(obj)
270 class Foo(object):
271 def __init__(self):
272 self.x = 7
273 self.y = 8
274 self.z = 9
275 f = Foo()
276 self.assert_("y" in dir(f))
277
278 # dir(obj_no__dict__)
279 class Foo(object):
280 __slots__ = []
281 f = Foo()
282 self.assert_("__repr__" in dir(f))
283
284 # dir(obj_no__class__with__dict__)
285 # (an ugly trick to cause getattr(f, "__class__") to fail)
286 class Foo(object):
287 __slots__ = ["__class__", "__dict__"]
288 def __init__(self):
289 self.bar = "wow"
290 f = Foo()
291 self.assert_("__repr__" not in dir(f))
292 self.assert_("bar" in dir(f))
293
294 # dir(obj_using __dir__)
295 class Foo(object):
296 def __dir__(self):
297 return ["kan", "ga", "roo"]
298 f = Foo()
299 self.assert_(dir(f) == ["ga", "kan", "roo"])
300
301 # dir(obj__dir__not_list)
302 class Foo(object):
303 def __dir__(self):
304 return 7
305 f = Foo()
306 self.assertRaises(TypeError, dir, f)
307
Collin Winter3eed7652007-08-14 17:53:54 +0000308 # dir(traceback)
309 try:
310 raise IndexError
311 except:
312 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
313
314
Walter Dörwald919497e2003-01-19 16:23:59 +0000315 def test_divmod(self):
316 self.assertEqual(divmod(12, 7), (1, 5))
317 self.assertEqual(divmod(-12, 7), (-2, 2))
318 self.assertEqual(divmod(12, -7), (-2, -2))
319 self.assertEqual(divmod(-12, -7), (1, -5))
320
Guido van Rossume2a383d2007-01-15 16:59:06 +0000321 self.assertEqual(divmod(12, 7), (1, 5))
322 self.assertEqual(divmod(-12, 7), (-2, 2))
323 self.assertEqual(divmod(12, -7), (-2, -2))
324 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000325
Guido van Rossume2a383d2007-01-15 16:59:06 +0000326 self.assertEqual(divmod(12, 7), (1, 5))
327 self.assertEqual(divmod(-12, 7), (-2, 2))
328 self.assertEqual(divmod(12, -7), (-2, -2))
329 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000330
Christian Heimesa37d4c62007-12-04 23:02:19 +0000331 self.assertEqual(divmod(-sys.maxsize-1, -1),
332 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000333
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
335 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
336 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
337 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
338
339 self.assertRaises(TypeError, divmod)
340
341 def test_eval(self):
342 self.assertEqual(eval('1+1'), 2)
343 self.assertEqual(eval(' 1+1\n'), 2)
344 globals = {'a': 1, 'b': 2}
345 locals = {'b': 200, 'c': 300}
346 self.assertEqual(eval('a', globals) , 1)
347 self.assertEqual(eval('a', globals, locals), 1)
348 self.assertEqual(eval('b', globals, locals), 200)
349 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000350 globals = {'a': 1, 'b': 2}
351 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000352 bom = b'\xef\xbb\xbf'
353 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000354 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 self.assertRaises(TypeError, eval)
356 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000357 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000358
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000359 def test_general_eval(self):
360 # Tests that general mappings can be used for the locals argument
361
362 class M:
363 "Test mapping interface versus possible calls from eval()."
364 def __getitem__(self, key):
365 if key == 'a':
366 return 12
367 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000368 def keys(self):
369 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000370
371 m = M()
372 g = globals()
373 self.assertEqual(eval('a', g, m), 12)
374 self.assertRaises(NameError, eval, 'b', g, m)
375 self.assertEqual(eval('dir()', g, m), list('xyz'))
376 self.assertEqual(eval('globals()', g, m), g)
377 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000378 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000379 class A:
380 "Non-mapping"
381 pass
382 m = A()
383 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000384
385 # Verify that dict subclasses work as well
386 class D(dict):
387 def __getitem__(self, key):
388 if key == 'a':
389 return 12
390 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000391 def keys(self):
392 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000393
394 d = D()
395 self.assertEqual(eval('a', g, d), 12)
396 self.assertRaises(NameError, eval, 'b', g, d)
397 self.assertEqual(eval('dir()', g, d), list('xyz'))
398 self.assertEqual(eval('globals()', g, d), g)
399 self.assertEqual(eval('locals()', g, d), d)
400
401 # Verify locals stores (used by list comps)
402 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000403 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000404
405 class SpreadSheet:
406 "Sample application showing nested, calculated lookups."
407 _cells = {}
408 def __setitem__(self, key, formula):
409 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000410 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000411 return eval(self._cells[key], globals(), self)
412
413 ss = SpreadSheet()
414 ss['a1'] = '5'
415 ss['a2'] = 'a1*6'
416 ss['a3'] = 'a2*7'
417 self.assertEqual(ss['a3'], 210)
418
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000419 # Verify that dir() catches a non-list returned by eval
420 # SF bug #1004669
421 class C:
422 def __getitem__(self, item):
423 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000424 def keys(self):
425 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000426 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
427
Georg Brandl7cae87c2006-09-06 06:51:57 +0000428 def test_exec(self):
429 g = {}
430 exec('z = 1', g)
431 if '__builtins__' in g:
432 del g['__builtins__']
433 self.assertEqual(g, {'z': 1})
434
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000435 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000436 if '__builtins__' in g:
437 del g['__builtins__']
438 self.assertEqual(g, {'z': 2})
439 g = {}
440 l = {}
441
442 import warnings
443 warnings.filterwarnings("ignore", "global statement", module="<string>")
444 exec('global a; a = 1; b = 2', g, l)
445 if '__builtins__' in g:
446 del g['__builtins__']
447 if '__builtins__' in l:
448 del l['__builtins__']
449 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
450
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000451 def test_exec_redirected(self):
452 savestdout = sys.stdout
453 sys.stdout = None # Whatever that cannot flush()
454 try:
455 # Used to raise SystemError('error return without exception set')
456 exec('a')
457 except NameError:
458 pass
459 finally:
460 sys.stdout = savestdout
461
Walter Dörwald919497e2003-01-19 16:23:59 +0000462 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000463 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
464 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
465 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
466 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
467 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000468 def identity(item):
469 return 1
470 filter(identity, Squares(5))
471 self.assertRaises(TypeError, filter)
472 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000473 def __getitem__(self, index):
474 if index<4:
475 return 42
476 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000477 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000478 def badfunc():
479 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000480 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000481
Walter Dörwaldbf517072003-01-27 15:57:14 +0000482 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000483 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
484 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
485 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000486
Walter Dörwald919497e2003-01-19 16:23:59 +0000487 def test_getattr(self):
488 import sys
489 self.assert_(getattr(sys, 'stdout') is sys.stdout)
490 self.assertRaises(TypeError, getattr, sys, 1)
491 self.assertRaises(TypeError, getattr, sys, 1, "foo")
492 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000493 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000494
495 def test_hasattr(self):
496 import sys
497 self.assert_(hasattr(sys, 'stdout'))
498 self.assertRaises(TypeError, hasattr, sys, 1)
499 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000500 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000501
502 def test_hash(self):
503 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000504 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000505 self.assertEqual(hash(1), hash(1.0))
506 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000507 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 hash((0,1,2,3))
509 def f(): pass
510 self.assertRaises(TypeError, hash, [])
511 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000512 # Bug 1536021: Allow hash to return long objects
513 class X:
514 def __hash__(self):
515 return 2**100
516 self.assertEquals(type(hash(X())), int)
517 class Y(object):
518 def __hash__(self):
519 return 2**100
520 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000521 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000522 def __hash__(self):
523 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000524 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000525
526 def test_hex(self):
527 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000528 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000529 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000530 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000531 self.assertRaises(TypeError, hex, {})
532
533 def test_id(self):
534 id(None)
535 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000536 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000537 id(1.0)
538 id('spam')
539 id((0,1,2,3))
540 id([0,1,2,3])
541 id({'spam': 1, 'eggs': 2, 'ham': 3})
542
Guido van Rossuma88a0332007-02-26 16:59:55 +0000543 # Test input() later, alphabetized as if it were raw_input
544
Walter Dörwald919497e2003-01-19 16:23:59 +0000545 def test_iter(self):
546 self.assertRaises(TypeError, iter)
547 self.assertRaises(TypeError, iter, 42, 42)
548 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000549 for l in lists:
550 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000551 self.assertEqual(next(i), '1')
552 self.assertEqual(next(i), '2')
553 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000554
555 def test_isinstance(self):
556 class C:
557 pass
558 class D(C):
559 pass
560 class E:
561 pass
562 c = C()
563 d = D()
564 e = E()
565 self.assert_(isinstance(c, C))
566 self.assert_(isinstance(d, C))
567 self.assert_(not isinstance(e, C))
568 self.assert_(not isinstance(c, D))
569 self.assert_(not isinstance('foo', E))
570 self.assertRaises(TypeError, isinstance, E, 'foo')
571 self.assertRaises(TypeError, isinstance)
572
573 def test_issubclass(self):
574 class C:
575 pass
576 class D(C):
577 pass
578 class E:
579 pass
580 c = C()
581 d = D()
582 e = E()
583 self.assert_(issubclass(D, C))
584 self.assert_(issubclass(C, C))
585 self.assert_(not issubclass(C, D))
586 self.assertRaises(TypeError, issubclass, 'foo', E)
587 self.assertRaises(TypeError, issubclass, E, 'foo')
588 self.assertRaises(TypeError, issubclass)
589
590 def test_len(self):
591 self.assertEqual(len('123'), 3)
592 self.assertEqual(len(()), 0)
593 self.assertEqual(len((1, 2, 3, 4)), 4)
594 self.assertEqual(len([1, 2, 3, 4]), 4)
595 self.assertEqual(len({}), 0)
596 self.assertEqual(len({'a':1, 'b': 2}), 2)
597 class BadSeq:
598 def __len__(self):
599 raise ValueError
600 self.assertRaises(ValueError, len, BadSeq())
601
Walter Dörwald919497e2003-01-19 16:23:59 +0000602 def test_map(self):
603 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000604 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000605 [1, 4, 9]
606 )
607 try:
608 from math import sqrt
609 except ImportError:
610 def sqrt(x):
611 return pow(x, 0.5)
612 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000613 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000614 [[4.0, 2.0], [9.0, 3.0]]
615 )
616 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000617 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000618 [10, 4, 6]
619 )
620
621 def plus(*v):
622 accu = 0
623 for i in v: accu = accu + i
624 return accu
625 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000626 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 [1, 3, 7]
628 )
629 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000630 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000631 [1+4, 3+9, 7+2]
632 )
633 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000634 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000635 [1+4+1, 3+9+1, 7+2+0]
636 )
637 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000638 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000639 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
640 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000641 def Max(a, b):
642 if a is None:
643 return b
644 if b is None:
645 return a
646 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000648 list(map(Max, Squares(3), Squares(2))),
649 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000650 )
651 self.assertRaises(TypeError, map)
652 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000653 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000654 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000656 yield None
657 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000658 def badfunc(x):
659 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000660 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000661
662 def test_max(self):
663 self.assertEqual(max('123123'), '3')
664 self.assertEqual(max(1, 2, 3), 3)
665 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
666 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
667
Guido van Rossume2a383d2007-01-15 16:59:06 +0000668 self.assertEqual(max(1, 2, 3.0), 3.0)
669 self.assertEqual(max(1, 2.0, 3), 3)
670 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000671
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000672 for stmt in (
673 "max(key=int)", # no args
674 "max(1, key=int)", # single arg not iterable
675 "max(1, 2, keystone=int)", # wrong keyword
676 "max(1, 2, key=int, abc=int)", # two many keywords
677 "max(1, 2, key=1)", # keyfunc is not callable
678 ):
Tim Peters7f061872004-12-07 21:17:46 +0000679 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000680 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000681 except TypeError:
682 pass
683 else:
684 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000685
686 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
687 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
688 self.assertEqual(max(1, 2, key=neg), 1) # two elems
689
690 data = [random.randrange(200) for i in range(100)]
691 keys = dict((elem, random.randrange(50)) for elem in data)
692 f = keys.__getitem__
693 self.assertEqual(max(data, key=f),
694 sorted(reversed(data), key=f)[-1])
695
Walter Dörwald919497e2003-01-19 16:23:59 +0000696 def test_min(self):
697 self.assertEqual(min('123123'), '1')
698 self.assertEqual(min(1, 2, 3), 1)
699 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
700 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
701
Guido van Rossume2a383d2007-01-15 16:59:06 +0000702 self.assertEqual(min(1, 2, 3.0), 1)
703 self.assertEqual(min(1, 2.0, 3), 1)
704 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000705
706 self.assertRaises(TypeError, min)
707 self.assertRaises(TypeError, min, 42)
708 self.assertRaises(ValueError, min, ())
709 class BadSeq:
710 def __getitem__(self, index):
711 raise ValueError
712 self.assertRaises(ValueError, min, BadSeq())
713 class BadNumber:
714 def __cmp__(self, other):
715 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000716 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000717
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000718 for stmt in (
719 "min(key=int)", # no args
720 "min(1, key=int)", # single arg not iterable
721 "min(1, 2, keystone=int)", # wrong keyword
722 "min(1, 2, key=int, abc=int)", # two many keywords
723 "min(1, 2, key=1)", # keyfunc is not callable
724 ):
Tim Peters7f061872004-12-07 21:17:46 +0000725 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000726 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000727 except TypeError:
728 pass
729 else:
730 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000731
732 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
733 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
734 self.assertEqual(min(1, 2, key=neg), 2) # two elems
735
736 data = [random.randrange(200) for i in range(100)]
737 keys = dict((elem, random.randrange(50)) for elem in data)
738 f = keys.__getitem__
739 self.assertEqual(min(data, key=f),
740 sorted(data, key=f)[0])
741
Georg Brandla18af4e2007-04-21 15:47:16 +0000742 def test_next(self):
743 it = iter(range(2))
744 self.assertEqual(next(it), 0)
745 self.assertEqual(next(it), 1)
746 self.assertRaises(StopIteration, next, it)
747 self.assertRaises(StopIteration, next, it)
748 self.assertEquals(next(it, 42), 42)
749
750 class Iter(object):
751 def __iter__(self):
752 return self
753 def __next__(self):
754 raise StopIteration
755
756 it = iter(Iter())
757 self.assertEquals(next(it, 42), 42)
758 self.assertRaises(StopIteration, next, it)
759
760 def gen():
761 yield 1
762 return
763
764 it = gen()
765 self.assertEquals(next(it), 1)
766 self.assertRaises(StopIteration, next, it)
767 self.assertEquals(next(it, 42), 42)
768
Walter Dörwald919497e2003-01-19 16:23:59 +0000769 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000770 self.assertEqual(oct(100), '0o144')
771 self.assertEqual(oct(100), '0o144')
772 self.assertEqual(oct(-100), '-0o144')
773 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000774 self.assertRaises(TypeError, oct, ())
775
776 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000777 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000778 fp = open(TESTFN, 'w')
779 try:
780 fp.write('1+1\n')
781 fp.write('1+1\n')
782 fp.write('The quick brown fox jumps over the lazy dog')
783 fp.write('.\n')
784 fp.write('Dear John\n')
785 fp.write('XXX'*100)
786 fp.write('YYY'*100)
787 finally:
788 fp.close()
789
790 def test_open(self):
791 self.write_testfile()
792 fp = open(TESTFN, 'r')
793 try:
794 self.assertEqual(fp.readline(4), '1+1\n')
795 self.assertEqual(fp.readline(4), '1+1\n')
796 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
797 self.assertEqual(fp.readline(4), 'Dear')
798 self.assertEqual(fp.readline(100), ' John\n')
799 self.assertEqual(fp.read(300), 'XXX'*100)
800 self.assertEqual(fp.read(1000), 'YYY'*100)
801 finally:
802 fp.close()
803 unlink(TESTFN)
804
805 def test_ord(self):
806 self.assertEqual(ord(' '), 32)
807 self.assertEqual(ord('A'), 65)
808 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000809 self.assertEqual(ord('\x80'), 128)
810 self.assertEqual(ord('\xff'), 255)
811
812 self.assertEqual(ord(b' '), 32)
813 self.assertEqual(ord(b'A'), 65)
814 self.assertEqual(ord(b'a'), 97)
815 self.assertEqual(ord(b'\x80'), 128)
816 self.assertEqual(ord(b'\xff'), 255)
817
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000818 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000819 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000820
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000821 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
822 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
823 self.assertEqual(ord("\U00010000"), 0x00010000)
824 self.assertEqual(ord("\U00010001"), 0x00010001)
825 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
826 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
827 self.assertEqual(ord("\U00100000"), 0x00100000)
828 self.assertEqual(ord("\U00100001"), 0x00100001)
829 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
830 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
831
Walter Dörwald919497e2003-01-19 16:23:59 +0000832 def test_pow(self):
833 self.assertEqual(pow(0,0), 1)
834 self.assertEqual(pow(0,1), 0)
835 self.assertEqual(pow(1,0), 1)
836 self.assertEqual(pow(1,1), 1)
837
838 self.assertEqual(pow(2,0), 1)
839 self.assertEqual(pow(2,10), 1024)
840 self.assertEqual(pow(2,20), 1024*1024)
841 self.assertEqual(pow(2,30), 1024*1024*1024)
842
843 self.assertEqual(pow(-2,0), 1)
844 self.assertEqual(pow(-2,1), -2)
845 self.assertEqual(pow(-2,2), 4)
846 self.assertEqual(pow(-2,3), -8)
847
Guido van Rossume2a383d2007-01-15 16:59:06 +0000848 self.assertEqual(pow(0,0), 1)
849 self.assertEqual(pow(0,1), 0)
850 self.assertEqual(pow(1,0), 1)
851 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000852
Guido van Rossume2a383d2007-01-15 16:59:06 +0000853 self.assertEqual(pow(2,0), 1)
854 self.assertEqual(pow(2,10), 1024)
855 self.assertEqual(pow(2,20), 1024*1024)
856 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000857
Guido van Rossume2a383d2007-01-15 16:59:06 +0000858 self.assertEqual(pow(-2,0), 1)
859 self.assertEqual(pow(-2,1), -2)
860 self.assertEqual(pow(-2,2), 4)
861 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000862
863 self.assertAlmostEqual(pow(0.,0), 1.)
864 self.assertAlmostEqual(pow(0.,1), 0.)
865 self.assertAlmostEqual(pow(1.,0), 1.)
866 self.assertAlmostEqual(pow(1.,1), 1.)
867
868 self.assertAlmostEqual(pow(2.,0), 1.)
869 self.assertAlmostEqual(pow(2.,10), 1024.)
870 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
871 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
872
873 self.assertAlmostEqual(pow(-2.,0), 1.)
874 self.assertAlmostEqual(pow(-2.,1), -2.)
875 self.assertAlmostEqual(pow(-2.,2), 4.)
876 self.assertAlmostEqual(pow(-2.,3), -8.)
877
Guido van Rossume2a383d2007-01-15 16:59:06 +0000878 for x in 2, 2, 2.0:
879 for y in 10, 10, 10.0:
880 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000881 if isinstance(x, float) or \
882 isinstance(y, float) or \
883 isinstance(z, float):
884 self.assertRaises(TypeError, pow, x, y, z)
885 else:
886 self.assertAlmostEqual(pow(x, y, z), 24.0)
887
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000888 self.assertAlmostEqual(pow(-1, 0.5), 1j)
889 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
890
Walter Dörwald919497e2003-01-19 16:23:59 +0000891 self.assertRaises(TypeError, pow, -1, -2, 3)
892 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000893 self.assertRaises(TypeError, pow, -1, -2, 3)
894 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000895
896 self.assertRaises(TypeError, pow)
897
898 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000899 self.assertEqual(list(range(3)), [0, 1, 2])
900 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
901 self.assertEqual(list(range(0)), [])
902 self.assertEqual(list(range(-3)), [])
903 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
904 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000905
Guido van Rossum805365e2007-05-07 22:24:25 +0000906 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000907 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000908 self.assertEqual(list(range(-2**100)), [])
909 self.assertEqual(list(range(0, -2**100)), [])
910 self.assertEqual(list(range(0, 2**100, -1)), [])
911 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000912
Christian Heimesa37d4c62007-12-04 23:02:19 +0000913 a = int(10 * sys.maxsize)
914 b = int(100 * sys.maxsize)
915 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000916
Guido van Rossum805365e2007-05-07 22:24:25 +0000917 self.assertEqual(list(range(a, a+2)), [a, a+1])
918 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
919 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000920
Guido van Rossum805365e2007-05-07 22:24:25 +0000921 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000922 self.assert_(a in seq)
923 self.assert_(b not in seq)
924 self.assertEqual(len(seq), 2)
925
Guido van Rossum805365e2007-05-07 22:24:25 +0000926 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000927 self.assert_(b in seq)
928 self.assert_(a not in seq)
929 self.assertEqual(len(seq), 2)
930
Guido van Rossum805365e2007-05-07 22:24:25 +0000931 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000932 self.assert_(-a in seq)
933 self.assert_(-b not in seq)
934 self.assertEqual(len(seq), 2)
935
Walter Dörwald919497e2003-01-19 16:23:59 +0000936 self.assertRaises(TypeError, range)
937 self.assertRaises(TypeError, range, 1, 2, 3, 4)
938 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000939 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000940
941 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000942 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000943 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000944 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
945
946 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000947 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000948 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000949
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000950 # Reject floats when it would require PyLongs to represent.
951 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000952 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000953
Walter Dörwald357981e2003-04-15 18:59:28 +0000954 self.assertRaises(TypeError, range, 0, "spam")
955 self.assertRaises(TypeError, range, 0, 42, "spam")
956
Christian Heimesa37d4c62007-12-04 23:02:19 +0000957 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
958 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000959
Christian Heimesa37d4c62007-12-04 23:02:19 +0000960 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000961
Guido van Rossuma88a0332007-02-26 16:59:55 +0000962 def test_input(self):
963 self.write_testfile()
964 fp = open(TESTFN, 'r')
965 savestdin = sys.stdin
966 savestdout = sys.stdout # Eats the echo
967 try:
968 sys.stdin = fp
969 sys.stdout = BitBucket()
970 self.assertEqual(input(), "1+1")
971 self.assertEqual(input('testing\n'), "1+1")
972 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
973 self.assertEqual(input('testing\n'), 'Dear John')
974
975 # SF 1535165: don't segfault on closed stdin
976 # sys.stdout must be a regular file for triggering
977 sys.stdout = savestdout
978 sys.stdin.close()
979 self.assertRaises(ValueError, input)
980
981 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000982 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000983 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000984 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000985 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000986 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000987 self.assertRaises(EOFError, input)
988
989 del sys.stdout
990 self.assertRaises(RuntimeError, input, 'prompt')
991 del sys.stdin
992 self.assertRaises(RuntimeError, input, 'prompt')
993 finally:
994 sys.stdin = savestdin
995 sys.stdout = savestdout
996 fp.close()
997 unlink(TESTFN)
998
Walter Dörwald919497e2003-01-19 16:23:59 +0000999 def test_repr(self):
1000 self.assertEqual(repr(''), '\'\'')
1001 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001002 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001003 self.assertEqual(repr(()), '()')
1004 self.assertEqual(repr([]), '[]')
1005 self.assertEqual(repr({}), '{}')
1006 a = []
1007 a.append(a)
1008 self.assertEqual(repr(a), '[[...]]')
1009 a = {}
1010 a[0] = a
1011 self.assertEqual(repr(a), '{0: {...}}')
1012
1013 def test_round(self):
1014 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001015 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001016 self.assertEqual(round(1.0), 1.0)
1017 self.assertEqual(round(10.0), 10.0)
1018 self.assertEqual(round(1000000000.0), 1000000000.0)
1019 self.assertEqual(round(1e20), 1e20)
1020
1021 self.assertEqual(round(-1.0), -1.0)
1022 self.assertEqual(round(-10.0), -10.0)
1023 self.assertEqual(round(-1000000000.0), -1000000000.0)
1024 self.assertEqual(round(-1e20), -1e20)
1025
1026 self.assertEqual(round(0.1), 0.0)
1027 self.assertEqual(round(1.1), 1.0)
1028 self.assertEqual(round(10.1), 10.0)
1029 self.assertEqual(round(1000000000.1), 1000000000.0)
1030
1031 self.assertEqual(round(-1.1), -1.0)
1032 self.assertEqual(round(-10.1), -10.0)
1033 self.assertEqual(round(-1000000000.1), -1000000000.0)
1034
1035 self.assertEqual(round(0.9), 1.0)
1036 self.assertEqual(round(9.9), 10.0)
1037 self.assertEqual(round(999999999.9), 1000000000.0)
1038
1039 self.assertEqual(round(-0.9), -1.0)
1040 self.assertEqual(round(-9.9), -10.0)
1041 self.assertEqual(round(-999999999.9), -1000000000.0)
1042
1043 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001044 self.assertEqual(type(round(-8.0, -1)), float)
1045
1046 self.assertEqual(type(round(-8.0, 0)), float)
1047 self.assertEqual(type(round(-8.0, 1)), float)
1048
1049 # Check even / odd rounding behaviour
1050 self.assertEqual(round(5.5), 6)
1051 self.assertEqual(round(6.5), 6)
1052 self.assertEqual(round(-5.5), -6)
1053 self.assertEqual(round(-6.5), -6)
1054
1055 # Check behavior on ints
1056 self.assertEqual(round(0), 0)
1057 self.assertEqual(round(8), 8)
1058 self.assertEqual(round(-8), -8)
1059 self.assertEqual(type(round(0)), int)
1060 self.assertEqual(type(round(-8, -1)), float)
1061 self.assertEqual(type(round(-8, 0)), float)
1062 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001063
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 # test new kwargs
1065 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1066
Walter Dörwald919497e2003-01-19 16:23:59 +00001067 self.assertRaises(TypeError, round)
1068
Alex Martelliae211f92007-08-22 23:21:33 +00001069 # test generic rounding delegation for reals
1070 class TestRound:
1071 def __round__(self):
1072 return 23
1073
1074 class TestNoRound:
1075 pass
1076
1077 self.assertEqual(round(TestRound()), 23)
1078
1079 self.assertRaises(TypeError, round, 1, 2, 3)
1080 self.assertRaises(TypeError, round, TestNoRound())
1081
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001082 t = TestNoRound()
1083 t.__round__ = lambda *args: args
1084 self.assertRaises(TypeError, round, t)
1085 self.assertRaises(TypeError, round, t, 0)
1086
Walter Dörwald919497e2003-01-19 16:23:59 +00001087 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001088 setattr(sys, 'spam', 1)
1089 self.assertEqual(sys.spam, 1)
1090 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1091 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001092
Walter Dörwald919497e2003-01-19 16:23:59 +00001093
Alex Martellia70b1912003-04-22 08:12:33 +00001094 def test_sum(self):
1095 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001096 self.assertEqual(sum(list(range(2,8))), 27)
1097 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001098 self.assertEqual(sum(Squares(10)), 285)
1099 self.assertEqual(sum(iter(Squares(10))), 285)
1100 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1101
1102 self.assertRaises(TypeError, sum)
1103 self.assertRaises(TypeError, sum, 42)
1104 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1105 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1106 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1107 self.assertRaises(TypeError, sum, [{2:3}])
1108 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1109
1110 class BadSeq:
1111 def __getitem__(self, index):
1112 raise ValueError
1113 self.assertRaises(ValueError, sum, BadSeq())
1114
Walter Dörwald919497e2003-01-19 16:23:59 +00001115 def test_type(self):
1116 self.assertEqual(type(''), type('123'))
1117 self.assertNotEqual(type(''), type(()))
1118
Guido van Rossumfee7b932005-01-16 00:21:28 +00001119 # We don't want self in vars(), so these are static methods
1120
1121 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001122 def get_vars_f0():
1123 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001124
Guido van Rossumfee7b932005-01-16 00:21:28 +00001125 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001126 def get_vars_f2():
1127 BuiltinTest.get_vars_f0()
1128 a = 1
1129 b = 2
1130 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001131
1132 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001133 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001134 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001135 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001136 self.assertEqual(self.get_vars_f0(), {})
1137 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1138 self.assertRaises(TypeError, vars, 42, 42)
1139 self.assertRaises(TypeError, vars, 42)
1140
1141 def test_zip(self):
1142 a = (1, 2, 3)
1143 b = (4, 5, 6)
1144 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001145 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001146 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001147 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001148 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001149 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001150 class I:
1151 def __getitem__(self, i):
1152 if i < 0 or i > 2: raise IndexError
1153 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001154 self.assertEqual(list(zip(a, I())), t)
1155 self.assertEqual(list(zip()), [])
1156 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 self.assertRaises(TypeError, zip, None)
1158 class G:
1159 pass
1160 self.assertRaises(TypeError, zip, a, G())
1161
1162 # Make sure zip doesn't try to allocate a billion elements for the
1163 # result list when one of its arguments doesn't say how long it is.
1164 # A MemoryError is the most likely failure mode.
1165 class SequenceWithoutALength:
1166 def __getitem__(self, i):
1167 if i == 5:
1168 raise IndexError
1169 else:
1170 return i
1171 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001172 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001173 list(enumerate(range(5)))
1174 )
1175
1176 class BadSeq:
1177 def __getitem__(self, i):
1178 if i == 5:
1179 raise ValueError
1180 else:
1181 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001182 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001183
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001184 def test_bin(self):
1185 self.assertEqual(bin(0), '0b0')
1186 self.assertEqual(bin(1), '0b1')
1187 self.assertEqual(bin(-1), '-0b1')
1188 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1189 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1190 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1191 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1192
Raymond Hettinger64958a12003-12-17 20:43:33 +00001193class TestSorted(unittest.TestCase):
1194
1195 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001196 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001197 copy = data[:]
1198 random.shuffle(copy)
1199 self.assertEqual(data, sorted(copy))
1200 self.assertNotEqual(data, copy)
1201
1202 data.reverse()
1203 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001204 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1205 self.assertNotEqual(data, copy)
1206 random.shuffle(copy)
1207 self.assertEqual(data, sorted(copy, reverse=1))
1208 self.assertNotEqual(data, copy)
1209
1210 def test_inputtypes(self):
1211 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001212 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001213 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001214 self.assertEqual(sorted(s), sorted(T(s)))
1215
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001216 s = ''.join(set(s)) # unique letters only
1217 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001218 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001219 self.assertEqual(sorted(s), sorted(T(s)))
1220
1221 def test_baddecorator(self):
1222 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1223 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1224
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001225def test_main(verbose=None):
1226 test_classes = (BuiltinTest, TestSorted)
1227
1228 run_unittest(*test_classes)
1229
1230 # verify reference counting
1231 if verbose and hasattr(sys, "gettotalrefcount"):
1232 import gc
1233 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001234 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001235 run_unittest(*test_classes)
1236 gc.collect()
1237 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001238 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001239
Walter Dörwald919497e2003-01-19 16:23:59 +00001240
1241if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001242 test_main(verbose=True)