blob: a62e1244c2d632abd8172aaa04b4f43bcb3ed59b [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003import test.support, unittest
4from test.support import fcmp, TESTFN, unlink, run_unittest, \
Walter Dörwald1f5947b2007-05-22 16:52:54 +00005 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")
Mark Dickinsona56c4672009-01-27 18:17:45 +000013import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000014
Walter Dörwald919497e2003-01-19 16:23:59 +000015class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000016
Walter Dörwald919497e2003-01-19 16:23:59 +000017 def __init__(self, max):
18 self.max = max
19 self.sofar = []
20
21 def __len__(self): return len(self.sofar)
22
23 def __getitem__(self, i):
24 if not 0 <= i < self.max: raise IndexError
25 n = len(self.sofar)
26 while n <= i:
27 self.sofar.append(n*n)
28 n += 1
29 return self.sofar[i]
30
31class StrSquares:
32
33 def __init__(self, max):
34 self.max = max
35 self.sofar = []
36
37 def __len__(self):
38 return len(self.sofar)
39
40 def __getitem__(self, i):
41 if not 0 <= i < self.max:
42 raise IndexError
43 n = len(self.sofar)
44 while n <= i:
45 self.sofar.append(str(n*n))
46 n += 1
47 return self.sofar[i]
48
49class BitBucket:
50 def write(self, line):
51 pass
52
Facundo Batista2336bdd2008-01-19 19:12:01 +000053test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000054 ('0', 0),
55 ('1', 1),
56 ('9', 9),
57 ('10', 10),
58 ('99', 99),
59 ('100', 100),
60 ('314', 314),
61 (' 314', 314),
62 ('314 ', 314),
63 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000064 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000065 (' 1x', ValueError),
66 (' 1 ', 1),
67 (' 1\02 ', ValueError),
68 ('', ValueError),
69 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000070 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000071 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000072 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000073]
74
Facundo Batista2336bdd2008-01-19 19:12:01 +000075test_conv_sign = [
76 ('0', 0),
77 ('1', 1),
78 ('9', 9),
79 ('10', 10),
80 ('99', 99),
81 ('100', 100),
82 ('314', 314),
83 (' 314', ValueError),
84 ('314 ', 314),
85 (' \t\t 314 \t\t ', ValueError),
86 (repr(sys.maxsize), sys.maxsize),
87 (' 1x', ValueError),
88 (' 1 ', ValueError),
89 (' 1\02 ', ValueError),
90 ('', ValueError),
91 (' ', ValueError),
92 (' \t\t ', ValueError),
93 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
94 (chr(0x200), ValueError),
95]
96
Raymond Hettinger96229b12005-03-11 06:49:40 +000097class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000098 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000099 raise RuntimeError
100
101class TestFailingIter:
102 def __iter__(self):
103 raise RuntimeError
104
Walter Dörwald919497e2003-01-19 16:23:59 +0000105class BuiltinTest(unittest.TestCase):
106
107 def test_import(self):
108 __import__('sys')
109 __import__('time')
110 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 __import__(name='sys')
112 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000113 self.assertRaises(ImportError, __import__, 'spamspam')
114 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000115 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000116 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000117
118 def test_abs(self):
119 # int
120 self.assertEqual(abs(0), 0)
121 self.assertEqual(abs(1234), 1234)
122 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000123 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000124 # float
125 self.assertEqual(abs(0.0), 0.0)
126 self.assertEqual(abs(3.14), 3.14)
127 self.assertEqual(abs(-3.14), 3.14)
128 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000129 self.assertEqual(abs(0), 0)
130 self.assertEqual(abs(1234), 1234)
131 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000132 # str
133 self.assertRaises(TypeError, abs, 'a')
134
Raymond Hettinger96229b12005-03-11 06:49:40 +0000135 def test_all(self):
136 self.assertEqual(all([2, 4, 6]), True)
137 self.assertEqual(all([2, None, 6]), False)
138 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
139 self.assertRaises(RuntimeError, all, TestFailingIter())
140 self.assertRaises(TypeError, all, 10) # Non-iterable
141 self.assertRaises(TypeError, all) # No args
142 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
143 self.assertEqual(all([]), True) # Empty iterator
144 S = [50, 60]
145 self.assertEqual(all(x > 42 for x in S), True)
146 S = [50, 40, 60]
147 self.assertEqual(all(x > 42 for x in S), False)
148
149 def test_any(self):
150 self.assertEqual(any([None, None, None]), False)
151 self.assertEqual(any([None, 4, None]), True)
152 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
153 self.assertRaises(RuntimeError, all, TestFailingIter())
154 self.assertRaises(TypeError, any, 10) # Non-iterable
155 self.assertRaises(TypeError, any) # No args
156 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
157 self.assertEqual(any([]), False) # Empty iterator
158 S = [40, 60, 30]
159 self.assertEqual(any(x > 42 for x in S), True)
160 S = [10, 20, 30]
161 self.assertEqual(any(x > 42 for x in S), False)
162
Georg Brandl559e5d72008-06-11 18:37:52 +0000163 def test_ascii(self):
164 self.assertEqual(ascii(''), '\'\'')
165 self.assertEqual(ascii(0), '0')
166 self.assertEqual(ascii(0), '0')
167 self.assertEqual(ascii(()), '()')
168 self.assertEqual(ascii([]), '[]')
169 self.assertEqual(ascii({}), '{}')
170 a = []
171 a.append(a)
172 self.assertEqual(ascii(a), '[[...]]')
173 a = {}
174 a[0] = a
175 self.assertEqual(ascii(a), '{0: {...}}')
176
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000179 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000180 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000181
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000182 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000184 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000186 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000187 class C:
188 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000189 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000191 self.assert_(hasattr(x.meth, '__call__'))
192 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 class D(C):
194 def __call__(self): pass
195 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000196 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 y()
198
199 def test_chr(self):
200 self.assertEqual(chr(32), ' ')
201 self.assertEqual(chr(65), 'A')
202 self.assertEqual(chr(97), 'a')
203 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000204 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000205 self.assertEqual(chr(sys.maxunicode),
206 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
207 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000209 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
210 self.assertEqual(chr(0x00010000), "\U00010000")
211 self.assertEqual(chr(0x00010001), "\U00010001")
212 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
213 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
214 self.assertEqual(chr(0x00100000), "\U00100000")
215 self.assertEqual(chr(0x00100001), "\U00100001")
216 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
217 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
218 self.assertRaises(ValueError, chr, -1)
219 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000220 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000221
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000222 def test_cmp(self):
Mark Dickinsonf02e0aa2009-02-01 12:13:56 +0000223 self.assert_(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000224
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000226 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000227 bom = b'\xef\xbb\xbf'
228 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229 compile(source='pass', filename='?', mode='exec')
230 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
231 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000232 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000233 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000234 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
235 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000236 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
238 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000239 compile('print("\xe5")\n', '', 'exec')
240 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
241 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000242
Walter Dörwald919497e2003-01-19 16:23:59 +0000243 def test_delattr(self):
244 import sys
245 sys.spam = 1
246 delattr(sys, 'spam')
247 self.assertRaises(TypeError, delattr)
248
249 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000250 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000251 self.assertRaises(TypeError, dir, 42, 42)
252
Georg Brandle32b4222007-03-10 22:13:27 +0000253 # dir() - local scope
254 local_var = 1
255 self.assert_('local_var' in dir())
256
257 # dir(module)
258 import sys
259 self.assert_('exit' in dir(sys))
260
261 # dir(module_with_invalid__dict__)
262 import types
263 class Foo(types.ModuleType):
264 __dict__ = 8
265 f = Foo("foo")
266 self.assertRaises(TypeError, dir, f)
267
268 # dir(type)
269 self.assert_("strip" in dir(str))
270 self.assert_("__mro__" not in dir(str))
271
272 # dir(obj)
273 class Foo(object):
274 def __init__(self):
275 self.x = 7
276 self.y = 8
277 self.z = 9
278 f = Foo()
279 self.assert_("y" in dir(f))
280
281 # dir(obj_no__dict__)
282 class Foo(object):
283 __slots__ = []
284 f = Foo()
285 self.assert_("__repr__" in dir(f))
286
287 # dir(obj_no__class__with__dict__)
288 # (an ugly trick to cause getattr(f, "__class__") to fail)
289 class Foo(object):
290 __slots__ = ["__class__", "__dict__"]
291 def __init__(self):
292 self.bar = "wow"
293 f = Foo()
294 self.assert_("__repr__" not in dir(f))
295 self.assert_("bar" in dir(f))
296
297 # dir(obj_using __dir__)
298 class Foo(object):
299 def __dir__(self):
300 return ["kan", "ga", "roo"]
301 f = Foo()
302 self.assert_(dir(f) == ["ga", "kan", "roo"])
303
304 # dir(obj__dir__not_list)
305 class Foo(object):
306 def __dir__(self):
307 return 7
308 f = Foo()
309 self.assertRaises(TypeError, dir, f)
310
Collin Winter3eed7652007-08-14 17:53:54 +0000311 # dir(traceback)
312 try:
313 raise IndexError
314 except:
315 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
316
317
Walter Dörwald919497e2003-01-19 16:23:59 +0000318 def test_divmod(self):
319 self.assertEqual(divmod(12, 7), (1, 5))
320 self.assertEqual(divmod(-12, 7), (-2, 2))
321 self.assertEqual(divmod(12, -7), (-2, -2))
322 self.assertEqual(divmod(-12, -7), (1, -5))
323
Guido van Rossume2a383d2007-01-15 16:59:06 +0000324 self.assertEqual(divmod(12, 7), (1, 5))
325 self.assertEqual(divmod(-12, 7), (-2, 2))
326 self.assertEqual(divmod(12, -7), (-2, -2))
327 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000328
Guido van Rossume2a383d2007-01-15 16:59:06 +0000329 self.assertEqual(divmod(12, 7), (1, 5))
330 self.assertEqual(divmod(-12, 7), (-2, 2))
331 self.assertEqual(divmod(12, -7), (-2, -2))
332 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000333
Christian Heimesa37d4c62007-12-04 23:02:19 +0000334 self.assertEqual(divmod(-sys.maxsize-1, -1),
335 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000336
Walter Dörwald919497e2003-01-19 16:23:59 +0000337 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
338 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
339 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
340 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
341
342 self.assertRaises(TypeError, divmod)
343
344 def test_eval(self):
345 self.assertEqual(eval('1+1'), 2)
346 self.assertEqual(eval(' 1+1\n'), 2)
347 globals = {'a': 1, 'b': 2}
348 locals = {'b': 200, 'c': 300}
349 self.assertEqual(eval('a', globals) , 1)
350 self.assertEqual(eval('a', globals, locals), 1)
351 self.assertEqual(eval('b', globals, locals), 200)
352 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000353 globals = {'a': 1, 'b': 2}
354 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000355 bom = b'\xef\xbb\xbf'
356 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000357 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000358 self.assertRaises(TypeError, eval)
359 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000360 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000361
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000362 def test_general_eval(self):
363 # Tests that general mappings can be used for the locals argument
364
365 class M:
366 "Test mapping interface versus possible calls from eval()."
367 def __getitem__(self, key):
368 if key == 'a':
369 return 12
370 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000371 def keys(self):
372 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000373
374 m = M()
375 g = globals()
376 self.assertEqual(eval('a', g, m), 12)
377 self.assertRaises(NameError, eval, 'b', g, m)
378 self.assertEqual(eval('dir()', g, m), list('xyz'))
379 self.assertEqual(eval('globals()', g, m), g)
380 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000381 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000382 class A:
383 "Non-mapping"
384 pass
385 m = A()
386 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000387
388 # Verify that dict subclasses work as well
389 class D(dict):
390 def __getitem__(self, key):
391 if key == 'a':
392 return 12
393 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000394 def keys(self):
395 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000396
397 d = D()
398 self.assertEqual(eval('a', g, d), 12)
399 self.assertRaises(NameError, eval, 'b', g, d)
400 self.assertEqual(eval('dir()', g, d), list('xyz'))
401 self.assertEqual(eval('globals()', g, d), g)
402 self.assertEqual(eval('locals()', g, d), d)
403
404 # Verify locals stores (used by list comps)
405 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000406 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000407
408 class SpreadSheet:
409 "Sample application showing nested, calculated lookups."
410 _cells = {}
411 def __setitem__(self, key, formula):
412 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000413 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000414 return eval(self._cells[key], globals(), self)
415
416 ss = SpreadSheet()
417 ss['a1'] = '5'
418 ss['a2'] = 'a1*6'
419 ss['a3'] = 'a2*7'
420 self.assertEqual(ss['a3'], 210)
421
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000422 # Verify that dir() catches a non-list returned by eval
423 # SF bug #1004669
424 class C:
425 def __getitem__(self, item):
426 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000427 def keys(self):
428 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000429 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
430
Georg Brandl7cae87c2006-09-06 06:51:57 +0000431 def test_exec(self):
432 g = {}
433 exec('z = 1', g)
434 if '__builtins__' in g:
435 del g['__builtins__']
436 self.assertEqual(g, {'z': 1})
437
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000438 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000439 if '__builtins__' in g:
440 del g['__builtins__']
441 self.assertEqual(g, {'z': 2})
442 g = {}
443 l = {}
444
445 import warnings
446 warnings.filterwarnings("ignore", "global statement", module="<string>")
447 exec('global a; a = 1; b = 2', g, l)
448 if '__builtins__' in g:
449 del g['__builtins__']
450 if '__builtins__' in l:
451 del l['__builtins__']
452 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
453
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000454 def test_exec_redirected(self):
455 savestdout = sys.stdout
456 sys.stdout = None # Whatever that cannot flush()
457 try:
458 # Used to raise SystemError('error return without exception set')
459 exec('a')
460 except NameError:
461 pass
462 finally:
463 sys.stdout = savestdout
464
Walter Dörwald919497e2003-01-19 16:23:59 +0000465 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000466 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
467 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
468 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
469 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
470 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000471 def identity(item):
472 return 1
473 filter(identity, Squares(5))
474 self.assertRaises(TypeError, filter)
475 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000476 def __getitem__(self, index):
477 if index<4:
478 return 42
479 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000480 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000481 def badfunc():
482 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000483 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000484
Walter Dörwaldbf517072003-01-27 15:57:14 +0000485 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000486 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
487 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
488 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000489
Walter Dörwald919497e2003-01-19 16:23:59 +0000490 def test_getattr(self):
491 import sys
492 self.assert_(getattr(sys, 'stdout') is sys.stdout)
493 self.assertRaises(TypeError, getattr, sys, 1)
494 self.assertRaises(TypeError, getattr, sys, 1, "foo")
495 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000496 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000497
498 def test_hasattr(self):
499 import sys
500 self.assert_(hasattr(sys, 'stdout'))
501 self.assertRaises(TypeError, hasattr, sys, 1)
502 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000503 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000504
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000505 # Check that hasattr allows SystemExit and KeyboardInterrupts by
506 class A:
507 def __getattr__(self, what):
508 raise KeyboardInterrupt
509 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
510 class B:
511 def __getattr__(self, what):
512 raise SystemExit
513 self.assertRaises(SystemExit, hasattr, B(), "b")
514
Walter Dörwald919497e2003-01-19 16:23:59 +0000515 def test_hash(self):
516 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000517 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000518 self.assertEqual(hash(1), hash(1.0))
519 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000520 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000521 hash((0,1,2,3))
522 def f(): pass
523 self.assertRaises(TypeError, hash, [])
524 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000525 # Bug 1536021: Allow hash to return long objects
526 class X:
527 def __hash__(self):
528 return 2**100
529 self.assertEquals(type(hash(X())), int)
530 class Y(object):
531 def __hash__(self):
532 return 2**100
533 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000534 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000535 def __hash__(self):
536 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000537 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000538
539 def test_hex(self):
540 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000541 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000542 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000543 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000544 self.assertRaises(TypeError, hex, {})
545
546 def test_id(self):
547 id(None)
548 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000549 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000550 id(1.0)
551 id('spam')
552 id((0,1,2,3))
553 id([0,1,2,3])
554 id({'spam': 1, 'eggs': 2, 'ham': 3})
555
Guido van Rossuma88a0332007-02-26 16:59:55 +0000556 # Test input() later, alphabetized as if it were raw_input
557
Walter Dörwald919497e2003-01-19 16:23:59 +0000558 def test_iter(self):
559 self.assertRaises(TypeError, iter)
560 self.assertRaises(TypeError, iter, 42, 42)
561 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000562 for l in lists:
563 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000564 self.assertEqual(next(i), '1')
565 self.assertEqual(next(i), '2')
566 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000567
568 def test_isinstance(self):
569 class C:
570 pass
571 class D(C):
572 pass
573 class E:
574 pass
575 c = C()
576 d = D()
577 e = E()
578 self.assert_(isinstance(c, C))
579 self.assert_(isinstance(d, C))
580 self.assert_(not isinstance(e, C))
581 self.assert_(not isinstance(c, D))
582 self.assert_(not isinstance('foo', E))
583 self.assertRaises(TypeError, isinstance, E, 'foo')
584 self.assertRaises(TypeError, isinstance)
585
586 def test_issubclass(self):
587 class C:
588 pass
589 class D(C):
590 pass
591 class E:
592 pass
593 c = C()
594 d = D()
595 e = E()
596 self.assert_(issubclass(D, C))
597 self.assert_(issubclass(C, C))
598 self.assert_(not issubclass(C, D))
599 self.assertRaises(TypeError, issubclass, 'foo', E)
600 self.assertRaises(TypeError, issubclass, E, 'foo')
601 self.assertRaises(TypeError, issubclass)
602
603 def test_len(self):
604 self.assertEqual(len('123'), 3)
605 self.assertEqual(len(()), 0)
606 self.assertEqual(len((1, 2, 3, 4)), 4)
607 self.assertEqual(len([1, 2, 3, 4]), 4)
608 self.assertEqual(len({}), 0)
609 self.assertEqual(len({'a':1, 'b': 2}), 2)
610 class BadSeq:
611 def __len__(self):
612 raise ValueError
613 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000614 class InvalidLen:
615 def __len__(self):
616 return None
617 self.assertRaises(TypeError, len, InvalidLen())
618 class FloatLen:
619 def __len__(self):
620 return 4.5
621 self.assertRaises(TypeError, len, FloatLen())
622 class HugeLen:
623 def __len__(self):
624 return sys.maxsize + 1
625 self.assertRaises(OverflowError, len, HugeLen())
Walter Dörwald919497e2003-01-19 16:23:59 +0000626
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 def test_map(self):
628 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000629 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000630 [1, 4, 9]
631 )
632 try:
633 from math import sqrt
634 except ImportError:
635 def sqrt(x):
636 return pow(x, 0.5)
637 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000638 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000639 [[4.0, 2.0], [9.0, 3.0]]
640 )
641 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000642 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000643 [10, 4, 6]
644 )
645
646 def plus(*v):
647 accu = 0
648 for i in v: accu = accu + i
649 return accu
650 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000651 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 [1, 3, 7]
653 )
654 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000655 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000656 [1+4, 3+9, 7+2]
657 )
658 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000659 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 [1+4+1, 3+9+1, 7+2+0]
661 )
662 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000663 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
665 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000666 def Max(a, b):
667 if a is None:
668 return b
669 if b is None:
670 return a
671 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000672 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000673 list(map(Max, Squares(3), Squares(2))),
674 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000675 )
676 self.assertRaises(TypeError, map)
677 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000678 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000679 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000681 yield None
682 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000683 def badfunc(x):
684 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000685 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000686
687 def test_max(self):
688 self.assertEqual(max('123123'), '3')
689 self.assertEqual(max(1, 2, 3), 3)
690 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
691 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
692
Guido van Rossume2a383d2007-01-15 16:59:06 +0000693 self.assertEqual(max(1, 2, 3.0), 3.0)
694 self.assertEqual(max(1, 2.0, 3), 3)
695 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000696
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000697 for stmt in (
698 "max(key=int)", # no args
699 "max(1, key=int)", # single arg not iterable
700 "max(1, 2, keystone=int)", # wrong keyword
701 "max(1, 2, key=int, abc=int)", # two many keywords
702 "max(1, 2, key=1)", # keyfunc is not callable
703 ):
Tim Peters7f061872004-12-07 21:17:46 +0000704 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000705 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000706 except TypeError:
707 pass
708 else:
709 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000710
711 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
712 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
713 self.assertEqual(max(1, 2, key=neg), 1) # two elems
714
715 data = [random.randrange(200) for i in range(100)]
716 keys = dict((elem, random.randrange(50)) for elem in data)
717 f = keys.__getitem__
718 self.assertEqual(max(data, key=f),
719 sorted(reversed(data), key=f)[-1])
720
Walter Dörwald919497e2003-01-19 16:23:59 +0000721 def test_min(self):
722 self.assertEqual(min('123123'), '1')
723 self.assertEqual(min(1, 2, 3), 1)
724 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
725 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
726
Guido van Rossume2a383d2007-01-15 16:59:06 +0000727 self.assertEqual(min(1, 2, 3.0), 1)
728 self.assertEqual(min(1, 2.0, 3), 1)
729 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000730
731 self.assertRaises(TypeError, min)
732 self.assertRaises(TypeError, min, 42)
733 self.assertRaises(ValueError, min, ())
734 class BadSeq:
735 def __getitem__(self, index):
736 raise ValueError
737 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000738
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000739 for stmt in (
740 "min(key=int)", # no args
741 "min(1, key=int)", # single arg not iterable
742 "min(1, 2, keystone=int)", # wrong keyword
743 "min(1, 2, key=int, abc=int)", # two many keywords
744 "min(1, 2, key=1)", # keyfunc is not callable
745 ):
Tim Peters7f061872004-12-07 21:17:46 +0000746 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000747 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000748 except TypeError:
749 pass
750 else:
751 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000752
753 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
754 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
755 self.assertEqual(min(1, 2, key=neg), 2) # two elems
756
757 data = [random.randrange(200) for i in range(100)]
758 keys = dict((elem, random.randrange(50)) for elem in data)
759 f = keys.__getitem__
760 self.assertEqual(min(data, key=f),
761 sorted(data, key=f)[0])
762
Georg Brandla18af4e2007-04-21 15:47:16 +0000763 def test_next(self):
764 it = iter(range(2))
765 self.assertEqual(next(it), 0)
766 self.assertEqual(next(it), 1)
767 self.assertRaises(StopIteration, next, it)
768 self.assertRaises(StopIteration, next, it)
769 self.assertEquals(next(it, 42), 42)
770
771 class Iter(object):
772 def __iter__(self):
773 return self
774 def __next__(self):
775 raise StopIteration
776
777 it = iter(Iter())
778 self.assertEquals(next(it, 42), 42)
779 self.assertRaises(StopIteration, next, it)
780
781 def gen():
782 yield 1
783 return
784
785 it = gen()
786 self.assertEquals(next(it), 1)
787 self.assertRaises(StopIteration, next, it)
788 self.assertEquals(next(it, 42), 42)
789
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000791 self.assertEqual(oct(100), '0o144')
792 self.assertEqual(oct(100), '0o144')
793 self.assertEqual(oct(-100), '-0o144')
794 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000795 self.assertRaises(TypeError, oct, ())
796
797 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000798 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 fp = open(TESTFN, 'w')
800 try:
801 fp.write('1+1\n')
802 fp.write('1+1\n')
803 fp.write('The quick brown fox jumps over the lazy dog')
804 fp.write('.\n')
805 fp.write('Dear John\n')
806 fp.write('XXX'*100)
807 fp.write('YYY'*100)
808 finally:
809 fp.close()
810
811 def test_open(self):
812 self.write_testfile()
813 fp = open(TESTFN, 'r')
814 try:
815 self.assertEqual(fp.readline(4), '1+1\n')
816 self.assertEqual(fp.readline(4), '1+1\n')
817 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
818 self.assertEqual(fp.readline(4), 'Dear')
819 self.assertEqual(fp.readline(100), ' John\n')
820 self.assertEqual(fp.read(300), 'XXX'*100)
821 self.assertEqual(fp.read(1000), 'YYY'*100)
822 finally:
823 fp.close()
824 unlink(TESTFN)
825
826 def test_ord(self):
827 self.assertEqual(ord(' '), 32)
828 self.assertEqual(ord('A'), 65)
829 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000830 self.assertEqual(ord('\x80'), 128)
831 self.assertEqual(ord('\xff'), 255)
832
833 self.assertEqual(ord(b' '), 32)
834 self.assertEqual(ord(b'A'), 65)
835 self.assertEqual(ord(b'a'), 97)
836 self.assertEqual(ord(b'\x80'), 128)
837 self.assertEqual(ord(b'\xff'), 255)
838
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000839 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000840 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000841
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000842 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
843 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
844 self.assertEqual(ord("\U00010000"), 0x00010000)
845 self.assertEqual(ord("\U00010001"), 0x00010001)
846 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
847 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
848 self.assertEqual(ord("\U00100000"), 0x00100000)
849 self.assertEqual(ord("\U00100001"), 0x00100001)
850 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
851 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
852
Walter Dörwald919497e2003-01-19 16:23:59 +0000853 def test_pow(self):
854 self.assertEqual(pow(0,0), 1)
855 self.assertEqual(pow(0,1), 0)
856 self.assertEqual(pow(1,0), 1)
857 self.assertEqual(pow(1,1), 1)
858
859 self.assertEqual(pow(2,0), 1)
860 self.assertEqual(pow(2,10), 1024)
861 self.assertEqual(pow(2,20), 1024*1024)
862 self.assertEqual(pow(2,30), 1024*1024*1024)
863
864 self.assertEqual(pow(-2,0), 1)
865 self.assertEqual(pow(-2,1), -2)
866 self.assertEqual(pow(-2,2), 4)
867 self.assertEqual(pow(-2,3), -8)
868
Guido van Rossume2a383d2007-01-15 16:59:06 +0000869 self.assertEqual(pow(0,0), 1)
870 self.assertEqual(pow(0,1), 0)
871 self.assertEqual(pow(1,0), 1)
872 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
Guido van Rossume2a383d2007-01-15 16:59:06 +0000874 self.assertEqual(pow(2,0), 1)
875 self.assertEqual(pow(2,10), 1024)
876 self.assertEqual(pow(2,20), 1024*1024)
877 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000878
Guido van Rossume2a383d2007-01-15 16:59:06 +0000879 self.assertEqual(pow(-2,0), 1)
880 self.assertEqual(pow(-2,1), -2)
881 self.assertEqual(pow(-2,2), 4)
882 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000883
884 self.assertAlmostEqual(pow(0.,0), 1.)
885 self.assertAlmostEqual(pow(0.,1), 0.)
886 self.assertAlmostEqual(pow(1.,0), 1.)
887 self.assertAlmostEqual(pow(1.,1), 1.)
888
889 self.assertAlmostEqual(pow(2.,0), 1.)
890 self.assertAlmostEqual(pow(2.,10), 1024.)
891 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
892 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
893
894 self.assertAlmostEqual(pow(-2.,0), 1.)
895 self.assertAlmostEqual(pow(-2.,1), -2.)
896 self.assertAlmostEqual(pow(-2.,2), 4.)
897 self.assertAlmostEqual(pow(-2.,3), -8.)
898
Guido van Rossume2a383d2007-01-15 16:59:06 +0000899 for x in 2, 2, 2.0:
900 for y in 10, 10, 10.0:
901 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 if isinstance(x, float) or \
903 isinstance(y, float) or \
904 isinstance(z, float):
905 self.assertRaises(TypeError, pow, x, y, z)
906 else:
907 self.assertAlmostEqual(pow(x, y, z), 24.0)
908
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000909 self.assertAlmostEqual(pow(-1, 0.5), 1j)
910 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
911
Walter Dörwald919497e2003-01-19 16:23:59 +0000912 self.assertRaises(TypeError, pow, -1, -2, 3)
913 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000914 self.assertRaises(TypeError, pow, -1, -2, 3)
915 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000916
917 self.assertRaises(TypeError, pow)
918
919 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000920 self.assertEqual(list(range(3)), [0, 1, 2])
921 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
922 self.assertEqual(list(range(0)), [])
923 self.assertEqual(list(range(-3)), [])
924 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
925 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000926
Guido van Rossum805365e2007-05-07 22:24:25 +0000927 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000928 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000929 self.assertEqual(list(range(-2**100)), [])
930 self.assertEqual(list(range(0, -2**100)), [])
931 self.assertEqual(list(range(0, 2**100, -1)), [])
932 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000933
Christian Heimesa37d4c62007-12-04 23:02:19 +0000934 a = int(10 * sys.maxsize)
935 b = int(100 * sys.maxsize)
936 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000937
Guido van Rossum805365e2007-05-07 22:24:25 +0000938 self.assertEqual(list(range(a, a+2)), [a, a+1])
939 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
940 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000941
Guido van Rossum805365e2007-05-07 22:24:25 +0000942 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000943 self.assert_(a in seq)
944 self.assert_(b not in seq)
945 self.assertEqual(len(seq), 2)
946
Guido van Rossum805365e2007-05-07 22:24:25 +0000947 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000948 self.assert_(b in seq)
949 self.assert_(a not in seq)
950 self.assertEqual(len(seq), 2)
951
Guido van Rossum805365e2007-05-07 22:24:25 +0000952 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000953 self.assert_(-a in seq)
954 self.assert_(-b not in seq)
955 self.assertEqual(len(seq), 2)
956
Walter Dörwald919497e2003-01-19 16:23:59 +0000957 self.assertRaises(TypeError, range)
958 self.assertRaises(TypeError, range, 1, 2, 3, 4)
959 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000960 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000961
962 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000963 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000964 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000965 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
966
967 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000968 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000969 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000970
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000971 # Reject floats when it would require PyLongs to represent.
972 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000973 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000974
Walter Dörwald357981e2003-04-15 18:59:28 +0000975 self.assertRaises(TypeError, range, 0, "spam")
976 self.assertRaises(TypeError, range, 0, 42, "spam")
977
Christian Heimesa37d4c62007-12-04 23:02:19 +0000978 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
979 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000980
Christian Heimesa37d4c62007-12-04 23:02:19 +0000981 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000982
Guido van Rossuma88a0332007-02-26 16:59:55 +0000983 def test_input(self):
984 self.write_testfile()
985 fp = open(TESTFN, 'r')
986 savestdin = sys.stdin
987 savestdout = sys.stdout # Eats the echo
988 try:
989 sys.stdin = fp
990 sys.stdout = BitBucket()
991 self.assertEqual(input(), "1+1")
992 self.assertEqual(input('testing\n'), "1+1")
993 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
994 self.assertEqual(input('testing\n'), 'Dear John')
995
996 # SF 1535165: don't segfault on closed stdin
997 # sys.stdout must be a regular file for triggering
998 sys.stdout = savestdout
999 sys.stdin.close()
1000 self.assertRaises(ValueError, input)
1001
1002 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001003 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001004 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001005 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001006 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001007 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001008 self.assertRaises(EOFError, input)
1009
1010 del sys.stdout
1011 self.assertRaises(RuntimeError, input, 'prompt')
1012 del sys.stdin
1013 self.assertRaises(RuntimeError, input, 'prompt')
1014 finally:
1015 sys.stdin = savestdin
1016 sys.stdout = savestdout
1017 fp.close()
1018 unlink(TESTFN)
1019
Walter Dörwald919497e2003-01-19 16:23:59 +00001020 def test_repr(self):
1021 self.assertEqual(repr(''), '\'\'')
1022 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001023 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001024 self.assertEqual(repr(()), '()')
1025 self.assertEqual(repr([]), '[]')
1026 self.assertEqual(repr({}), '{}')
1027 a = []
1028 a.append(a)
1029 self.assertEqual(repr(a), '[[...]]')
1030 a = {}
1031 a[0] = a
1032 self.assertEqual(repr(a), '{0: {...}}')
1033
1034 def test_round(self):
1035 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001036 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001037 self.assertEqual(round(1.0), 1.0)
1038 self.assertEqual(round(10.0), 10.0)
1039 self.assertEqual(round(1000000000.0), 1000000000.0)
1040 self.assertEqual(round(1e20), 1e20)
1041
1042 self.assertEqual(round(-1.0), -1.0)
1043 self.assertEqual(round(-10.0), -10.0)
1044 self.assertEqual(round(-1000000000.0), -1000000000.0)
1045 self.assertEqual(round(-1e20), -1e20)
1046
1047 self.assertEqual(round(0.1), 0.0)
1048 self.assertEqual(round(1.1), 1.0)
1049 self.assertEqual(round(10.1), 10.0)
1050 self.assertEqual(round(1000000000.1), 1000000000.0)
1051
1052 self.assertEqual(round(-1.1), -1.0)
1053 self.assertEqual(round(-10.1), -10.0)
1054 self.assertEqual(round(-1000000000.1), -1000000000.0)
1055
1056 self.assertEqual(round(0.9), 1.0)
1057 self.assertEqual(round(9.9), 10.0)
1058 self.assertEqual(round(999999999.9), 1000000000.0)
1059
1060 self.assertEqual(round(-0.9), -1.0)
1061 self.assertEqual(round(-9.9), -10.0)
1062 self.assertEqual(round(-999999999.9), -1000000000.0)
1063
1064 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001065 self.assertEqual(type(round(-8.0, -1)), float)
1066
1067 self.assertEqual(type(round(-8.0, 0)), float)
1068 self.assertEqual(type(round(-8.0, 1)), float)
1069
1070 # Check even / odd rounding behaviour
1071 self.assertEqual(round(5.5), 6)
1072 self.assertEqual(round(6.5), 6)
1073 self.assertEqual(round(-5.5), -6)
1074 self.assertEqual(round(-6.5), -6)
1075
1076 # Check behavior on ints
1077 self.assertEqual(round(0), 0)
1078 self.assertEqual(round(8), 8)
1079 self.assertEqual(round(-8), -8)
1080 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001081 self.assertEqual(type(round(-8, -1)), int)
1082 self.assertEqual(type(round(-8, 0)), int)
1083 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001084
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001085 # test new kwargs
1086 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1087
Walter Dörwald919497e2003-01-19 16:23:59 +00001088 self.assertRaises(TypeError, round)
1089
Alex Martelliae211f92007-08-22 23:21:33 +00001090 # test generic rounding delegation for reals
1091 class TestRound:
1092 def __round__(self):
1093 return 23
1094
1095 class TestNoRound:
1096 pass
1097
1098 self.assertEqual(round(TestRound()), 23)
1099
1100 self.assertRaises(TypeError, round, 1, 2, 3)
1101 self.assertRaises(TypeError, round, TestNoRound())
1102
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001103 t = TestNoRound()
1104 t.__round__ = lambda *args: args
1105 self.assertRaises(TypeError, round, t)
1106 self.assertRaises(TypeError, round, t, 0)
1107
Walter Dörwald919497e2003-01-19 16:23:59 +00001108 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001109 setattr(sys, 'spam', 1)
1110 self.assertEqual(sys.spam, 1)
1111 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1112 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001113
Walter Dörwald919497e2003-01-19 16:23:59 +00001114
Alex Martellia70b1912003-04-22 08:12:33 +00001115 def test_sum(self):
1116 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001117 self.assertEqual(sum(list(range(2,8))), 27)
1118 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001119 self.assertEqual(sum(Squares(10)), 285)
1120 self.assertEqual(sum(iter(Squares(10))), 285)
1121 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1122
1123 self.assertRaises(TypeError, sum)
1124 self.assertRaises(TypeError, sum, 42)
1125 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1126 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1127 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1128 self.assertRaises(TypeError, sum, [{2:3}])
1129 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1130
1131 class BadSeq:
1132 def __getitem__(self, index):
1133 raise ValueError
1134 self.assertRaises(ValueError, sum, BadSeq())
1135
Walter Dörwald919497e2003-01-19 16:23:59 +00001136 def test_type(self):
1137 self.assertEqual(type(''), type('123'))
1138 self.assertNotEqual(type(''), type(()))
1139
Guido van Rossumfee7b932005-01-16 00:21:28 +00001140 # We don't want self in vars(), so these are static methods
1141
1142 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 def get_vars_f0():
1144 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001145
Guido van Rossumfee7b932005-01-16 00:21:28 +00001146 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001147 def get_vars_f2():
1148 BuiltinTest.get_vars_f0()
1149 a = 1
1150 b = 2
1151 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001152
1153 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001154 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001156 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 self.assertEqual(self.get_vars_f0(), {})
1158 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1159 self.assertRaises(TypeError, vars, 42, 42)
1160 self.assertRaises(TypeError, vars, 42)
1161
1162 def test_zip(self):
1163 a = (1, 2, 3)
1164 b = (4, 5, 6)
1165 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001166 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001167 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001168 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001169 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001170 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001171 class I:
1172 def __getitem__(self, i):
1173 if i < 0 or i > 2: raise IndexError
1174 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001175 self.assertEqual(list(zip(a, I())), t)
1176 self.assertEqual(list(zip()), [])
1177 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001178 self.assertRaises(TypeError, zip, None)
1179 class G:
1180 pass
1181 self.assertRaises(TypeError, zip, a, G())
1182
1183 # Make sure zip doesn't try to allocate a billion elements for the
1184 # result list when one of its arguments doesn't say how long it is.
1185 # A MemoryError is the most likely failure mode.
1186 class SequenceWithoutALength:
1187 def __getitem__(self, i):
1188 if i == 5:
1189 raise IndexError
1190 else:
1191 return i
1192 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001193 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001194 list(enumerate(range(5)))
1195 )
1196
1197 class BadSeq:
1198 def __getitem__(self, i):
1199 if i == 5:
1200 raise ValueError
1201 else:
1202 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001203 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001204
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001205 def test_bin(self):
1206 self.assertEqual(bin(0), '0b0')
1207 self.assertEqual(bin(1), '0b1')
1208 self.assertEqual(bin(-1), '-0b1')
1209 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1210 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1211 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1212 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1213
Raymond Hettinger64958a12003-12-17 20:43:33 +00001214class TestSorted(unittest.TestCase):
1215
1216 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001217 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001218 copy = data[:]
1219 random.shuffle(copy)
1220 self.assertEqual(data, sorted(copy))
1221 self.assertNotEqual(data, copy)
1222
1223 data.reverse()
1224 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001225 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1226 self.assertNotEqual(data, copy)
1227 random.shuffle(copy)
1228 self.assertEqual(data, sorted(copy, reverse=1))
1229 self.assertNotEqual(data, copy)
1230
1231 def test_inputtypes(self):
1232 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001233 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001234 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001235 self.assertEqual(sorted(s), sorted(T(s)))
1236
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001237 s = ''.join(set(s)) # unique letters only
1238 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001239 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001240 self.assertEqual(sorted(s), sorted(T(s)))
1241
1242 def test_baddecorator(self):
1243 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1244 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1245
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001246def test_main(verbose=None):
1247 test_classes = (BuiltinTest, TestSorted)
1248
1249 run_unittest(*test_classes)
1250
1251 # verify reference counting
1252 if verbose and hasattr(sys, "gettotalrefcount"):
1253 import gc
1254 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001255 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001256 run_unittest(*test_classes)
1257 gc.collect()
1258 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001259 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001260
Walter Dörwald919497e2003-01-19 16:23:59 +00001261
1262if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001263 test_main(verbose=True)