blob: 29c536a2ccd66fec1e4cacae19cbb3ff324ae584 [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")
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
Georg Brandl559e5d72008-06-11 18:37:52 +0000162 def test_ascii(self):
163 self.assertEqual(ascii(''), '\'\'')
164 self.assertEqual(ascii(0), '0')
165 self.assertEqual(ascii(0), '0')
166 self.assertEqual(ascii(()), '()')
167 self.assertEqual(ascii([]), '[]')
168 self.assertEqual(ascii({}), '{}')
169 a = []
170 a.append(a)
171 self.assertEqual(ascii(a), '[[...]]')
172 a = {}
173 a[0] = a
174 self.assertEqual(ascii(a), '{0: {...}}')
175
Thomas Wouters89f507f2006-12-13 04:49:30 +0000176 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000177 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000178 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000179 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000180
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000181 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000183 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000185 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000186 class C:
187 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000188 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000189 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000190 self.assert_(hasattr(x.meth, '__call__'))
191 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000192 class D(C):
193 def __call__(self): pass
194 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000195 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000196 y()
197
198 def test_chr(self):
199 self.assertEqual(chr(32), ' ')
200 self.assertEqual(chr(65), 'A')
201 self.assertEqual(chr(97), 'a')
202 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000203 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000204 self.assertEqual(chr(sys.maxunicode),
205 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
206 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000207 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000208 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
209 self.assertEqual(chr(0x00010000), "\U00010000")
210 self.assertEqual(chr(0x00010001), "\U00010001")
211 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
212 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
213 self.assertEqual(chr(0x00100000), "\U00100000")
214 self.assertEqual(chr(0x00100001), "\U00100001")
215 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
216 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
217 self.assertRaises(ValueError, chr, -1)
218 self.assertRaises(ValueError, chr, 0x00110000)
Walter Dörwald919497e2003-01-19 16:23:59 +0000219
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000220 def test_cmp(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000221 self.assertEqual(cmp(-1, 1), -1)
222 self.assertEqual(cmp(1, -1), 1)
223 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000224 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 a = []; a.append(a)
226 b = []; b.append(b)
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000227 from collections import UserList
Walter Dörwald919497e2003-01-19 16:23:59 +0000228 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000229 self.assertRaises(RuntimeError, cmp, a, b)
230 self.assertRaises(RuntimeError, cmp, b, c)
231 self.assertRaises(RuntimeError, cmp, c, a)
232 self.assertRaises(RuntimeError, cmp, a, c)
233 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000234 a.pop(); b.pop(); c.pop()
235 self.assertRaises(TypeError, cmp)
236
Walter Dörwald919497e2003-01-19 16:23:59 +0000237 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000238 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000239 bom = b'\xef\xbb\xbf'
240 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000241 compile(source='pass', filename='?', mode='exec')
242 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
243 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000244 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000245 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
246 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000247 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000248 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
249 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000250 compile('print("\xe5")\n', '', 'exec')
251 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
252 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253
Walter Dörwald919497e2003-01-19 16:23:59 +0000254 def test_delattr(self):
255 import sys
256 sys.spam = 1
257 delattr(sys, 'spam')
258 self.assertRaises(TypeError, delattr)
259
260 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000261 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000262 self.assertRaises(TypeError, dir, 42, 42)
263
Georg Brandle32b4222007-03-10 22:13:27 +0000264 # dir() - local scope
265 local_var = 1
266 self.assert_('local_var' in dir())
267
268 # dir(module)
269 import sys
270 self.assert_('exit' in dir(sys))
271
272 # dir(module_with_invalid__dict__)
273 import types
274 class Foo(types.ModuleType):
275 __dict__ = 8
276 f = Foo("foo")
277 self.assertRaises(TypeError, dir, f)
278
279 # dir(type)
280 self.assert_("strip" in dir(str))
281 self.assert_("__mro__" not in dir(str))
282
283 # dir(obj)
284 class Foo(object):
285 def __init__(self):
286 self.x = 7
287 self.y = 8
288 self.z = 9
289 f = Foo()
290 self.assert_("y" in dir(f))
291
292 # dir(obj_no__dict__)
293 class Foo(object):
294 __slots__ = []
295 f = Foo()
296 self.assert_("__repr__" in dir(f))
297
298 # dir(obj_no__class__with__dict__)
299 # (an ugly trick to cause getattr(f, "__class__") to fail)
300 class Foo(object):
301 __slots__ = ["__class__", "__dict__"]
302 def __init__(self):
303 self.bar = "wow"
304 f = Foo()
305 self.assert_("__repr__" not in dir(f))
306 self.assert_("bar" in dir(f))
307
308 # dir(obj_using __dir__)
309 class Foo(object):
310 def __dir__(self):
311 return ["kan", "ga", "roo"]
312 f = Foo()
313 self.assert_(dir(f) == ["ga", "kan", "roo"])
314
315 # dir(obj__dir__not_list)
316 class Foo(object):
317 def __dir__(self):
318 return 7
319 f = Foo()
320 self.assertRaises(TypeError, dir, f)
321
Collin Winter3eed7652007-08-14 17:53:54 +0000322 # dir(traceback)
323 try:
324 raise IndexError
325 except:
326 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
327
328
Walter Dörwald919497e2003-01-19 16:23:59 +0000329 def test_divmod(self):
330 self.assertEqual(divmod(12, 7), (1, 5))
331 self.assertEqual(divmod(-12, 7), (-2, 2))
332 self.assertEqual(divmod(12, -7), (-2, -2))
333 self.assertEqual(divmod(-12, -7), (1, -5))
334
Guido van Rossume2a383d2007-01-15 16:59:06 +0000335 self.assertEqual(divmod(12, 7), (1, 5))
336 self.assertEqual(divmod(-12, 7), (-2, 2))
337 self.assertEqual(divmod(12, -7), (-2, -2))
338 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000339
Guido van Rossume2a383d2007-01-15 16:59:06 +0000340 self.assertEqual(divmod(12, 7), (1, 5))
341 self.assertEqual(divmod(-12, 7), (-2, 2))
342 self.assertEqual(divmod(12, -7), (-2, -2))
343 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000344
Christian Heimesa37d4c62007-12-04 23:02:19 +0000345 self.assertEqual(divmod(-sys.maxsize-1, -1),
346 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000347
Walter Dörwald919497e2003-01-19 16:23:59 +0000348 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
349 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
350 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
351 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
352
353 self.assertRaises(TypeError, divmod)
354
355 def test_eval(self):
356 self.assertEqual(eval('1+1'), 2)
357 self.assertEqual(eval(' 1+1\n'), 2)
358 globals = {'a': 1, 'b': 2}
359 locals = {'b': 200, 'c': 300}
360 self.assertEqual(eval('a', globals) , 1)
361 self.assertEqual(eval('a', globals, locals), 1)
362 self.assertEqual(eval('b', globals, locals), 200)
363 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000364 globals = {'a': 1, 'b': 2}
365 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000366 bom = b'\xef\xbb\xbf'
367 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000368 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000369 self.assertRaises(TypeError, eval)
370 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000371 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000372
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000373 def test_general_eval(self):
374 # Tests that general mappings can be used for the locals argument
375
376 class M:
377 "Test mapping interface versus possible calls from eval()."
378 def __getitem__(self, key):
379 if key == 'a':
380 return 12
381 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000382 def keys(self):
383 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000384
385 m = M()
386 g = globals()
387 self.assertEqual(eval('a', g, m), 12)
388 self.assertRaises(NameError, eval, 'b', g, m)
389 self.assertEqual(eval('dir()', g, m), list('xyz'))
390 self.assertEqual(eval('globals()', g, m), g)
391 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000392 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000393 class A:
394 "Non-mapping"
395 pass
396 m = A()
397 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000398
399 # Verify that dict subclasses work as well
400 class D(dict):
401 def __getitem__(self, key):
402 if key == 'a':
403 return 12
404 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000405 def keys(self):
406 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000407
408 d = D()
409 self.assertEqual(eval('a', g, d), 12)
410 self.assertRaises(NameError, eval, 'b', g, d)
411 self.assertEqual(eval('dir()', g, d), list('xyz'))
412 self.assertEqual(eval('globals()', g, d), g)
413 self.assertEqual(eval('locals()', g, d), d)
414
415 # Verify locals stores (used by list comps)
416 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000417 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000418
419 class SpreadSheet:
420 "Sample application showing nested, calculated lookups."
421 _cells = {}
422 def __setitem__(self, key, formula):
423 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000424 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000425 return eval(self._cells[key], globals(), self)
426
427 ss = SpreadSheet()
428 ss['a1'] = '5'
429 ss['a2'] = 'a1*6'
430 ss['a3'] = 'a2*7'
431 self.assertEqual(ss['a3'], 210)
432
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000433 # Verify that dir() catches a non-list returned by eval
434 # SF bug #1004669
435 class C:
436 def __getitem__(self, item):
437 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000438 def keys(self):
439 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000440 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
441
Georg Brandl7cae87c2006-09-06 06:51:57 +0000442 def test_exec(self):
443 g = {}
444 exec('z = 1', g)
445 if '__builtins__' in g:
446 del g['__builtins__']
447 self.assertEqual(g, {'z': 1})
448
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000449 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000450 if '__builtins__' in g:
451 del g['__builtins__']
452 self.assertEqual(g, {'z': 2})
453 g = {}
454 l = {}
455
456 import warnings
457 warnings.filterwarnings("ignore", "global statement", module="<string>")
458 exec('global a; a = 1; b = 2', g, l)
459 if '__builtins__' in g:
460 del g['__builtins__']
461 if '__builtins__' in l:
462 del l['__builtins__']
463 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
464
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000465 def test_exec_redirected(self):
466 savestdout = sys.stdout
467 sys.stdout = None # Whatever that cannot flush()
468 try:
469 # Used to raise SystemError('error return without exception set')
470 exec('a')
471 except NameError:
472 pass
473 finally:
474 sys.stdout = savestdout
475
Walter Dörwald919497e2003-01-19 16:23:59 +0000476 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000477 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
478 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
479 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
480 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
481 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000482 def identity(item):
483 return 1
484 filter(identity, Squares(5))
485 self.assertRaises(TypeError, filter)
486 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000487 def __getitem__(self, index):
488 if index<4:
489 return 42
490 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000491 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000492 def badfunc():
493 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000494 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000495
Walter Dörwaldbf517072003-01-27 15:57:14 +0000496 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000497 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
498 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
499 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000500
Walter Dörwald919497e2003-01-19 16:23:59 +0000501 def test_getattr(self):
502 import sys
503 self.assert_(getattr(sys, 'stdout') is sys.stdout)
504 self.assertRaises(TypeError, getattr, sys, 1)
505 self.assertRaises(TypeError, getattr, sys, 1, "foo")
506 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000507 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000508
509 def test_hasattr(self):
510 import sys
511 self.assert_(hasattr(sys, 'stdout'))
512 self.assertRaises(TypeError, hasattr, sys, 1)
513 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000514 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000515
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000516 # Check that hasattr allows SystemExit and KeyboardInterrupts by
517 class A:
518 def __getattr__(self, what):
519 raise KeyboardInterrupt
520 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
521 class B:
522 def __getattr__(self, what):
523 raise SystemExit
524 self.assertRaises(SystemExit, hasattr, B(), "b")
525
Walter Dörwald919497e2003-01-19 16:23:59 +0000526 def test_hash(self):
527 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000528 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000529 self.assertEqual(hash(1), hash(1.0))
530 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000531 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000532 hash((0,1,2,3))
533 def f(): pass
534 self.assertRaises(TypeError, hash, [])
535 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000536 # Bug 1536021: Allow hash to return long objects
537 class X:
538 def __hash__(self):
539 return 2**100
540 self.assertEquals(type(hash(X())), int)
541 class Y(object):
542 def __hash__(self):
543 return 2**100
544 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000545 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000546 def __hash__(self):
547 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000548 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000549
550 def test_hex(self):
551 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000552 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000553 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000554 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000555 self.assertRaises(TypeError, hex, {})
Raymond Hettingerd11a4432008-06-22 11:39:13 +0000556 self.assertEqual(hex(3.125), '0x19 * 2.0 ** -3')
557 self.assertEqual(hex(0.0), '0x0 * 2.0 ** 0')
558 for sv in float('nan'), float('inf'), float('-inf'):
559 self.assertEqual(hex(sv), repr(sv))
560 for i in range(100):
561 x = random.expovariate(.05)
562 self.assertEqual(eval(hex(x)), x, (x, hex(x), eval(hex(x))))
563 self.assertEqual(eval(hex(-x)), -x)
564 self.assertEqual(hex(-x), ('-' + hex(x)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000565
566 def test_id(self):
567 id(None)
568 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000569 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000570 id(1.0)
571 id('spam')
572 id((0,1,2,3))
573 id([0,1,2,3])
574 id({'spam': 1, 'eggs': 2, 'ham': 3})
575
Guido van Rossuma88a0332007-02-26 16:59:55 +0000576 # Test input() later, alphabetized as if it were raw_input
577
Walter Dörwald919497e2003-01-19 16:23:59 +0000578 def test_iter(self):
579 self.assertRaises(TypeError, iter)
580 self.assertRaises(TypeError, iter, 42, 42)
581 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000582 for l in lists:
583 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000584 self.assertEqual(next(i), '1')
585 self.assertEqual(next(i), '2')
586 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000587
588 def test_isinstance(self):
589 class C:
590 pass
591 class D(C):
592 pass
593 class E:
594 pass
595 c = C()
596 d = D()
597 e = E()
598 self.assert_(isinstance(c, C))
599 self.assert_(isinstance(d, C))
600 self.assert_(not isinstance(e, C))
601 self.assert_(not isinstance(c, D))
602 self.assert_(not isinstance('foo', E))
603 self.assertRaises(TypeError, isinstance, E, 'foo')
604 self.assertRaises(TypeError, isinstance)
605
606 def test_issubclass(self):
607 class C:
608 pass
609 class D(C):
610 pass
611 class E:
612 pass
613 c = C()
614 d = D()
615 e = E()
616 self.assert_(issubclass(D, C))
617 self.assert_(issubclass(C, C))
618 self.assert_(not issubclass(C, D))
619 self.assertRaises(TypeError, issubclass, 'foo', E)
620 self.assertRaises(TypeError, issubclass, E, 'foo')
621 self.assertRaises(TypeError, issubclass)
622
623 def test_len(self):
624 self.assertEqual(len('123'), 3)
625 self.assertEqual(len(()), 0)
626 self.assertEqual(len((1, 2, 3, 4)), 4)
627 self.assertEqual(len([1, 2, 3, 4]), 4)
628 self.assertEqual(len({}), 0)
629 self.assertEqual(len({'a':1, 'b': 2}), 2)
630 class BadSeq:
631 def __len__(self):
632 raise ValueError
633 self.assertRaises(ValueError, len, BadSeq())
634
Walter Dörwald919497e2003-01-19 16:23:59 +0000635 def test_map(self):
636 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000637 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000638 [1, 4, 9]
639 )
640 try:
641 from math import sqrt
642 except ImportError:
643 def sqrt(x):
644 return pow(x, 0.5)
645 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000646 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 [[4.0, 2.0], [9.0, 3.0]]
648 )
649 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000650 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000651 [10, 4, 6]
652 )
653
654 def plus(*v):
655 accu = 0
656 for i in v: accu = accu + i
657 return accu
658 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000659 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 [1, 3, 7]
661 )
662 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000663 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 [1+4, 3+9, 7+2]
665 )
666 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000667 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000668 [1+4+1, 3+9+1, 7+2+0]
669 )
670 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000671 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000672 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
673 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000674 def Max(a, b):
675 if a is None:
676 return b
677 if b is None:
678 return a
679 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000681 list(map(Max, Squares(3), Squares(2))),
682 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000683 )
684 self.assertRaises(TypeError, map)
685 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000686 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000687 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000688 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000689 yield None
690 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000691 def badfunc(x):
692 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000693 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000694
695 def test_max(self):
696 self.assertEqual(max('123123'), '3')
697 self.assertEqual(max(1, 2, 3), 3)
698 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
699 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
700
Guido van Rossume2a383d2007-01-15 16:59:06 +0000701 self.assertEqual(max(1, 2, 3.0), 3.0)
702 self.assertEqual(max(1, 2.0, 3), 3)
703 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000704
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000705 for stmt in (
706 "max(key=int)", # no args
707 "max(1, key=int)", # single arg not iterable
708 "max(1, 2, keystone=int)", # wrong keyword
709 "max(1, 2, key=int, abc=int)", # two many keywords
710 "max(1, 2, key=1)", # keyfunc is not callable
711 ):
Tim Peters7f061872004-12-07 21:17:46 +0000712 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000713 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000714 except TypeError:
715 pass
716 else:
717 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000718
719 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
720 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
721 self.assertEqual(max(1, 2, key=neg), 1) # two elems
722
723 data = [random.randrange(200) for i in range(100)]
724 keys = dict((elem, random.randrange(50)) for elem in data)
725 f = keys.__getitem__
726 self.assertEqual(max(data, key=f),
727 sorted(reversed(data), key=f)[-1])
728
Walter Dörwald919497e2003-01-19 16:23:59 +0000729 def test_min(self):
730 self.assertEqual(min('123123'), '1')
731 self.assertEqual(min(1, 2, 3), 1)
732 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
733 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
734
Guido van Rossume2a383d2007-01-15 16:59:06 +0000735 self.assertEqual(min(1, 2, 3.0), 1)
736 self.assertEqual(min(1, 2.0, 3), 1)
737 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000738
739 self.assertRaises(TypeError, min)
740 self.assertRaises(TypeError, min, 42)
741 self.assertRaises(ValueError, min, ())
742 class BadSeq:
743 def __getitem__(self, index):
744 raise ValueError
745 self.assertRaises(ValueError, min, BadSeq())
746 class BadNumber:
747 def __cmp__(self, other):
748 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000749 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000750
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000751 for stmt in (
752 "min(key=int)", # no args
753 "min(1, key=int)", # single arg not iterable
754 "min(1, 2, keystone=int)", # wrong keyword
755 "min(1, 2, key=int, abc=int)", # two many keywords
756 "min(1, 2, key=1)", # keyfunc is not callable
757 ):
Tim Peters7f061872004-12-07 21:17:46 +0000758 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000759 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000760 except TypeError:
761 pass
762 else:
763 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000764
765 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
766 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
767 self.assertEqual(min(1, 2, key=neg), 2) # two elems
768
769 data = [random.randrange(200) for i in range(100)]
770 keys = dict((elem, random.randrange(50)) for elem in data)
771 f = keys.__getitem__
772 self.assertEqual(min(data, key=f),
773 sorted(data, key=f)[0])
774
Georg Brandla18af4e2007-04-21 15:47:16 +0000775 def test_next(self):
776 it = iter(range(2))
777 self.assertEqual(next(it), 0)
778 self.assertEqual(next(it), 1)
779 self.assertRaises(StopIteration, next, it)
780 self.assertRaises(StopIteration, next, it)
781 self.assertEquals(next(it, 42), 42)
782
783 class Iter(object):
784 def __iter__(self):
785 return self
786 def __next__(self):
787 raise StopIteration
788
789 it = iter(Iter())
790 self.assertEquals(next(it, 42), 42)
791 self.assertRaises(StopIteration, next, it)
792
793 def gen():
794 yield 1
795 return
796
797 it = gen()
798 self.assertEquals(next(it), 1)
799 self.assertRaises(StopIteration, next, it)
800 self.assertEquals(next(it, 42), 42)
801
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000803 self.assertEqual(oct(100), '0o144')
804 self.assertEqual(oct(100), '0o144')
805 self.assertEqual(oct(-100), '-0o144')
806 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000807 self.assertRaises(TypeError, oct, ())
Raymond Hettingerd11a4432008-06-22 11:39:13 +0000808 self.assertEqual(oct(3.125), '0o31 * 2.0 ** -3')
809 self.assertEqual(oct(0.0), '0o0 * 2.0 ** 0')
810 for sv in float('nan'), float('inf'), float('-inf'):
811 self.assertEqual(oct(sv), repr(sv))
812 for i in range(100):
813 x = random.expovariate(.05)
814 self.assertEqual(eval(oct(x)), x)
815 self.assertEqual(eval(oct(-x)), -x)
816 self.assertEqual(oct(-x), ('-' + oct(x)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000817
818 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000819 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000820 fp = open(TESTFN, 'w')
821 try:
822 fp.write('1+1\n')
823 fp.write('1+1\n')
824 fp.write('The quick brown fox jumps over the lazy dog')
825 fp.write('.\n')
826 fp.write('Dear John\n')
827 fp.write('XXX'*100)
828 fp.write('YYY'*100)
829 finally:
830 fp.close()
831
832 def test_open(self):
833 self.write_testfile()
834 fp = open(TESTFN, 'r')
835 try:
836 self.assertEqual(fp.readline(4), '1+1\n')
837 self.assertEqual(fp.readline(4), '1+1\n')
838 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
839 self.assertEqual(fp.readline(4), 'Dear')
840 self.assertEqual(fp.readline(100), ' John\n')
841 self.assertEqual(fp.read(300), 'XXX'*100)
842 self.assertEqual(fp.read(1000), 'YYY'*100)
843 finally:
844 fp.close()
845 unlink(TESTFN)
846
847 def test_ord(self):
848 self.assertEqual(ord(' '), 32)
849 self.assertEqual(ord('A'), 65)
850 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000851 self.assertEqual(ord('\x80'), 128)
852 self.assertEqual(ord('\xff'), 255)
853
854 self.assertEqual(ord(b' '), 32)
855 self.assertEqual(ord(b'A'), 65)
856 self.assertEqual(ord(b'a'), 97)
857 self.assertEqual(ord(b'\x80'), 128)
858 self.assertEqual(ord(b'\xff'), 255)
859
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000860 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000861 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000862
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000863 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
864 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
865 self.assertEqual(ord("\U00010000"), 0x00010000)
866 self.assertEqual(ord("\U00010001"), 0x00010001)
867 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
868 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
869 self.assertEqual(ord("\U00100000"), 0x00100000)
870 self.assertEqual(ord("\U00100001"), 0x00100001)
871 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
872 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
873
Walter Dörwald919497e2003-01-19 16:23:59 +0000874 def test_pow(self):
875 self.assertEqual(pow(0,0), 1)
876 self.assertEqual(pow(0,1), 0)
877 self.assertEqual(pow(1,0), 1)
878 self.assertEqual(pow(1,1), 1)
879
880 self.assertEqual(pow(2,0), 1)
881 self.assertEqual(pow(2,10), 1024)
882 self.assertEqual(pow(2,20), 1024*1024)
883 self.assertEqual(pow(2,30), 1024*1024*1024)
884
885 self.assertEqual(pow(-2,0), 1)
886 self.assertEqual(pow(-2,1), -2)
887 self.assertEqual(pow(-2,2), 4)
888 self.assertEqual(pow(-2,3), -8)
889
Guido van Rossume2a383d2007-01-15 16:59:06 +0000890 self.assertEqual(pow(0,0), 1)
891 self.assertEqual(pow(0,1), 0)
892 self.assertEqual(pow(1,0), 1)
893 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000894
Guido van Rossume2a383d2007-01-15 16:59:06 +0000895 self.assertEqual(pow(2,0), 1)
896 self.assertEqual(pow(2,10), 1024)
897 self.assertEqual(pow(2,20), 1024*1024)
898 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000899
Guido van Rossume2a383d2007-01-15 16:59:06 +0000900 self.assertEqual(pow(-2,0), 1)
901 self.assertEqual(pow(-2,1), -2)
902 self.assertEqual(pow(-2,2), 4)
903 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000904
905 self.assertAlmostEqual(pow(0.,0), 1.)
906 self.assertAlmostEqual(pow(0.,1), 0.)
907 self.assertAlmostEqual(pow(1.,0), 1.)
908 self.assertAlmostEqual(pow(1.,1), 1.)
909
910 self.assertAlmostEqual(pow(2.,0), 1.)
911 self.assertAlmostEqual(pow(2.,10), 1024.)
912 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
913 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
914
915 self.assertAlmostEqual(pow(-2.,0), 1.)
916 self.assertAlmostEqual(pow(-2.,1), -2.)
917 self.assertAlmostEqual(pow(-2.,2), 4.)
918 self.assertAlmostEqual(pow(-2.,3), -8.)
919
Guido van Rossume2a383d2007-01-15 16:59:06 +0000920 for x in 2, 2, 2.0:
921 for y in 10, 10, 10.0:
922 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000923 if isinstance(x, float) or \
924 isinstance(y, float) or \
925 isinstance(z, float):
926 self.assertRaises(TypeError, pow, x, y, z)
927 else:
928 self.assertAlmostEqual(pow(x, y, z), 24.0)
929
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000930 self.assertAlmostEqual(pow(-1, 0.5), 1j)
931 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
932
Walter Dörwald919497e2003-01-19 16:23:59 +0000933 self.assertRaises(TypeError, pow, -1, -2, 3)
934 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000935 self.assertRaises(TypeError, pow, -1, -2, 3)
936 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000937
938 self.assertRaises(TypeError, pow)
939
940 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000941 self.assertEqual(list(range(3)), [0, 1, 2])
942 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
943 self.assertEqual(list(range(0)), [])
944 self.assertEqual(list(range(-3)), [])
945 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
946 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000947
Guido van Rossum805365e2007-05-07 22:24:25 +0000948 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000949 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000950 self.assertEqual(list(range(-2**100)), [])
951 self.assertEqual(list(range(0, -2**100)), [])
952 self.assertEqual(list(range(0, 2**100, -1)), [])
953 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000954
Christian Heimesa37d4c62007-12-04 23:02:19 +0000955 a = int(10 * sys.maxsize)
956 b = int(100 * sys.maxsize)
957 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000958
Guido van Rossum805365e2007-05-07 22:24:25 +0000959 self.assertEqual(list(range(a, a+2)), [a, a+1])
960 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
961 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000962
Guido van Rossum805365e2007-05-07 22:24:25 +0000963 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000964 self.assert_(a in seq)
965 self.assert_(b not in seq)
966 self.assertEqual(len(seq), 2)
967
Guido van Rossum805365e2007-05-07 22:24:25 +0000968 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000969 self.assert_(b in seq)
970 self.assert_(a not in seq)
971 self.assertEqual(len(seq), 2)
972
Guido van Rossum805365e2007-05-07 22:24:25 +0000973 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000974 self.assert_(-a in seq)
975 self.assert_(-b not in seq)
976 self.assertEqual(len(seq), 2)
977
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 self.assertRaises(TypeError, range)
979 self.assertRaises(TypeError, range, 1, 2, 3, 4)
980 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000981 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000982
983 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000984 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000985 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000986 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
987
988 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000989 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000990 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000991
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000992 # Reject floats when it would require PyLongs to represent.
993 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000994 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000995
Walter Dörwald357981e2003-04-15 18:59:28 +0000996 self.assertRaises(TypeError, range, 0, "spam")
997 self.assertRaises(TypeError, range, 0, 42, "spam")
998
Christian Heimesa37d4c62007-12-04 23:02:19 +0000999 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
1000 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +00001001
Christian Heimesa37d4c62007-12-04 23:02:19 +00001002 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +00001003
Guido van Rossuma88a0332007-02-26 16:59:55 +00001004 def test_input(self):
1005 self.write_testfile()
1006 fp = open(TESTFN, 'r')
1007 savestdin = sys.stdin
1008 savestdout = sys.stdout # Eats the echo
1009 try:
1010 sys.stdin = fp
1011 sys.stdout = BitBucket()
1012 self.assertEqual(input(), "1+1")
1013 self.assertEqual(input('testing\n'), "1+1")
1014 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1015 self.assertEqual(input('testing\n'), 'Dear John')
1016
1017 # SF 1535165: don't segfault on closed stdin
1018 # sys.stdout must be a regular file for triggering
1019 sys.stdout = savestdout
1020 sys.stdin.close()
1021 self.assertRaises(ValueError, input)
1022
1023 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001024 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001025 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001026 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001027 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001028 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001029 self.assertRaises(EOFError, input)
1030
1031 del sys.stdout
1032 self.assertRaises(RuntimeError, input, 'prompt')
1033 del sys.stdin
1034 self.assertRaises(RuntimeError, input, 'prompt')
1035 finally:
1036 sys.stdin = savestdin
1037 sys.stdout = savestdout
1038 fp.close()
1039 unlink(TESTFN)
1040
Walter Dörwald919497e2003-01-19 16:23:59 +00001041 def test_repr(self):
1042 self.assertEqual(repr(''), '\'\'')
1043 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001044 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001045 self.assertEqual(repr(()), '()')
1046 self.assertEqual(repr([]), '[]')
1047 self.assertEqual(repr({}), '{}')
1048 a = []
1049 a.append(a)
1050 self.assertEqual(repr(a), '[[...]]')
1051 a = {}
1052 a[0] = a
1053 self.assertEqual(repr(a), '{0: {...}}')
1054
1055 def test_round(self):
1056 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001057 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001058 self.assertEqual(round(1.0), 1.0)
1059 self.assertEqual(round(10.0), 10.0)
1060 self.assertEqual(round(1000000000.0), 1000000000.0)
1061 self.assertEqual(round(1e20), 1e20)
1062
1063 self.assertEqual(round(-1.0), -1.0)
1064 self.assertEqual(round(-10.0), -10.0)
1065 self.assertEqual(round(-1000000000.0), -1000000000.0)
1066 self.assertEqual(round(-1e20), -1e20)
1067
1068 self.assertEqual(round(0.1), 0.0)
1069 self.assertEqual(round(1.1), 1.0)
1070 self.assertEqual(round(10.1), 10.0)
1071 self.assertEqual(round(1000000000.1), 1000000000.0)
1072
1073 self.assertEqual(round(-1.1), -1.0)
1074 self.assertEqual(round(-10.1), -10.0)
1075 self.assertEqual(round(-1000000000.1), -1000000000.0)
1076
1077 self.assertEqual(round(0.9), 1.0)
1078 self.assertEqual(round(9.9), 10.0)
1079 self.assertEqual(round(999999999.9), 1000000000.0)
1080
1081 self.assertEqual(round(-0.9), -1.0)
1082 self.assertEqual(round(-9.9), -10.0)
1083 self.assertEqual(round(-999999999.9), -1000000000.0)
1084
1085 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001086 self.assertEqual(type(round(-8.0, -1)), float)
1087
1088 self.assertEqual(type(round(-8.0, 0)), float)
1089 self.assertEqual(type(round(-8.0, 1)), float)
1090
1091 # Check even / odd rounding behaviour
1092 self.assertEqual(round(5.5), 6)
1093 self.assertEqual(round(6.5), 6)
1094 self.assertEqual(round(-5.5), -6)
1095 self.assertEqual(round(-6.5), -6)
1096
1097 # Check behavior on ints
1098 self.assertEqual(round(0), 0)
1099 self.assertEqual(round(8), 8)
1100 self.assertEqual(round(-8), -8)
1101 self.assertEqual(type(round(0)), int)
1102 self.assertEqual(type(round(-8, -1)), float)
1103 self.assertEqual(type(round(-8, 0)), float)
1104 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001105
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001106 # test new kwargs
1107 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1108
Walter Dörwald919497e2003-01-19 16:23:59 +00001109 self.assertRaises(TypeError, round)
1110
Alex Martelliae211f92007-08-22 23:21:33 +00001111 # test generic rounding delegation for reals
1112 class TestRound:
1113 def __round__(self):
1114 return 23
1115
1116 class TestNoRound:
1117 pass
1118
1119 self.assertEqual(round(TestRound()), 23)
1120
1121 self.assertRaises(TypeError, round, 1, 2, 3)
1122 self.assertRaises(TypeError, round, TestNoRound())
1123
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001124 t = TestNoRound()
1125 t.__round__ = lambda *args: args
1126 self.assertRaises(TypeError, round, t)
1127 self.assertRaises(TypeError, round, t, 0)
1128
Walter Dörwald919497e2003-01-19 16:23:59 +00001129 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001130 setattr(sys, 'spam', 1)
1131 self.assertEqual(sys.spam, 1)
1132 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1133 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001134
Walter Dörwald919497e2003-01-19 16:23:59 +00001135
Alex Martellia70b1912003-04-22 08:12:33 +00001136 def test_sum(self):
1137 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001138 self.assertEqual(sum(list(range(2,8))), 27)
1139 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001140 self.assertEqual(sum(Squares(10)), 285)
1141 self.assertEqual(sum(iter(Squares(10))), 285)
1142 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1143
1144 self.assertRaises(TypeError, sum)
1145 self.assertRaises(TypeError, sum, 42)
1146 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1147 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1148 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1149 self.assertRaises(TypeError, sum, [{2:3}])
1150 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1151
1152 class BadSeq:
1153 def __getitem__(self, index):
1154 raise ValueError
1155 self.assertRaises(ValueError, sum, BadSeq())
1156
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 def test_type(self):
1158 self.assertEqual(type(''), type('123'))
1159 self.assertNotEqual(type(''), type(()))
1160
Guido van Rossumfee7b932005-01-16 00:21:28 +00001161 # We don't want self in vars(), so these are static methods
1162
1163 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001164 def get_vars_f0():
1165 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001166
Guido van Rossumfee7b932005-01-16 00:21:28 +00001167 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 def get_vars_f2():
1169 BuiltinTest.get_vars_f0()
1170 a = 1
1171 b = 2
1172 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001173
1174 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001175 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001177 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001178 self.assertEqual(self.get_vars_f0(), {})
1179 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1180 self.assertRaises(TypeError, vars, 42, 42)
1181 self.assertRaises(TypeError, vars, 42)
1182
1183 def test_zip(self):
1184 a = (1, 2, 3)
1185 b = (4, 5, 6)
1186 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001187 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001188 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001189 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001191 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 class I:
1193 def __getitem__(self, i):
1194 if i < 0 or i > 2: raise IndexError
1195 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001196 self.assertEqual(list(zip(a, I())), t)
1197 self.assertEqual(list(zip()), [])
1198 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 self.assertRaises(TypeError, zip, None)
1200 class G:
1201 pass
1202 self.assertRaises(TypeError, zip, a, G())
1203
1204 # Make sure zip doesn't try to allocate a billion elements for the
1205 # result list when one of its arguments doesn't say how long it is.
1206 # A MemoryError is the most likely failure mode.
1207 class SequenceWithoutALength:
1208 def __getitem__(self, i):
1209 if i == 5:
1210 raise IndexError
1211 else:
1212 return i
1213 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001214 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001215 list(enumerate(range(5)))
1216 )
1217
1218 class BadSeq:
1219 def __getitem__(self, i):
1220 if i == 5:
1221 raise ValueError
1222 else:
1223 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001224 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001225
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001226 def test_bin(self):
1227 self.assertEqual(bin(0), '0b0')
1228 self.assertEqual(bin(1), '0b1')
1229 self.assertEqual(bin(-1), '-0b1')
1230 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1231 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1232 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1233 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
Raymond Hettingerd11a4432008-06-22 11:39:13 +00001234 self.assertEqual(bin(3.125), '0b11001 * 2.0 ** -3')
1235 self.assertEqual(bin(0.0), '0b0 * 2.0 ** 0')
1236 for sv in float('nan'), float('inf'), float('-inf'):
1237 self.assertEqual(bin(sv), repr(sv))
1238 for i in range(100):
1239 x = random.expovariate(.05)
1240 self.assertEqual(eval(bin(x)), x)
1241 self.assertEqual(eval(bin(-x)), -x)
1242 self.assertEqual(bin(-x), ('-' + bin(x)))
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001243
Raymond Hettinger64958a12003-12-17 20:43:33 +00001244class TestSorted(unittest.TestCase):
1245
1246 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001247 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001248 copy = data[:]
1249 random.shuffle(copy)
1250 self.assertEqual(data, sorted(copy))
1251 self.assertNotEqual(data, copy)
1252
1253 data.reverse()
1254 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001255 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1256 self.assertNotEqual(data, copy)
1257 random.shuffle(copy)
1258 self.assertEqual(data, sorted(copy, reverse=1))
1259 self.assertNotEqual(data, copy)
1260
1261 def test_inputtypes(self):
1262 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001263 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001264 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001265 self.assertEqual(sorted(s), sorted(T(s)))
1266
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001267 s = ''.join(set(s)) # unique letters only
1268 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001269 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001270 self.assertEqual(sorted(s), sorted(T(s)))
1271
1272 def test_baddecorator(self):
1273 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1274 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1275
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001276def test_main(verbose=None):
1277 test_classes = (BuiltinTest, TestSorted)
1278
1279 run_unittest(*test_classes)
1280
1281 # verify reference counting
1282 if verbose and hasattr(sys, "gettotalrefcount"):
1283 import gc
1284 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001285 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001286 run_unittest(*test_classes)
1287 gc.collect()
1288 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001289 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001290
Walter Dörwald919497e2003-01-19 16:23:59 +00001291
1292if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001293 test_main(verbose=True)