blob: f8d4ae0e44d6c1559b177586fd0d801a80aee471 [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)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000219 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000220
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000221 def test_cmp(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000222 self.assertEqual(cmp(-1, 1), -1)
223 self.assertEqual(cmp(1, -1), 1)
224 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000225 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000226 a = []; a.append(a)
227 b = []; b.append(b)
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000228 from collections import UserList
Walter Dörwald919497e2003-01-19 16:23:59 +0000229 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000230 self.assertRaises(RuntimeError, cmp, a, b)
231 self.assertRaises(RuntimeError, cmp, b, c)
232 self.assertRaises(RuntimeError, cmp, c, a)
233 self.assertRaises(RuntimeError, cmp, a, c)
234 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 a.pop(); b.pop(); c.pop()
236 self.assertRaises(TypeError, cmp)
237
Walter Dörwald919497e2003-01-19 16:23:59 +0000238 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000239 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000240 bom = b'\xef\xbb\xbf'
241 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000242 compile(source='pass', filename='?', mode='exec')
243 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
244 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000245 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000246 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
247 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000248 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000249 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
250 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000251 compile('print("\xe5")\n', '', 'exec')
252 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
253 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 def test_delattr(self):
256 import sys
257 sys.spam = 1
258 delattr(sys, 'spam')
259 self.assertRaises(TypeError, delattr)
260
261 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000262 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000263 self.assertRaises(TypeError, dir, 42, 42)
264
Georg Brandle32b4222007-03-10 22:13:27 +0000265 # dir() - local scope
266 local_var = 1
267 self.assert_('local_var' in dir())
268
269 # dir(module)
270 import sys
271 self.assert_('exit' in dir(sys))
272
273 # dir(module_with_invalid__dict__)
274 import types
275 class Foo(types.ModuleType):
276 __dict__ = 8
277 f = Foo("foo")
278 self.assertRaises(TypeError, dir, f)
279
280 # dir(type)
281 self.assert_("strip" in dir(str))
282 self.assert_("__mro__" not in dir(str))
283
284 # dir(obj)
285 class Foo(object):
286 def __init__(self):
287 self.x = 7
288 self.y = 8
289 self.z = 9
290 f = Foo()
291 self.assert_("y" in dir(f))
292
293 # dir(obj_no__dict__)
294 class Foo(object):
295 __slots__ = []
296 f = Foo()
297 self.assert_("__repr__" in dir(f))
298
299 # dir(obj_no__class__with__dict__)
300 # (an ugly trick to cause getattr(f, "__class__") to fail)
301 class Foo(object):
302 __slots__ = ["__class__", "__dict__"]
303 def __init__(self):
304 self.bar = "wow"
305 f = Foo()
306 self.assert_("__repr__" not in dir(f))
307 self.assert_("bar" in dir(f))
308
309 # dir(obj_using __dir__)
310 class Foo(object):
311 def __dir__(self):
312 return ["kan", "ga", "roo"]
313 f = Foo()
314 self.assert_(dir(f) == ["ga", "kan", "roo"])
315
316 # dir(obj__dir__not_list)
317 class Foo(object):
318 def __dir__(self):
319 return 7
320 f = Foo()
321 self.assertRaises(TypeError, dir, f)
322
Collin Winter3eed7652007-08-14 17:53:54 +0000323 # dir(traceback)
324 try:
325 raise IndexError
326 except:
327 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
328
329
Walter Dörwald919497e2003-01-19 16:23:59 +0000330 def test_divmod(self):
331 self.assertEqual(divmod(12, 7), (1, 5))
332 self.assertEqual(divmod(-12, 7), (-2, 2))
333 self.assertEqual(divmod(12, -7), (-2, -2))
334 self.assertEqual(divmod(-12, -7), (1, -5))
335
Guido van Rossume2a383d2007-01-15 16:59:06 +0000336 self.assertEqual(divmod(12, 7), (1, 5))
337 self.assertEqual(divmod(-12, 7), (-2, 2))
338 self.assertEqual(divmod(12, -7), (-2, -2))
339 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000340
Guido van Rossume2a383d2007-01-15 16:59:06 +0000341 self.assertEqual(divmod(12, 7), (1, 5))
342 self.assertEqual(divmod(-12, 7), (-2, 2))
343 self.assertEqual(divmod(12, -7), (-2, -2))
344 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000345
Christian Heimesa37d4c62007-12-04 23:02:19 +0000346 self.assertEqual(divmod(-sys.maxsize-1, -1),
347 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000348
Walter Dörwald919497e2003-01-19 16:23:59 +0000349 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
350 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
351 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
352 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
353
354 self.assertRaises(TypeError, divmod)
355
356 def test_eval(self):
357 self.assertEqual(eval('1+1'), 2)
358 self.assertEqual(eval(' 1+1\n'), 2)
359 globals = {'a': 1, 'b': 2}
360 locals = {'b': 200, 'c': 300}
361 self.assertEqual(eval('a', globals) , 1)
362 self.assertEqual(eval('a', globals, locals), 1)
363 self.assertEqual(eval('b', globals, locals), 200)
364 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000365 globals = {'a': 1, 'b': 2}
366 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000367 bom = b'\xef\xbb\xbf'
368 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000369 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000370 self.assertRaises(TypeError, eval)
371 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000372 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000373
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000374 def test_general_eval(self):
375 # Tests that general mappings can be used for the locals argument
376
377 class M:
378 "Test mapping interface versus possible calls from eval()."
379 def __getitem__(self, key):
380 if key == 'a':
381 return 12
382 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000383 def keys(self):
384 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000385
386 m = M()
387 g = globals()
388 self.assertEqual(eval('a', g, m), 12)
389 self.assertRaises(NameError, eval, 'b', g, m)
390 self.assertEqual(eval('dir()', g, m), list('xyz'))
391 self.assertEqual(eval('globals()', g, m), g)
392 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000393 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000394 class A:
395 "Non-mapping"
396 pass
397 m = A()
398 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000399
400 # Verify that dict subclasses work as well
401 class D(dict):
402 def __getitem__(self, key):
403 if key == 'a':
404 return 12
405 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000406 def keys(self):
407 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000408
409 d = D()
410 self.assertEqual(eval('a', g, d), 12)
411 self.assertRaises(NameError, eval, 'b', g, d)
412 self.assertEqual(eval('dir()', g, d), list('xyz'))
413 self.assertEqual(eval('globals()', g, d), g)
414 self.assertEqual(eval('locals()', g, d), d)
415
416 # Verify locals stores (used by list comps)
417 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000418 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000419
420 class SpreadSheet:
421 "Sample application showing nested, calculated lookups."
422 _cells = {}
423 def __setitem__(self, key, formula):
424 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000425 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000426 return eval(self._cells[key], globals(), self)
427
428 ss = SpreadSheet()
429 ss['a1'] = '5'
430 ss['a2'] = 'a1*6'
431 ss['a3'] = 'a2*7'
432 self.assertEqual(ss['a3'], 210)
433
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000434 # Verify that dir() catches a non-list returned by eval
435 # SF bug #1004669
436 class C:
437 def __getitem__(self, item):
438 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000439 def keys(self):
440 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000441 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
442
Georg Brandl7cae87c2006-09-06 06:51:57 +0000443 def test_exec(self):
444 g = {}
445 exec('z = 1', g)
446 if '__builtins__' in g:
447 del g['__builtins__']
448 self.assertEqual(g, {'z': 1})
449
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000450 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000451 if '__builtins__' in g:
452 del g['__builtins__']
453 self.assertEqual(g, {'z': 2})
454 g = {}
455 l = {}
456
457 import warnings
458 warnings.filterwarnings("ignore", "global statement", module="<string>")
459 exec('global a; a = 1; b = 2', g, l)
460 if '__builtins__' in g:
461 del g['__builtins__']
462 if '__builtins__' in l:
463 del l['__builtins__']
464 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
465
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000466 def test_exec_redirected(self):
467 savestdout = sys.stdout
468 sys.stdout = None # Whatever that cannot flush()
469 try:
470 # Used to raise SystemError('error return without exception set')
471 exec('a')
472 except NameError:
473 pass
474 finally:
475 sys.stdout = savestdout
476
Walter Dörwald919497e2003-01-19 16:23:59 +0000477 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000478 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
479 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
480 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
481 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
482 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000483 def identity(item):
484 return 1
485 filter(identity, Squares(5))
486 self.assertRaises(TypeError, filter)
487 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000488 def __getitem__(self, index):
489 if index<4:
490 return 42
491 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000492 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000493 def badfunc():
494 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000495 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000496
Walter Dörwaldbf517072003-01-27 15:57:14 +0000497 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000498 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
499 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
500 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000501
Walter Dörwald919497e2003-01-19 16:23:59 +0000502 def test_getattr(self):
503 import sys
504 self.assert_(getattr(sys, 'stdout') is sys.stdout)
505 self.assertRaises(TypeError, getattr, sys, 1)
506 self.assertRaises(TypeError, getattr, sys, 1, "foo")
507 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000508 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000509
510 def test_hasattr(self):
511 import sys
512 self.assert_(hasattr(sys, 'stdout'))
513 self.assertRaises(TypeError, hasattr, sys, 1)
514 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000515 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000516
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000517 # Check that hasattr allows SystemExit and KeyboardInterrupts by
518 class A:
519 def __getattr__(self, what):
520 raise KeyboardInterrupt
521 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
522 class B:
523 def __getattr__(self, what):
524 raise SystemExit
525 self.assertRaises(SystemExit, hasattr, B(), "b")
526
Walter Dörwald919497e2003-01-19 16:23:59 +0000527 def test_hash(self):
528 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000529 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000530 self.assertEqual(hash(1), hash(1.0))
531 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000532 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000533 hash((0,1,2,3))
534 def f(): pass
535 self.assertRaises(TypeError, hash, [])
536 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000537 # Bug 1536021: Allow hash to return long objects
538 class X:
539 def __hash__(self):
540 return 2**100
541 self.assertEquals(type(hash(X())), int)
542 class Y(object):
543 def __hash__(self):
544 return 2**100
545 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000546 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000547 def __hash__(self):
548 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000549 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000550
551 def test_hex(self):
552 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000553 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000554 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000555 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000556 self.assertRaises(TypeError, hex, {})
557
558 def test_id(self):
559 id(None)
560 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000561 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000562 id(1.0)
563 id('spam')
564 id((0,1,2,3))
565 id([0,1,2,3])
566 id({'spam': 1, 'eggs': 2, 'ham': 3})
567
Guido van Rossuma88a0332007-02-26 16:59:55 +0000568 # Test input() later, alphabetized as if it were raw_input
569
Walter Dörwald919497e2003-01-19 16:23:59 +0000570 def test_iter(self):
571 self.assertRaises(TypeError, iter)
572 self.assertRaises(TypeError, iter, 42, 42)
573 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000574 for l in lists:
575 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000576 self.assertEqual(next(i), '1')
577 self.assertEqual(next(i), '2')
578 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000579
580 def test_isinstance(self):
581 class C:
582 pass
583 class D(C):
584 pass
585 class E:
586 pass
587 c = C()
588 d = D()
589 e = E()
590 self.assert_(isinstance(c, C))
591 self.assert_(isinstance(d, C))
592 self.assert_(not isinstance(e, C))
593 self.assert_(not isinstance(c, D))
594 self.assert_(not isinstance('foo', E))
595 self.assertRaises(TypeError, isinstance, E, 'foo')
596 self.assertRaises(TypeError, isinstance)
597
598 def test_issubclass(self):
599 class C:
600 pass
601 class D(C):
602 pass
603 class E:
604 pass
605 c = C()
606 d = D()
607 e = E()
608 self.assert_(issubclass(D, C))
609 self.assert_(issubclass(C, C))
610 self.assert_(not issubclass(C, D))
611 self.assertRaises(TypeError, issubclass, 'foo', E)
612 self.assertRaises(TypeError, issubclass, E, 'foo')
613 self.assertRaises(TypeError, issubclass)
614
615 def test_len(self):
616 self.assertEqual(len('123'), 3)
617 self.assertEqual(len(()), 0)
618 self.assertEqual(len((1, 2, 3, 4)), 4)
619 self.assertEqual(len([1, 2, 3, 4]), 4)
620 self.assertEqual(len({}), 0)
621 self.assertEqual(len({'a':1, 'b': 2}), 2)
622 class BadSeq:
623 def __len__(self):
624 raise ValueError
625 self.assertRaises(ValueError, len, BadSeq())
626
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())
738 class BadNumber:
739 def __cmp__(self, other):
740 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000741 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000742
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000743 for stmt in (
744 "min(key=int)", # no args
745 "min(1, key=int)", # single arg not iterable
746 "min(1, 2, keystone=int)", # wrong keyword
747 "min(1, 2, key=int, abc=int)", # two many keywords
748 "min(1, 2, key=1)", # keyfunc is not callable
749 ):
Tim Peters7f061872004-12-07 21:17:46 +0000750 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000751 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000752 except TypeError:
753 pass
754 else:
755 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000756
757 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
758 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
759 self.assertEqual(min(1, 2, key=neg), 2) # two elems
760
761 data = [random.randrange(200) for i in range(100)]
762 keys = dict((elem, random.randrange(50)) for elem in data)
763 f = keys.__getitem__
764 self.assertEqual(min(data, key=f),
765 sorted(data, key=f)[0])
766
Georg Brandla18af4e2007-04-21 15:47:16 +0000767 def test_next(self):
768 it = iter(range(2))
769 self.assertEqual(next(it), 0)
770 self.assertEqual(next(it), 1)
771 self.assertRaises(StopIteration, next, it)
772 self.assertRaises(StopIteration, next, it)
773 self.assertEquals(next(it, 42), 42)
774
775 class Iter(object):
776 def __iter__(self):
777 return self
778 def __next__(self):
779 raise StopIteration
780
781 it = iter(Iter())
782 self.assertEquals(next(it, 42), 42)
783 self.assertRaises(StopIteration, next, it)
784
785 def gen():
786 yield 1
787 return
788
789 it = gen()
790 self.assertEquals(next(it), 1)
791 self.assertRaises(StopIteration, next, it)
792 self.assertEquals(next(it, 42), 42)
793
Walter Dörwald919497e2003-01-19 16:23:59 +0000794 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000795 self.assertEqual(oct(100), '0o144')
796 self.assertEqual(oct(100), '0o144')
797 self.assertEqual(oct(-100), '-0o144')
798 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000799 self.assertRaises(TypeError, oct, ())
800
801 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000802 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000803 fp = open(TESTFN, 'w')
804 try:
805 fp.write('1+1\n')
806 fp.write('1+1\n')
807 fp.write('The quick brown fox jumps over the lazy dog')
808 fp.write('.\n')
809 fp.write('Dear John\n')
810 fp.write('XXX'*100)
811 fp.write('YYY'*100)
812 finally:
813 fp.close()
814
815 def test_open(self):
816 self.write_testfile()
817 fp = open(TESTFN, 'r')
818 try:
819 self.assertEqual(fp.readline(4), '1+1\n')
820 self.assertEqual(fp.readline(4), '1+1\n')
821 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
822 self.assertEqual(fp.readline(4), 'Dear')
823 self.assertEqual(fp.readline(100), ' John\n')
824 self.assertEqual(fp.read(300), 'XXX'*100)
825 self.assertEqual(fp.read(1000), 'YYY'*100)
826 finally:
827 fp.close()
828 unlink(TESTFN)
829
830 def test_ord(self):
831 self.assertEqual(ord(' '), 32)
832 self.assertEqual(ord('A'), 65)
833 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000834 self.assertEqual(ord('\x80'), 128)
835 self.assertEqual(ord('\xff'), 255)
836
837 self.assertEqual(ord(b' '), 32)
838 self.assertEqual(ord(b'A'), 65)
839 self.assertEqual(ord(b'a'), 97)
840 self.assertEqual(ord(b'\x80'), 128)
841 self.assertEqual(ord(b'\xff'), 255)
842
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000843 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000844 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000845
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000846 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
847 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
848 self.assertEqual(ord("\U00010000"), 0x00010000)
849 self.assertEqual(ord("\U00010001"), 0x00010001)
850 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
851 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
852 self.assertEqual(ord("\U00100000"), 0x00100000)
853 self.assertEqual(ord("\U00100001"), 0x00100001)
854 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
855 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
856
Walter Dörwald919497e2003-01-19 16:23:59 +0000857 def test_pow(self):
858 self.assertEqual(pow(0,0), 1)
859 self.assertEqual(pow(0,1), 0)
860 self.assertEqual(pow(1,0), 1)
861 self.assertEqual(pow(1,1), 1)
862
863 self.assertEqual(pow(2,0), 1)
864 self.assertEqual(pow(2,10), 1024)
865 self.assertEqual(pow(2,20), 1024*1024)
866 self.assertEqual(pow(2,30), 1024*1024*1024)
867
868 self.assertEqual(pow(-2,0), 1)
869 self.assertEqual(pow(-2,1), -2)
870 self.assertEqual(pow(-2,2), 4)
871 self.assertEqual(pow(-2,3), -8)
872
Guido van Rossume2a383d2007-01-15 16:59:06 +0000873 self.assertEqual(pow(0,0), 1)
874 self.assertEqual(pow(0,1), 0)
875 self.assertEqual(pow(1,0), 1)
876 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000877
Guido van Rossume2a383d2007-01-15 16:59:06 +0000878 self.assertEqual(pow(2,0), 1)
879 self.assertEqual(pow(2,10), 1024)
880 self.assertEqual(pow(2,20), 1024*1024)
881 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000882
Guido van Rossume2a383d2007-01-15 16:59:06 +0000883 self.assertEqual(pow(-2,0), 1)
884 self.assertEqual(pow(-2,1), -2)
885 self.assertEqual(pow(-2,2), 4)
886 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000887
888 self.assertAlmostEqual(pow(0.,0), 1.)
889 self.assertAlmostEqual(pow(0.,1), 0.)
890 self.assertAlmostEqual(pow(1.,0), 1.)
891 self.assertAlmostEqual(pow(1.,1), 1.)
892
893 self.assertAlmostEqual(pow(2.,0), 1.)
894 self.assertAlmostEqual(pow(2.,10), 1024.)
895 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
896 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
897
898 self.assertAlmostEqual(pow(-2.,0), 1.)
899 self.assertAlmostEqual(pow(-2.,1), -2.)
900 self.assertAlmostEqual(pow(-2.,2), 4.)
901 self.assertAlmostEqual(pow(-2.,3), -8.)
902
Guido van Rossume2a383d2007-01-15 16:59:06 +0000903 for x in 2, 2, 2.0:
904 for y in 10, 10, 10.0:
905 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 if isinstance(x, float) or \
907 isinstance(y, float) or \
908 isinstance(z, float):
909 self.assertRaises(TypeError, pow, x, y, z)
910 else:
911 self.assertAlmostEqual(pow(x, y, z), 24.0)
912
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000913 self.assertAlmostEqual(pow(-1, 0.5), 1j)
914 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
915
Walter Dörwald919497e2003-01-19 16:23:59 +0000916 self.assertRaises(TypeError, pow, -1, -2, 3)
917 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000918 self.assertRaises(TypeError, pow, -1, -2, 3)
919 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000920
921 self.assertRaises(TypeError, pow)
922
923 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000924 self.assertEqual(list(range(3)), [0, 1, 2])
925 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
926 self.assertEqual(list(range(0)), [])
927 self.assertEqual(list(range(-3)), [])
928 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
929 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000930
Guido van Rossum805365e2007-05-07 22:24:25 +0000931 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000932 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000933 self.assertEqual(list(range(-2**100)), [])
934 self.assertEqual(list(range(0, -2**100)), [])
935 self.assertEqual(list(range(0, 2**100, -1)), [])
936 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000937
Christian Heimesa37d4c62007-12-04 23:02:19 +0000938 a = int(10 * sys.maxsize)
939 b = int(100 * sys.maxsize)
940 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000941
Guido van Rossum805365e2007-05-07 22:24:25 +0000942 self.assertEqual(list(range(a, a+2)), [a, a+1])
943 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
944 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000945
Guido van Rossum805365e2007-05-07 22:24:25 +0000946 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000947 self.assert_(a in seq)
948 self.assert_(b not in seq)
949 self.assertEqual(len(seq), 2)
950
Guido van Rossum805365e2007-05-07 22:24:25 +0000951 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000952 self.assert_(b in seq)
953 self.assert_(a not in seq)
954 self.assertEqual(len(seq), 2)
955
Guido van Rossum805365e2007-05-07 22:24:25 +0000956 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000957 self.assert_(-a in seq)
958 self.assert_(-b not in seq)
959 self.assertEqual(len(seq), 2)
960
Walter Dörwald919497e2003-01-19 16:23:59 +0000961 self.assertRaises(TypeError, range)
962 self.assertRaises(TypeError, range, 1, 2, 3, 4)
963 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000964 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000965
966 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000967 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000968 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000969 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
970
971 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000972 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000973 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000974
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000975 # Reject floats when it would require PyLongs to represent.
976 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000977 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000978
Walter Dörwald357981e2003-04-15 18:59:28 +0000979 self.assertRaises(TypeError, range, 0, "spam")
980 self.assertRaises(TypeError, range, 0, 42, "spam")
981
Christian Heimesa37d4c62007-12-04 23:02:19 +0000982 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
983 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000984
Christian Heimesa37d4c62007-12-04 23:02:19 +0000985 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000986
Guido van Rossuma88a0332007-02-26 16:59:55 +0000987 def test_input(self):
988 self.write_testfile()
989 fp = open(TESTFN, 'r')
990 savestdin = sys.stdin
991 savestdout = sys.stdout # Eats the echo
992 try:
993 sys.stdin = fp
994 sys.stdout = BitBucket()
995 self.assertEqual(input(), "1+1")
996 self.assertEqual(input('testing\n'), "1+1")
997 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
998 self.assertEqual(input('testing\n'), 'Dear John')
999
1000 # SF 1535165: don't segfault on closed stdin
1001 # sys.stdout must be a regular file for triggering
1002 sys.stdout = savestdout
1003 sys.stdin.close()
1004 self.assertRaises(ValueError, input)
1005
1006 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001007 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001008 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001009 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001010 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001011 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001012 self.assertRaises(EOFError, input)
1013
1014 del sys.stdout
1015 self.assertRaises(RuntimeError, input, 'prompt')
1016 del sys.stdin
1017 self.assertRaises(RuntimeError, input, 'prompt')
1018 finally:
1019 sys.stdin = savestdin
1020 sys.stdout = savestdout
1021 fp.close()
1022 unlink(TESTFN)
1023
Walter Dörwald919497e2003-01-19 16:23:59 +00001024 def test_repr(self):
1025 self.assertEqual(repr(''), '\'\'')
1026 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001027 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001028 self.assertEqual(repr(()), '()')
1029 self.assertEqual(repr([]), '[]')
1030 self.assertEqual(repr({}), '{}')
1031 a = []
1032 a.append(a)
1033 self.assertEqual(repr(a), '[[...]]')
1034 a = {}
1035 a[0] = a
1036 self.assertEqual(repr(a), '{0: {...}}')
1037
1038 def test_round(self):
1039 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001040 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001041 self.assertEqual(round(1.0), 1.0)
1042 self.assertEqual(round(10.0), 10.0)
1043 self.assertEqual(round(1000000000.0), 1000000000.0)
1044 self.assertEqual(round(1e20), 1e20)
1045
1046 self.assertEqual(round(-1.0), -1.0)
1047 self.assertEqual(round(-10.0), -10.0)
1048 self.assertEqual(round(-1000000000.0), -1000000000.0)
1049 self.assertEqual(round(-1e20), -1e20)
1050
1051 self.assertEqual(round(0.1), 0.0)
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(-1.1), -1.0)
1057 self.assertEqual(round(-10.1), -10.0)
1058 self.assertEqual(round(-1000000000.1), -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(-0.9), -1.0)
1065 self.assertEqual(round(-9.9), -10.0)
1066 self.assertEqual(round(-999999999.9), -1000000000.0)
1067
1068 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001069 self.assertEqual(type(round(-8.0, -1)), float)
1070
1071 self.assertEqual(type(round(-8.0, 0)), float)
1072 self.assertEqual(type(round(-8.0, 1)), float)
1073
1074 # Check even / odd rounding behaviour
1075 self.assertEqual(round(5.5), 6)
1076 self.assertEqual(round(6.5), 6)
1077 self.assertEqual(round(-5.5), -6)
1078 self.assertEqual(round(-6.5), -6)
1079
1080 # Check behavior on ints
1081 self.assertEqual(round(0), 0)
1082 self.assertEqual(round(8), 8)
1083 self.assertEqual(round(-8), -8)
1084 self.assertEqual(type(round(0)), int)
1085 self.assertEqual(type(round(-8, -1)), float)
1086 self.assertEqual(type(round(-8, 0)), float)
1087 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001088
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 # test new kwargs
1090 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1091
Walter Dörwald919497e2003-01-19 16:23:59 +00001092 self.assertRaises(TypeError, round)
1093
Alex Martelliae211f92007-08-22 23:21:33 +00001094 # test generic rounding delegation for reals
1095 class TestRound:
1096 def __round__(self):
1097 return 23
1098
1099 class TestNoRound:
1100 pass
1101
1102 self.assertEqual(round(TestRound()), 23)
1103
1104 self.assertRaises(TypeError, round, 1, 2, 3)
1105 self.assertRaises(TypeError, round, TestNoRound())
1106
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001107 t = TestNoRound()
1108 t.__round__ = lambda *args: args
1109 self.assertRaises(TypeError, round, t)
1110 self.assertRaises(TypeError, round, t, 0)
1111
Walter Dörwald919497e2003-01-19 16:23:59 +00001112 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001113 setattr(sys, 'spam', 1)
1114 self.assertEqual(sys.spam, 1)
1115 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1116 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001117
Walter Dörwald919497e2003-01-19 16:23:59 +00001118
Alex Martellia70b1912003-04-22 08:12:33 +00001119 def test_sum(self):
1120 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001121 self.assertEqual(sum(list(range(2,8))), 27)
1122 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001123 self.assertEqual(sum(Squares(10)), 285)
1124 self.assertEqual(sum(iter(Squares(10))), 285)
1125 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1126
1127 self.assertRaises(TypeError, sum)
1128 self.assertRaises(TypeError, sum, 42)
1129 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1130 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1131 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1132 self.assertRaises(TypeError, sum, [{2:3}])
1133 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1134
1135 class BadSeq:
1136 def __getitem__(self, index):
1137 raise ValueError
1138 self.assertRaises(ValueError, sum, BadSeq())
1139
Walter Dörwald919497e2003-01-19 16:23:59 +00001140 def test_type(self):
1141 self.assertEqual(type(''), type('123'))
1142 self.assertNotEqual(type(''), type(()))
1143
Guido van Rossumfee7b932005-01-16 00:21:28 +00001144 # We don't want self in vars(), so these are static methods
1145
1146 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001147 def get_vars_f0():
1148 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
Guido van Rossumfee7b932005-01-16 00:21:28 +00001150 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001151 def get_vars_f2():
1152 BuiltinTest.get_vars_f0()
1153 a = 1
1154 b = 2
1155 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001156
1157 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001158 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001160 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001161 self.assertEqual(self.get_vars_f0(), {})
1162 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1163 self.assertRaises(TypeError, vars, 42, 42)
1164 self.assertRaises(TypeError, vars, 42)
1165
1166 def test_zip(self):
1167 a = (1, 2, 3)
1168 b = (4, 5, 6)
1169 t = [(1, 4), (2, 5), (3, 6)]
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 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001172 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001173 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001174 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 class I:
1176 def __getitem__(self, i):
1177 if i < 0 or i > 2: raise IndexError
1178 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001179 self.assertEqual(list(zip(a, I())), t)
1180 self.assertEqual(list(zip()), [])
1181 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001182 self.assertRaises(TypeError, zip, None)
1183 class G:
1184 pass
1185 self.assertRaises(TypeError, zip, a, G())
1186
1187 # Make sure zip doesn't try to allocate a billion elements for the
1188 # result list when one of its arguments doesn't say how long it is.
1189 # A MemoryError is the most likely failure mode.
1190 class SequenceWithoutALength:
1191 def __getitem__(self, i):
1192 if i == 5:
1193 raise IndexError
1194 else:
1195 return i
1196 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001197 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001198 list(enumerate(range(5)))
1199 )
1200
1201 class BadSeq:
1202 def __getitem__(self, i):
1203 if i == 5:
1204 raise ValueError
1205 else:
1206 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001207 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001208
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001209 def test_bin(self):
1210 self.assertEqual(bin(0), '0b0')
1211 self.assertEqual(bin(1), '0b1')
1212 self.assertEqual(bin(-1), '-0b1')
1213 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1214 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1215 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1216 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1217
Raymond Hettinger64958a12003-12-17 20:43:33 +00001218class TestSorted(unittest.TestCase):
1219
1220 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001221 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001222 copy = data[:]
1223 random.shuffle(copy)
1224 self.assertEqual(data, sorted(copy))
1225 self.assertNotEqual(data, copy)
1226
1227 data.reverse()
1228 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001229 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1230 self.assertNotEqual(data, copy)
1231 random.shuffle(copy)
1232 self.assertEqual(data, sorted(copy, reverse=1))
1233 self.assertNotEqual(data, copy)
1234
1235 def test_inputtypes(self):
1236 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001237 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001238 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001239 self.assertEqual(sorted(s), sorted(T(s)))
1240
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001241 s = ''.join(set(s)) # unique letters only
1242 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001243 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001244 self.assertEqual(sorted(s), sorted(T(s)))
1245
1246 def test_baddecorator(self):
1247 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1248 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1249
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001250def test_main(verbose=None):
1251 test_classes = (BuiltinTest, TestSorted)
1252
1253 run_unittest(*test_classes)
1254
1255 # verify reference counting
1256 if verbose and hasattr(sys, "gettotalrefcount"):
1257 import gc
1258 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001259 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001260 run_unittest(*test_classes)
1261 gc.collect()
1262 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001263 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001264
Walter Dörwald919497e2003-01-19 16:23:59 +00001265
1266if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001267 test_main(verbose=True)