blob: 7175b80c88aa3ab5fb6fd3d60e6a927e23af1e84 [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')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000245 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000246 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000247 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
248 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000249 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000250 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
251 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000252 compile('print("\xe5")\n', '', 'exec')
253 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
254 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000255
Walter Dörwald919497e2003-01-19 16:23:59 +0000256 def test_delattr(self):
257 import sys
258 sys.spam = 1
259 delattr(sys, 'spam')
260 self.assertRaises(TypeError, delattr)
261
262 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000263 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000264 self.assertRaises(TypeError, dir, 42, 42)
265
Georg Brandle32b4222007-03-10 22:13:27 +0000266 # dir() - local scope
267 local_var = 1
268 self.assert_('local_var' in dir())
269
270 # dir(module)
271 import sys
272 self.assert_('exit' in dir(sys))
273
274 # dir(module_with_invalid__dict__)
275 import types
276 class Foo(types.ModuleType):
277 __dict__ = 8
278 f = Foo("foo")
279 self.assertRaises(TypeError, dir, f)
280
281 # dir(type)
282 self.assert_("strip" in dir(str))
283 self.assert_("__mro__" not in dir(str))
284
285 # dir(obj)
286 class Foo(object):
287 def __init__(self):
288 self.x = 7
289 self.y = 8
290 self.z = 9
291 f = Foo()
292 self.assert_("y" in dir(f))
293
294 # dir(obj_no__dict__)
295 class Foo(object):
296 __slots__ = []
297 f = Foo()
298 self.assert_("__repr__" in dir(f))
299
300 # dir(obj_no__class__with__dict__)
301 # (an ugly trick to cause getattr(f, "__class__") to fail)
302 class Foo(object):
303 __slots__ = ["__class__", "__dict__"]
304 def __init__(self):
305 self.bar = "wow"
306 f = Foo()
307 self.assert_("__repr__" not in dir(f))
308 self.assert_("bar" in dir(f))
309
310 # dir(obj_using __dir__)
311 class Foo(object):
312 def __dir__(self):
313 return ["kan", "ga", "roo"]
314 f = Foo()
315 self.assert_(dir(f) == ["ga", "kan", "roo"])
316
317 # dir(obj__dir__not_list)
318 class Foo(object):
319 def __dir__(self):
320 return 7
321 f = Foo()
322 self.assertRaises(TypeError, dir, f)
323
Collin Winter3eed7652007-08-14 17:53:54 +0000324 # dir(traceback)
325 try:
326 raise IndexError
327 except:
328 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
329
330
Walter Dörwald919497e2003-01-19 16:23:59 +0000331 def test_divmod(self):
332 self.assertEqual(divmod(12, 7), (1, 5))
333 self.assertEqual(divmod(-12, 7), (-2, 2))
334 self.assertEqual(divmod(12, -7), (-2, -2))
335 self.assertEqual(divmod(-12, -7), (1, -5))
336
Guido van Rossume2a383d2007-01-15 16:59:06 +0000337 self.assertEqual(divmod(12, 7), (1, 5))
338 self.assertEqual(divmod(-12, 7), (-2, 2))
339 self.assertEqual(divmod(12, -7), (-2, -2))
340 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000341
Guido van Rossume2a383d2007-01-15 16:59:06 +0000342 self.assertEqual(divmod(12, 7), (1, 5))
343 self.assertEqual(divmod(-12, 7), (-2, 2))
344 self.assertEqual(divmod(12, -7), (-2, -2))
345 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000346
Christian Heimesa37d4c62007-12-04 23:02:19 +0000347 self.assertEqual(divmod(-sys.maxsize-1, -1),
348 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000349
Walter Dörwald919497e2003-01-19 16:23:59 +0000350 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
351 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
352 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
353 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
354
355 self.assertRaises(TypeError, divmod)
356
357 def test_eval(self):
358 self.assertEqual(eval('1+1'), 2)
359 self.assertEqual(eval(' 1+1\n'), 2)
360 globals = {'a': 1, 'b': 2}
361 locals = {'b': 200, 'c': 300}
362 self.assertEqual(eval('a', globals) , 1)
363 self.assertEqual(eval('a', globals, locals), 1)
364 self.assertEqual(eval('b', globals, locals), 200)
365 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000366 globals = {'a': 1, 'b': 2}
367 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000368 bom = b'\xef\xbb\xbf'
369 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000370 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000371 self.assertRaises(TypeError, eval)
372 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000373 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000374
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000375 def test_general_eval(self):
376 # Tests that general mappings can be used for the locals argument
377
378 class M:
379 "Test mapping interface versus possible calls from eval()."
380 def __getitem__(self, key):
381 if key == 'a':
382 return 12
383 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000384 def keys(self):
385 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000386
387 m = M()
388 g = globals()
389 self.assertEqual(eval('a', g, m), 12)
390 self.assertRaises(NameError, eval, 'b', g, m)
391 self.assertEqual(eval('dir()', g, m), list('xyz'))
392 self.assertEqual(eval('globals()', g, m), g)
393 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000394 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000395 class A:
396 "Non-mapping"
397 pass
398 m = A()
399 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000400
401 # Verify that dict subclasses work as well
402 class D(dict):
403 def __getitem__(self, key):
404 if key == 'a':
405 return 12
406 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000407 def keys(self):
408 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000409
410 d = D()
411 self.assertEqual(eval('a', g, d), 12)
412 self.assertRaises(NameError, eval, 'b', g, d)
413 self.assertEqual(eval('dir()', g, d), list('xyz'))
414 self.assertEqual(eval('globals()', g, d), g)
415 self.assertEqual(eval('locals()', g, d), d)
416
417 # Verify locals stores (used by list comps)
418 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000419 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000420
421 class SpreadSheet:
422 "Sample application showing nested, calculated lookups."
423 _cells = {}
424 def __setitem__(self, key, formula):
425 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000426 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000427 return eval(self._cells[key], globals(), self)
428
429 ss = SpreadSheet()
430 ss['a1'] = '5'
431 ss['a2'] = 'a1*6'
432 ss['a3'] = 'a2*7'
433 self.assertEqual(ss['a3'], 210)
434
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000435 # Verify that dir() catches a non-list returned by eval
436 # SF bug #1004669
437 class C:
438 def __getitem__(self, item):
439 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000440 def keys(self):
441 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000442 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
443
Georg Brandl7cae87c2006-09-06 06:51:57 +0000444 def test_exec(self):
445 g = {}
446 exec('z = 1', g)
447 if '__builtins__' in g:
448 del g['__builtins__']
449 self.assertEqual(g, {'z': 1})
450
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000451 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000452 if '__builtins__' in g:
453 del g['__builtins__']
454 self.assertEqual(g, {'z': 2})
455 g = {}
456 l = {}
457
458 import warnings
459 warnings.filterwarnings("ignore", "global statement", module="<string>")
460 exec('global a; a = 1; b = 2', g, l)
461 if '__builtins__' in g:
462 del g['__builtins__']
463 if '__builtins__' in l:
464 del l['__builtins__']
465 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
466
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000467 def test_exec_redirected(self):
468 savestdout = sys.stdout
469 sys.stdout = None # Whatever that cannot flush()
470 try:
471 # Used to raise SystemError('error return without exception set')
472 exec('a')
473 except NameError:
474 pass
475 finally:
476 sys.stdout = savestdout
477
Walter Dörwald919497e2003-01-19 16:23:59 +0000478 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000479 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
480 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
481 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
482 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
483 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000484 def identity(item):
485 return 1
486 filter(identity, Squares(5))
487 self.assertRaises(TypeError, filter)
488 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000489 def __getitem__(self, index):
490 if index<4:
491 return 42
492 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000493 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000494 def badfunc():
495 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000496 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000497
Walter Dörwaldbf517072003-01-27 15:57:14 +0000498 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000499 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
500 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
501 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000502
Walter Dörwald919497e2003-01-19 16:23:59 +0000503 def test_getattr(self):
504 import sys
505 self.assert_(getattr(sys, 'stdout') is sys.stdout)
506 self.assertRaises(TypeError, getattr, sys, 1)
507 self.assertRaises(TypeError, getattr, sys, 1, "foo")
508 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000509 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000510
511 def test_hasattr(self):
512 import sys
513 self.assert_(hasattr(sys, 'stdout'))
514 self.assertRaises(TypeError, hasattr, sys, 1)
515 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000516 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000517
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000518 # Check that hasattr allows SystemExit and KeyboardInterrupts by
519 class A:
520 def __getattr__(self, what):
521 raise KeyboardInterrupt
522 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
523 class B:
524 def __getattr__(self, what):
525 raise SystemExit
526 self.assertRaises(SystemExit, hasattr, B(), "b")
527
Walter Dörwald919497e2003-01-19 16:23:59 +0000528 def test_hash(self):
529 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000530 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000531 self.assertEqual(hash(1), hash(1.0))
532 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000533 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000534 hash((0,1,2,3))
535 def f(): pass
536 self.assertRaises(TypeError, hash, [])
537 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000538 # Bug 1536021: Allow hash to return long objects
539 class X:
540 def __hash__(self):
541 return 2**100
542 self.assertEquals(type(hash(X())), int)
543 class Y(object):
544 def __hash__(self):
545 return 2**100
546 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000547 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000548 def __hash__(self):
549 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000550 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000551
552 def test_hex(self):
553 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000554 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000555 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000556 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000557 self.assertRaises(TypeError, hex, {})
558
559 def test_id(self):
560 id(None)
561 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000562 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000563 id(1.0)
564 id('spam')
565 id((0,1,2,3))
566 id([0,1,2,3])
567 id({'spam': 1, 'eggs': 2, 'ham': 3})
568
Guido van Rossuma88a0332007-02-26 16:59:55 +0000569 # Test input() later, alphabetized as if it were raw_input
570
Walter Dörwald919497e2003-01-19 16:23:59 +0000571 def test_iter(self):
572 self.assertRaises(TypeError, iter)
573 self.assertRaises(TypeError, iter, 42, 42)
574 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000575 for l in lists:
576 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000577 self.assertEqual(next(i), '1')
578 self.assertEqual(next(i), '2')
579 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000580
581 def test_isinstance(self):
582 class C:
583 pass
584 class D(C):
585 pass
586 class E:
587 pass
588 c = C()
589 d = D()
590 e = E()
591 self.assert_(isinstance(c, C))
592 self.assert_(isinstance(d, C))
593 self.assert_(not isinstance(e, C))
594 self.assert_(not isinstance(c, D))
595 self.assert_(not isinstance('foo', E))
596 self.assertRaises(TypeError, isinstance, E, 'foo')
597 self.assertRaises(TypeError, isinstance)
598
599 def test_issubclass(self):
600 class C:
601 pass
602 class D(C):
603 pass
604 class E:
605 pass
606 c = C()
607 d = D()
608 e = E()
609 self.assert_(issubclass(D, C))
610 self.assert_(issubclass(C, C))
611 self.assert_(not issubclass(C, D))
612 self.assertRaises(TypeError, issubclass, 'foo', E)
613 self.assertRaises(TypeError, issubclass, E, 'foo')
614 self.assertRaises(TypeError, issubclass)
615
616 def test_len(self):
617 self.assertEqual(len('123'), 3)
618 self.assertEqual(len(()), 0)
619 self.assertEqual(len((1, 2, 3, 4)), 4)
620 self.assertEqual(len([1, 2, 3, 4]), 4)
621 self.assertEqual(len({}), 0)
622 self.assertEqual(len({'a':1, 'b': 2}), 2)
623 class BadSeq:
624 def __len__(self):
625 raise ValueError
626 self.assertRaises(ValueError, len, BadSeq())
627
Walter Dörwald919497e2003-01-19 16:23:59 +0000628 def test_map(self):
629 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000630 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000631 [1, 4, 9]
632 )
633 try:
634 from math import sqrt
635 except ImportError:
636 def sqrt(x):
637 return pow(x, 0.5)
638 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000639 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000640 [[4.0, 2.0], [9.0, 3.0]]
641 )
642 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000643 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000644 [10, 4, 6]
645 )
646
647 def plus(*v):
648 accu = 0
649 for i in v: accu = accu + i
650 return accu
651 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000652 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000653 [1, 3, 7]
654 )
655 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000656 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000657 [1+4, 3+9, 7+2]
658 )
659 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000660 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 [1+4+1, 3+9+1, 7+2+0]
662 )
663 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000664 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000665 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
666 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000667 def Max(a, b):
668 if a is None:
669 return b
670 if b is None:
671 return a
672 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000673 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000674 list(map(Max, Squares(3), Squares(2))),
675 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000676 )
677 self.assertRaises(TypeError, map)
678 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000679 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000680 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000682 yield None
683 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000684 def badfunc(x):
685 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000686 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000687
688 def test_max(self):
689 self.assertEqual(max('123123'), '3')
690 self.assertEqual(max(1, 2, 3), 3)
691 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
692 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
693
Guido van Rossume2a383d2007-01-15 16:59:06 +0000694 self.assertEqual(max(1, 2, 3.0), 3.0)
695 self.assertEqual(max(1, 2.0, 3), 3)
696 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000697
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000698 for stmt in (
699 "max(key=int)", # no args
700 "max(1, key=int)", # single arg not iterable
701 "max(1, 2, keystone=int)", # wrong keyword
702 "max(1, 2, key=int, abc=int)", # two many keywords
703 "max(1, 2, key=1)", # keyfunc is not callable
704 ):
Tim Peters7f061872004-12-07 21:17:46 +0000705 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000706 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000707 except TypeError:
708 pass
709 else:
710 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000711
712 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
713 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
714 self.assertEqual(max(1, 2, key=neg), 1) # two elems
715
716 data = [random.randrange(200) for i in range(100)]
717 keys = dict((elem, random.randrange(50)) for elem in data)
718 f = keys.__getitem__
719 self.assertEqual(max(data, key=f),
720 sorted(reversed(data), key=f)[-1])
721
Walter Dörwald919497e2003-01-19 16:23:59 +0000722 def test_min(self):
723 self.assertEqual(min('123123'), '1')
724 self.assertEqual(min(1, 2, 3), 1)
725 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
726 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
727
Guido van Rossume2a383d2007-01-15 16:59:06 +0000728 self.assertEqual(min(1, 2, 3.0), 1)
729 self.assertEqual(min(1, 2.0, 3), 1)
730 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000731
732 self.assertRaises(TypeError, min)
733 self.assertRaises(TypeError, min, 42)
734 self.assertRaises(ValueError, min, ())
735 class BadSeq:
736 def __getitem__(self, index):
737 raise ValueError
738 self.assertRaises(ValueError, min, BadSeq())
739 class BadNumber:
740 def __cmp__(self, other):
741 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000742 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000743
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000744 for stmt in (
745 "min(key=int)", # no args
746 "min(1, key=int)", # single arg not iterable
747 "min(1, 2, keystone=int)", # wrong keyword
748 "min(1, 2, key=int, abc=int)", # two many keywords
749 "min(1, 2, key=1)", # keyfunc is not callable
750 ):
Tim Peters7f061872004-12-07 21:17:46 +0000751 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000752 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000753 except TypeError:
754 pass
755 else:
756 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000757
758 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
759 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
760 self.assertEqual(min(1, 2, key=neg), 2) # two elems
761
762 data = [random.randrange(200) for i in range(100)]
763 keys = dict((elem, random.randrange(50)) for elem in data)
764 f = keys.__getitem__
765 self.assertEqual(min(data, key=f),
766 sorted(data, key=f)[0])
767
Georg Brandla18af4e2007-04-21 15:47:16 +0000768 def test_next(self):
769 it = iter(range(2))
770 self.assertEqual(next(it), 0)
771 self.assertEqual(next(it), 1)
772 self.assertRaises(StopIteration, next, it)
773 self.assertRaises(StopIteration, next, it)
774 self.assertEquals(next(it, 42), 42)
775
776 class Iter(object):
777 def __iter__(self):
778 return self
779 def __next__(self):
780 raise StopIteration
781
782 it = iter(Iter())
783 self.assertEquals(next(it, 42), 42)
784 self.assertRaises(StopIteration, next, it)
785
786 def gen():
787 yield 1
788 return
789
790 it = gen()
791 self.assertEquals(next(it), 1)
792 self.assertRaises(StopIteration, next, it)
793 self.assertEquals(next(it, 42), 42)
794
Walter Dörwald919497e2003-01-19 16:23:59 +0000795 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000796 self.assertEqual(oct(100), '0o144')
797 self.assertEqual(oct(100), '0o144')
798 self.assertEqual(oct(-100), '-0o144')
799 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000800 self.assertRaises(TypeError, oct, ())
801
802 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000803 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 fp = open(TESTFN, 'w')
805 try:
806 fp.write('1+1\n')
807 fp.write('1+1\n')
808 fp.write('The quick brown fox jumps over the lazy dog')
809 fp.write('.\n')
810 fp.write('Dear John\n')
811 fp.write('XXX'*100)
812 fp.write('YYY'*100)
813 finally:
814 fp.close()
815
816 def test_open(self):
817 self.write_testfile()
818 fp = open(TESTFN, 'r')
819 try:
820 self.assertEqual(fp.readline(4), '1+1\n')
821 self.assertEqual(fp.readline(4), '1+1\n')
822 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
823 self.assertEqual(fp.readline(4), 'Dear')
824 self.assertEqual(fp.readline(100), ' John\n')
825 self.assertEqual(fp.read(300), 'XXX'*100)
826 self.assertEqual(fp.read(1000), 'YYY'*100)
827 finally:
828 fp.close()
829 unlink(TESTFN)
830
831 def test_ord(self):
832 self.assertEqual(ord(' '), 32)
833 self.assertEqual(ord('A'), 65)
834 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000835 self.assertEqual(ord('\x80'), 128)
836 self.assertEqual(ord('\xff'), 255)
837
838 self.assertEqual(ord(b' '), 32)
839 self.assertEqual(ord(b'A'), 65)
840 self.assertEqual(ord(b'a'), 97)
841 self.assertEqual(ord(b'\x80'), 128)
842 self.assertEqual(ord(b'\xff'), 255)
843
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000844 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000845 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000846
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000847 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
848 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
849 self.assertEqual(ord("\U00010000"), 0x00010000)
850 self.assertEqual(ord("\U00010001"), 0x00010001)
851 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
852 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
853 self.assertEqual(ord("\U00100000"), 0x00100000)
854 self.assertEqual(ord("\U00100001"), 0x00100001)
855 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
856 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
857
Walter Dörwald919497e2003-01-19 16:23:59 +0000858 def test_pow(self):
859 self.assertEqual(pow(0,0), 1)
860 self.assertEqual(pow(0,1), 0)
861 self.assertEqual(pow(1,0), 1)
862 self.assertEqual(pow(1,1), 1)
863
864 self.assertEqual(pow(2,0), 1)
865 self.assertEqual(pow(2,10), 1024)
866 self.assertEqual(pow(2,20), 1024*1024)
867 self.assertEqual(pow(2,30), 1024*1024*1024)
868
869 self.assertEqual(pow(-2,0), 1)
870 self.assertEqual(pow(-2,1), -2)
871 self.assertEqual(pow(-2,2), 4)
872 self.assertEqual(pow(-2,3), -8)
873
Guido van Rossume2a383d2007-01-15 16:59:06 +0000874 self.assertEqual(pow(0,0), 1)
875 self.assertEqual(pow(0,1), 0)
876 self.assertEqual(pow(1,0), 1)
877 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000878
Guido van Rossume2a383d2007-01-15 16:59:06 +0000879 self.assertEqual(pow(2,0), 1)
880 self.assertEqual(pow(2,10), 1024)
881 self.assertEqual(pow(2,20), 1024*1024)
882 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000883
Guido van Rossume2a383d2007-01-15 16:59:06 +0000884 self.assertEqual(pow(-2,0), 1)
885 self.assertEqual(pow(-2,1), -2)
886 self.assertEqual(pow(-2,2), 4)
887 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000888
889 self.assertAlmostEqual(pow(0.,0), 1.)
890 self.assertAlmostEqual(pow(0.,1), 0.)
891 self.assertAlmostEqual(pow(1.,0), 1.)
892 self.assertAlmostEqual(pow(1.,1), 1.)
893
894 self.assertAlmostEqual(pow(2.,0), 1.)
895 self.assertAlmostEqual(pow(2.,10), 1024.)
896 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
897 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
898
899 self.assertAlmostEqual(pow(-2.,0), 1.)
900 self.assertAlmostEqual(pow(-2.,1), -2.)
901 self.assertAlmostEqual(pow(-2.,2), 4.)
902 self.assertAlmostEqual(pow(-2.,3), -8.)
903
Guido van Rossume2a383d2007-01-15 16:59:06 +0000904 for x in 2, 2, 2.0:
905 for y in 10, 10, 10.0:
906 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000907 if isinstance(x, float) or \
908 isinstance(y, float) or \
909 isinstance(z, float):
910 self.assertRaises(TypeError, pow, x, y, z)
911 else:
912 self.assertAlmostEqual(pow(x, y, z), 24.0)
913
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000914 self.assertAlmostEqual(pow(-1, 0.5), 1j)
915 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
916
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 self.assertRaises(TypeError, pow, -1, -2, 3)
918 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000919 self.assertRaises(TypeError, pow, -1, -2, 3)
920 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000921
922 self.assertRaises(TypeError, pow)
923
924 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000925 self.assertEqual(list(range(3)), [0, 1, 2])
926 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
927 self.assertEqual(list(range(0)), [])
928 self.assertEqual(list(range(-3)), [])
929 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
930 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000931
Guido van Rossum805365e2007-05-07 22:24:25 +0000932 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000933 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000934 self.assertEqual(list(range(-2**100)), [])
935 self.assertEqual(list(range(0, -2**100)), [])
936 self.assertEqual(list(range(0, 2**100, -1)), [])
937 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000938
Christian Heimesa37d4c62007-12-04 23:02:19 +0000939 a = int(10 * sys.maxsize)
940 b = int(100 * sys.maxsize)
941 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000942
Guido van Rossum805365e2007-05-07 22:24:25 +0000943 self.assertEqual(list(range(a, a+2)), [a, a+1])
944 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
945 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000946
Guido van Rossum805365e2007-05-07 22:24:25 +0000947 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000948 self.assert_(a in seq)
949 self.assert_(b not in seq)
950 self.assertEqual(len(seq), 2)
951
Guido van Rossum805365e2007-05-07 22:24:25 +0000952 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000953 self.assert_(b in seq)
954 self.assert_(a not in seq)
955 self.assertEqual(len(seq), 2)
956
Guido van Rossum805365e2007-05-07 22:24:25 +0000957 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000958 self.assert_(-a in seq)
959 self.assert_(-b not in seq)
960 self.assertEqual(len(seq), 2)
961
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 self.assertRaises(TypeError, range)
963 self.assertRaises(TypeError, range, 1, 2, 3, 4)
964 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000965 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000966
967 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000968 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000969 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000970 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
971
972 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000973 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000974 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000975
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000976 # Reject floats when it would require PyLongs to represent.
977 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000978 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000979
Walter Dörwald357981e2003-04-15 18:59:28 +0000980 self.assertRaises(TypeError, range, 0, "spam")
981 self.assertRaises(TypeError, range, 0, 42, "spam")
982
Christian Heimesa37d4c62007-12-04 23:02:19 +0000983 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
984 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000985
Christian Heimesa37d4c62007-12-04 23:02:19 +0000986 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000987
Guido van Rossuma88a0332007-02-26 16:59:55 +0000988 def test_input(self):
989 self.write_testfile()
990 fp = open(TESTFN, 'r')
991 savestdin = sys.stdin
992 savestdout = sys.stdout # Eats the echo
993 try:
994 sys.stdin = fp
995 sys.stdout = BitBucket()
996 self.assertEqual(input(), "1+1")
997 self.assertEqual(input('testing\n'), "1+1")
998 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
999 self.assertEqual(input('testing\n'), 'Dear John')
1000
1001 # SF 1535165: don't segfault on closed stdin
1002 # sys.stdout must be a regular file for triggering
1003 sys.stdout = savestdout
1004 sys.stdin.close()
1005 self.assertRaises(ValueError, input)
1006
1007 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001008 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001009 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001010 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001011 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001012 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001013 self.assertRaises(EOFError, input)
1014
1015 del sys.stdout
1016 self.assertRaises(RuntimeError, input, 'prompt')
1017 del sys.stdin
1018 self.assertRaises(RuntimeError, input, 'prompt')
1019 finally:
1020 sys.stdin = savestdin
1021 sys.stdout = savestdout
1022 fp.close()
1023 unlink(TESTFN)
1024
Walter Dörwald919497e2003-01-19 16:23:59 +00001025 def test_repr(self):
1026 self.assertEqual(repr(''), '\'\'')
1027 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001028 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001029 self.assertEqual(repr(()), '()')
1030 self.assertEqual(repr([]), '[]')
1031 self.assertEqual(repr({}), '{}')
1032 a = []
1033 a.append(a)
1034 self.assertEqual(repr(a), '[[...]]')
1035 a = {}
1036 a[0] = a
1037 self.assertEqual(repr(a), '{0: {...}}')
1038
1039 def test_round(self):
1040 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001041 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001042 self.assertEqual(round(1.0), 1.0)
1043 self.assertEqual(round(10.0), 10.0)
1044 self.assertEqual(round(1000000000.0), 1000000000.0)
1045 self.assertEqual(round(1e20), 1e20)
1046
1047 self.assertEqual(round(-1.0), -1.0)
1048 self.assertEqual(round(-10.0), -10.0)
1049 self.assertEqual(round(-1000000000.0), -1000000000.0)
1050 self.assertEqual(round(-1e20), -1e20)
1051
1052 self.assertEqual(round(0.1), 0.0)
1053 self.assertEqual(round(1.1), 1.0)
1054 self.assertEqual(round(10.1), 10.0)
1055 self.assertEqual(round(1000000000.1), 1000000000.0)
1056
1057 self.assertEqual(round(-1.1), -1.0)
1058 self.assertEqual(round(-10.1), -10.0)
1059 self.assertEqual(round(-1000000000.1), -1000000000.0)
1060
1061 self.assertEqual(round(0.9), 1.0)
1062 self.assertEqual(round(9.9), 10.0)
1063 self.assertEqual(round(999999999.9), 1000000000.0)
1064
1065 self.assertEqual(round(-0.9), -1.0)
1066 self.assertEqual(round(-9.9), -10.0)
1067 self.assertEqual(round(-999999999.9), -1000000000.0)
1068
1069 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001070 self.assertEqual(type(round(-8.0, -1)), float)
1071
1072 self.assertEqual(type(round(-8.0, 0)), float)
1073 self.assertEqual(type(round(-8.0, 1)), float)
1074
1075 # Check even / odd rounding behaviour
1076 self.assertEqual(round(5.5), 6)
1077 self.assertEqual(round(6.5), 6)
1078 self.assertEqual(round(-5.5), -6)
1079 self.assertEqual(round(-6.5), -6)
1080
1081 # Check behavior on ints
1082 self.assertEqual(round(0), 0)
1083 self.assertEqual(round(8), 8)
1084 self.assertEqual(round(-8), -8)
1085 self.assertEqual(type(round(0)), int)
1086 self.assertEqual(type(round(-8, -1)), float)
1087 self.assertEqual(type(round(-8, 0)), float)
1088 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001089
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001090 # test new kwargs
1091 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1092
Walter Dörwald919497e2003-01-19 16:23:59 +00001093 self.assertRaises(TypeError, round)
1094
Alex Martelliae211f92007-08-22 23:21:33 +00001095 # test generic rounding delegation for reals
1096 class TestRound:
1097 def __round__(self):
1098 return 23
1099
1100 class TestNoRound:
1101 pass
1102
1103 self.assertEqual(round(TestRound()), 23)
1104
1105 self.assertRaises(TypeError, round, 1, 2, 3)
1106 self.assertRaises(TypeError, round, TestNoRound())
1107
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001108 t = TestNoRound()
1109 t.__round__ = lambda *args: args
1110 self.assertRaises(TypeError, round, t)
1111 self.assertRaises(TypeError, round, t, 0)
1112
Walter Dörwald919497e2003-01-19 16:23:59 +00001113 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001114 setattr(sys, 'spam', 1)
1115 self.assertEqual(sys.spam, 1)
1116 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1117 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001118
Walter Dörwald919497e2003-01-19 16:23:59 +00001119
Alex Martellia70b1912003-04-22 08:12:33 +00001120 def test_sum(self):
1121 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001122 self.assertEqual(sum(list(range(2,8))), 27)
1123 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001124 self.assertEqual(sum(Squares(10)), 285)
1125 self.assertEqual(sum(iter(Squares(10))), 285)
1126 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1127
1128 self.assertRaises(TypeError, sum)
1129 self.assertRaises(TypeError, sum, 42)
1130 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1131 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1132 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1133 self.assertRaises(TypeError, sum, [{2:3}])
1134 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1135
1136 class BadSeq:
1137 def __getitem__(self, index):
1138 raise ValueError
1139 self.assertRaises(ValueError, sum, BadSeq())
1140
Walter Dörwald919497e2003-01-19 16:23:59 +00001141 def test_type(self):
1142 self.assertEqual(type(''), type('123'))
1143 self.assertNotEqual(type(''), type(()))
1144
Guido van Rossumfee7b932005-01-16 00:21:28 +00001145 # We don't want self in vars(), so these are static methods
1146
1147 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001148 def get_vars_f0():
1149 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001150
Guido van Rossumfee7b932005-01-16 00:21:28 +00001151 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001152 def get_vars_f2():
1153 BuiltinTest.get_vars_f0()
1154 a = 1
1155 b = 2
1156 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001157
1158 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001159 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001160 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001161 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001162 self.assertEqual(self.get_vars_f0(), {})
1163 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1164 self.assertRaises(TypeError, vars, 42, 42)
1165 self.assertRaises(TypeError, vars, 42)
1166
1167 def test_zip(self):
1168 a = (1, 2, 3)
1169 b = (4, 5, 6)
1170 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001171 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001172 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001173 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001174 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001175 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 class I:
1177 def __getitem__(self, i):
1178 if i < 0 or i > 2: raise IndexError
1179 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001180 self.assertEqual(list(zip(a, I())), t)
1181 self.assertEqual(list(zip()), [])
1182 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001183 self.assertRaises(TypeError, zip, None)
1184 class G:
1185 pass
1186 self.assertRaises(TypeError, zip, a, G())
1187
1188 # Make sure zip doesn't try to allocate a billion elements for the
1189 # result list when one of its arguments doesn't say how long it is.
1190 # A MemoryError is the most likely failure mode.
1191 class SequenceWithoutALength:
1192 def __getitem__(self, i):
1193 if i == 5:
1194 raise IndexError
1195 else:
1196 return i
1197 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001198 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 list(enumerate(range(5)))
1200 )
1201
1202 class BadSeq:
1203 def __getitem__(self, i):
1204 if i == 5:
1205 raise ValueError
1206 else:
1207 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001208 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001209
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001210 def test_bin(self):
1211 self.assertEqual(bin(0), '0b0')
1212 self.assertEqual(bin(1), '0b1')
1213 self.assertEqual(bin(-1), '-0b1')
1214 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1215 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1216 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1217 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1218
Raymond Hettinger64958a12003-12-17 20:43:33 +00001219class TestSorted(unittest.TestCase):
1220
1221 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001222 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001223 copy = data[:]
1224 random.shuffle(copy)
1225 self.assertEqual(data, sorted(copy))
1226 self.assertNotEqual(data, copy)
1227
1228 data.reverse()
1229 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001230 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1231 self.assertNotEqual(data, copy)
1232 random.shuffle(copy)
1233 self.assertEqual(data, sorted(copy, reverse=1))
1234 self.assertNotEqual(data, copy)
1235
1236 def test_inputtypes(self):
1237 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001238 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001239 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001240 self.assertEqual(sorted(s), sorted(T(s)))
1241
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001242 s = ''.join(set(s)) # unique letters only
1243 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001244 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001245 self.assertEqual(sorted(s), sorted(T(s)))
1246
1247 def test_baddecorator(self):
1248 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1249 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1250
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001251def test_main(verbose=None):
1252 test_classes = (BuiltinTest, TestSorted)
1253
1254 run_unittest(*test_classes)
1255
1256 # verify reference counting
1257 if verbose and hasattr(sys, "gettotalrefcount"):
1258 import gc
1259 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001260 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001261 run_unittest(*test_classes)
1262 gc.collect()
1263 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001264 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001265
Walter Dörwald919497e2003-01-19 16:23:59 +00001266
1267if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001268 test_main(verbose=True)