blob: 0aa0d527a22417e3ab474056ecf106f55994dba5 [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003import test.support, unittest
4from test.support import fcmp, TESTFN, unlink, run_unittest, \
Walter Dörwald1f5947b2007-05-22 16:52:54 +00005 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Raymond Hettinger53dbe392008-02-12 20:03:09 +00008import sys, warnings, random, collections, io, fractions
Walter Dörwald919497e2003-01-19 16:23:59 +00009warnings.filterwarnings("ignore", "hex../oct.. of negative int",
10 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000011warnings.filterwarnings("ignore", "integer argument expected",
12 DeprecationWarning, "unittest")
Mark Dickinsona56c4672009-01-27 18:17:45 +000013import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000014
Walter Dörwald919497e2003-01-19 16:23:59 +000015class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000016
Walter Dörwald919497e2003-01-19 16:23:59 +000017 def __init__(self, max):
18 self.max = max
19 self.sofar = []
20
21 def __len__(self): return len(self.sofar)
22
23 def __getitem__(self, i):
24 if not 0 <= i < self.max: raise IndexError
25 n = len(self.sofar)
26 while n <= i:
27 self.sofar.append(n*n)
28 n += 1
29 return self.sofar[i]
30
31class StrSquares:
32
33 def __init__(self, max):
34 self.max = max
35 self.sofar = []
36
37 def __len__(self):
38 return len(self.sofar)
39
40 def __getitem__(self, i):
41 if not 0 <= i < self.max:
42 raise IndexError
43 n = len(self.sofar)
44 while n <= i:
45 self.sofar.append(str(n*n))
46 n += 1
47 return self.sofar[i]
48
49class BitBucket:
50 def write(self, line):
51 pass
52
Facundo Batista2336bdd2008-01-19 19:12:01 +000053test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000054 ('0', 0),
55 ('1', 1),
56 ('9', 9),
57 ('10', 10),
58 ('99', 99),
59 ('100', 100),
60 ('314', 314),
61 (' 314', 314),
62 ('314 ', 314),
63 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000064 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000065 (' 1x', ValueError),
66 (' 1 ', 1),
67 (' 1\02 ', ValueError),
68 ('', ValueError),
69 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000070 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000071 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000072 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000073]
74
Facundo Batista2336bdd2008-01-19 19:12:01 +000075test_conv_sign = [
76 ('0', 0),
77 ('1', 1),
78 ('9', 9),
79 ('10', 10),
80 ('99', 99),
81 ('100', 100),
82 ('314', 314),
83 (' 314', ValueError),
84 ('314 ', 314),
85 (' \t\t 314 \t\t ', ValueError),
86 (repr(sys.maxsize), sys.maxsize),
87 (' 1x', ValueError),
88 (' 1 ', ValueError),
89 (' 1\02 ', ValueError),
90 ('', ValueError),
91 (' ', ValueError),
92 (' \t\t ', ValueError),
93 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
94 (chr(0x200), ValueError),
95]
96
Raymond Hettinger96229b12005-03-11 06:49:40 +000097class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000098 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000099 raise RuntimeError
100
101class TestFailingIter:
102 def __iter__(self):
103 raise RuntimeError
104
Walter Dörwald919497e2003-01-19 16:23:59 +0000105class BuiltinTest(unittest.TestCase):
106
107 def test_import(self):
108 __import__('sys')
109 __import__('time')
110 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 __import__(name='sys')
112 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000113 self.assertRaises(ImportError, __import__, 'spamspam')
114 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000115 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000116 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000117
118 def test_abs(self):
119 # int
120 self.assertEqual(abs(0), 0)
121 self.assertEqual(abs(1234), 1234)
122 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000123 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000124 # float
125 self.assertEqual(abs(0.0), 0.0)
126 self.assertEqual(abs(3.14), 3.14)
127 self.assertEqual(abs(-3.14), 3.14)
128 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000129 self.assertEqual(abs(0), 0)
130 self.assertEqual(abs(1234), 1234)
131 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000132 # str
133 self.assertRaises(TypeError, abs, 'a')
134
Raymond Hettinger96229b12005-03-11 06:49:40 +0000135 def test_all(self):
136 self.assertEqual(all([2, 4, 6]), True)
137 self.assertEqual(all([2, None, 6]), False)
138 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
139 self.assertRaises(RuntimeError, all, TestFailingIter())
140 self.assertRaises(TypeError, all, 10) # Non-iterable
141 self.assertRaises(TypeError, all) # No args
142 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
143 self.assertEqual(all([]), True) # Empty iterator
144 S = [50, 60]
145 self.assertEqual(all(x > 42 for x in S), True)
146 S = [50, 40, 60]
147 self.assertEqual(all(x > 42 for x in S), False)
148
149 def test_any(self):
150 self.assertEqual(any([None, None, None]), False)
151 self.assertEqual(any([None, 4, None]), True)
152 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
153 self.assertRaises(RuntimeError, all, TestFailingIter())
154 self.assertRaises(TypeError, any, 10) # Non-iterable
155 self.assertRaises(TypeError, any) # No args
156 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
157 self.assertEqual(any([]), False) # Empty iterator
158 S = [40, 60, 30]
159 self.assertEqual(any(x > 42 for x in S), True)
160 S = [10, 20, 30]
161 self.assertEqual(any(x > 42 for x in S), False)
162
Georg Brandl559e5d72008-06-11 18:37:52 +0000163 def test_ascii(self):
164 self.assertEqual(ascii(''), '\'\'')
165 self.assertEqual(ascii(0), '0')
166 self.assertEqual(ascii(0), '0')
167 self.assertEqual(ascii(()), '()')
168 self.assertEqual(ascii([]), '[]')
169 self.assertEqual(ascii({}), '{}')
170 a = []
171 a.append(a)
172 self.assertEqual(ascii(a), '[[...]]')
173 a = {}
174 a[0] = a
175 self.assertEqual(ascii(a), '{0: {...}}')
176
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000179 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000180 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000181
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000182 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000184 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000186 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000187 class C:
188 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000189 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000191 self.assert_(hasattr(x.meth, '__call__'))
192 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 class D(C):
194 def __call__(self): pass
195 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000196 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 y()
198
199 def test_chr(self):
200 self.assertEqual(chr(32), ' ')
201 self.assertEqual(chr(65), 'A')
202 self.assertEqual(chr(97), 'a')
203 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000204 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000205 self.assertEqual(chr(sys.maxunicode),
206 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
207 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000209 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
210 self.assertEqual(chr(0x00010000), "\U00010000")
211 self.assertEqual(chr(0x00010001), "\U00010001")
212 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
213 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
214 self.assertEqual(chr(0x00100000), "\U00100000")
215 self.assertEqual(chr(0x00100001), "\U00100001")
216 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
217 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
218 self.assertRaises(ValueError, chr, -1)
219 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000220 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000221
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000222 def test_cmp(self):
Mark Dickinsonf02e0aa2009-02-01 12:13:56 +0000223 self.assert_(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000224
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000226 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000227 bom = b'\xef\xbb\xbf'
228 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229 compile(source='pass', filename='?', mode='exec')
230 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
231 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000232 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000233 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000234 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
235 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000236 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
238 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000239 compile('print("\xe5")\n', '', 'exec')
240 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
241 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000242
Walter Dörwald919497e2003-01-19 16:23:59 +0000243 def test_delattr(self):
244 import sys
245 sys.spam = 1
246 delattr(sys, 'spam')
247 self.assertRaises(TypeError, delattr)
248
249 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000250 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000251 self.assertRaises(TypeError, dir, 42, 42)
252
Georg Brandle32b4222007-03-10 22:13:27 +0000253 # dir() - local scope
254 local_var = 1
255 self.assert_('local_var' in dir())
256
257 # dir(module)
258 import sys
259 self.assert_('exit' in dir(sys))
260
261 # dir(module_with_invalid__dict__)
262 import types
263 class Foo(types.ModuleType):
264 __dict__ = 8
265 f = Foo("foo")
266 self.assertRaises(TypeError, dir, f)
267
268 # dir(type)
269 self.assert_("strip" in dir(str))
270 self.assert_("__mro__" not in dir(str))
271
272 # dir(obj)
273 class Foo(object):
274 def __init__(self):
275 self.x = 7
276 self.y = 8
277 self.z = 9
278 f = Foo()
279 self.assert_("y" in dir(f))
280
281 # dir(obj_no__dict__)
282 class Foo(object):
283 __slots__ = []
284 f = Foo()
285 self.assert_("__repr__" in dir(f))
286
287 # dir(obj_no__class__with__dict__)
288 # (an ugly trick to cause getattr(f, "__class__") to fail)
289 class Foo(object):
290 __slots__ = ["__class__", "__dict__"]
291 def __init__(self):
292 self.bar = "wow"
293 f = Foo()
294 self.assert_("__repr__" not in dir(f))
295 self.assert_("bar" in dir(f))
296
297 # dir(obj_using __dir__)
298 class Foo(object):
299 def __dir__(self):
300 return ["kan", "ga", "roo"]
301 f = Foo()
302 self.assert_(dir(f) == ["ga", "kan", "roo"])
303
304 # dir(obj__dir__not_list)
305 class Foo(object):
306 def __dir__(self):
307 return 7
308 f = Foo()
309 self.assertRaises(TypeError, dir, f)
310
Collin Winter3eed7652007-08-14 17:53:54 +0000311 # dir(traceback)
312 try:
313 raise IndexError
314 except:
315 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
316
317
Walter Dörwald919497e2003-01-19 16:23:59 +0000318 def test_divmod(self):
319 self.assertEqual(divmod(12, 7), (1, 5))
320 self.assertEqual(divmod(-12, 7), (-2, 2))
321 self.assertEqual(divmod(12, -7), (-2, -2))
322 self.assertEqual(divmod(-12, -7), (1, -5))
323
Guido van Rossume2a383d2007-01-15 16:59:06 +0000324 self.assertEqual(divmod(12, 7), (1, 5))
325 self.assertEqual(divmod(-12, 7), (-2, 2))
326 self.assertEqual(divmod(12, -7), (-2, -2))
327 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000328
Guido van Rossume2a383d2007-01-15 16:59:06 +0000329 self.assertEqual(divmod(12, 7), (1, 5))
330 self.assertEqual(divmod(-12, 7), (-2, 2))
331 self.assertEqual(divmod(12, -7), (-2, -2))
332 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000333
Christian Heimesa37d4c62007-12-04 23:02:19 +0000334 self.assertEqual(divmod(-sys.maxsize-1, -1),
335 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000336
Walter Dörwald919497e2003-01-19 16:23:59 +0000337 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
338 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
339 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
340 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
341
342 self.assertRaises(TypeError, divmod)
343
344 def test_eval(self):
345 self.assertEqual(eval('1+1'), 2)
346 self.assertEqual(eval(' 1+1\n'), 2)
347 globals = {'a': 1, 'b': 2}
348 locals = {'b': 200, 'c': 300}
349 self.assertEqual(eval('a', globals) , 1)
350 self.assertEqual(eval('a', globals, locals), 1)
351 self.assertEqual(eval('b', globals, locals), 200)
352 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000353 globals = {'a': 1, 'b': 2}
354 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000355 bom = b'\xef\xbb\xbf'
356 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000357 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000358 self.assertRaises(TypeError, eval)
359 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000360 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000361
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000362 def test_general_eval(self):
363 # Tests that general mappings can be used for the locals argument
364
365 class M:
366 "Test mapping interface versus possible calls from eval()."
367 def __getitem__(self, key):
368 if key == 'a':
369 return 12
370 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000371 def keys(self):
372 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000373
374 m = M()
375 g = globals()
376 self.assertEqual(eval('a', g, m), 12)
377 self.assertRaises(NameError, eval, 'b', g, m)
378 self.assertEqual(eval('dir()', g, m), list('xyz'))
379 self.assertEqual(eval('globals()', g, m), g)
380 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000381 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000382 class A:
383 "Non-mapping"
384 pass
385 m = A()
386 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000387
388 # Verify that dict subclasses work as well
389 class D(dict):
390 def __getitem__(self, key):
391 if key == 'a':
392 return 12
393 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000394 def keys(self):
395 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000396
397 d = D()
398 self.assertEqual(eval('a', g, d), 12)
399 self.assertRaises(NameError, eval, 'b', g, d)
400 self.assertEqual(eval('dir()', g, d), list('xyz'))
401 self.assertEqual(eval('globals()', g, d), g)
402 self.assertEqual(eval('locals()', g, d), d)
403
404 # Verify locals stores (used by list comps)
405 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000406 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000407
408 class SpreadSheet:
409 "Sample application showing nested, calculated lookups."
410 _cells = {}
411 def __setitem__(self, key, formula):
412 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000413 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000414 return eval(self._cells[key], globals(), self)
415
416 ss = SpreadSheet()
417 ss['a1'] = '5'
418 ss['a2'] = 'a1*6'
419 ss['a3'] = 'a2*7'
420 self.assertEqual(ss['a3'], 210)
421
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000422 # Verify that dir() catches a non-list returned by eval
423 # SF bug #1004669
424 class C:
425 def __getitem__(self, item):
426 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000427 def keys(self):
428 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000429 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
430
Georg Brandl7cae87c2006-09-06 06:51:57 +0000431 def test_exec(self):
432 g = {}
433 exec('z = 1', g)
434 if '__builtins__' in g:
435 del g['__builtins__']
436 self.assertEqual(g, {'z': 1})
437
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000438 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000439 if '__builtins__' in g:
440 del g['__builtins__']
441 self.assertEqual(g, {'z': 2})
442 g = {}
443 l = {}
444
445 import warnings
446 warnings.filterwarnings("ignore", "global statement", module="<string>")
447 exec('global a; a = 1; b = 2', g, l)
448 if '__builtins__' in g:
449 del g['__builtins__']
450 if '__builtins__' in l:
451 del l['__builtins__']
452 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
453
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000454 def test_exec_redirected(self):
455 savestdout = sys.stdout
456 sys.stdout = None # Whatever that cannot flush()
457 try:
458 # Used to raise SystemError('error return without exception set')
459 exec('a')
460 except NameError:
461 pass
462 finally:
463 sys.stdout = savestdout
464
Walter Dörwald919497e2003-01-19 16:23:59 +0000465 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000466 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
467 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
468 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
469 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
470 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000471 def identity(item):
472 return 1
473 filter(identity, Squares(5))
474 self.assertRaises(TypeError, filter)
475 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000476 def __getitem__(self, index):
477 if index<4:
478 return 42
479 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000480 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000481 def badfunc():
482 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000483 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000484
Walter Dörwaldbf517072003-01-27 15:57:14 +0000485 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000486 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
487 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
488 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000489
Walter Dörwald919497e2003-01-19 16:23:59 +0000490 def test_getattr(self):
491 import sys
492 self.assert_(getattr(sys, 'stdout') is sys.stdout)
493 self.assertRaises(TypeError, getattr, sys, 1)
494 self.assertRaises(TypeError, getattr, sys, 1, "foo")
495 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000496 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000497
498 def test_hasattr(self):
499 import sys
500 self.assert_(hasattr(sys, 'stdout'))
501 self.assertRaises(TypeError, hasattr, sys, 1)
502 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000503 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000504
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000505 # Check that hasattr allows SystemExit and KeyboardInterrupts by
506 class A:
507 def __getattr__(self, what):
508 raise KeyboardInterrupt
509 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
510 class B:
511 def __getattr__(self, what):
512 raise SystemExit
513 self.assertRaises(SystemExit, hasattr, B(), "b")
514
Walter Dörwald919497e2003-01-19 16:23:59 +0000515 def test_hash(self):
516 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000517 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000518 self.assertEqual(hash(1), hash(1.0))
519 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000520 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000521 hash((0,1,2,3))
522 def f(): pass
523 self.assertRaises(TypeError, hash, [])
524 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000525 # Bug 1536021: Allow hash to return long objects
526 class X:
527 def __hash__(self):
528 return 2**100
529 self.assertEquals(type(hash(X())), int)
530 class Y(object):
531 def __hash__(self):
532 return 2**100
533 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000534 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000535 def __hash__(self):
536 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000537 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000538
539 def test_hex(self):
540 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000541 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000542 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000543 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000544 self.assertRaises(TypeError, hex, {})
545
546 def test_id(self):
547 id(None)
548 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000549 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000550 id(1.0)
551 id('spam')
552 id((0,1,2,3))
553 id([0,1,2,3])
554 id({'spam': 1, 'eggs': 2, 'ham': 3})
555
Guido van Rossuma88a0332007-02-26 16:59:55 +0000556 # Test input() later, alphabetized as if it were raw_input
557
Walter Dörwald919497e2003-01-19 16:23:59 +0000558 def test_iter(self):
559 self.assertRaises(TypeError, iter)
560 self.assertRaises(TypeError, iter, 42, 42)
561 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000562 for l in lists:
563 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000564 self.assertEqual(next(i), '1')
565 self.assertEqual(next(i), '2')
566 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000567
568 def test_isinstance(self):
569 class C:
570 pass
571 class D(C):
572 pass
573 class E:
574 pass
575 c = C()
576 d = D()
577 e = E()
578 self.assert_(isinstance(c, C))
579 self.assert_(isinstance(d, C))
580 self.assert_(not isinstance(e, C))
581 self.assert_(not isinstance(c, D))
582 self.assert_(not isinstance('foo', E))
583 self.assertRaises(TypeError, isinstance, E, 'foo')
584 self.assertRaises(TypeError, isinstance)
585
586 def test_issubclass(self):
587 class C:
588 pass
589 class D(C):
590 pass
591 class E:
592 pass
593 c = C()
594 d = D()
595 e = E()
596 self.assert_(issubclass(D, C))
597 self.assert_(issubclass(C, C))
598 self.assert_(not issubclass(C, D))
599 self.assertRaises(TypeError, issubclass, 'foo', E)
600 self.assertRaises(TypeError, issubclass, E, 'foo')
601 self.assertRaises(TypeError, issubclass)
602
603 def test_len(self):
604 self.assertEqual(len('123'), 3)
605 self.assertEqual(len(()), 0)
606 self.assertEqual(len((1, 2, 3, 4)), 4)
607 self.assertEqual(len([1, 2, 3, 4]), 4)
608 self.assertEqual(len({}), 0)
609 self.assertEqual(len({'a':1, 'b': 2}), 2)
610 class BadSeq:
611 def __len__(self):
612 raise ValueError
613 self.assertRaises(ValueError, len, BadSeq())
614
Walter Dörwald919497e2003-01-19 16:23:59 +0000615 def test_map(self):
616 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000617 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000618 [1, 4, 9]
619 )
620 try:
621 from math import sqrt
622 except ImportError:
623 def sqrt(x):
624 return pow(x, 0.5)
625 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000626 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 [[4.0, 2.0], [9.0, 3.0]]
628 )
629 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000630 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000631 [10, 4, 6]
632 )
633
634 def plus(*v):
635 accu = 0
636 for i in v: accu = accu + i
637 return accu
638 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000639 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000640 [1, 3, 7]
641 )
642 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000643 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000644 [1+4, 3+9, 7+2]
645 )
646 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000647 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000648 [1+4+1, 3+9+1, 7+2+0]
649 )
650 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000651 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
653 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000654 def Max(a, b):
655 if a is None:
656 return b
657 if b is None:
658 return a
659 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000661 list(map(Max, Squares(3), Squares(2))),
662 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000663 )
664 self.assertRaises(TypeError, map)
665 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000666 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000667 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000668 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000669 yield None
670 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000671 def badfunc(x):
672 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000673 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000674
675 def test_max(self):
676 self.assertEqual(max('123123'), '3')
677 self.assertEqual(max(1, 2, 3), 3)
678 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
679 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
680
Guido van Rossume2a383d2007-01-15 16:59:06 +0000681 self.assertEqual(max(1, 2, 3.0), 3.0)
682 self.assertEqual(max(1, 2.0, 3), 3)
683 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000684
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000685 for stmt in (
686 "max(key=int)", # no args
687 "max(1, key=int)", # single arg not iterable
688 "max(1, 2, keystone=int)", # wrong keyword
689 "max(1, 2, key=int, abc=int)", # two many keywords
690 "max(1, 2, key=1)", # keyfunc is not callable
691 ):
Tim Peters7f061872004-12-07 21:17:46 +0000692 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000693 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000694 except TypeError:
695 pass
696 else:
697 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000698
699 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
700 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
701 self.assertEqual(max(1, 2, key=neg), 1) # two elems
702
703 data = [random.randrange(200) for i in range(100)]
704 keys = dict((elem, random.randrange(50)) for elem in data)
705 f = keys.__getitem__
706 self.assertEqual(max(data, key=f),
707 sorted(reversed(data), key=f)[-1])
708
Walter Dörwald919497e2003-01-19 16:23:59 +0000709 def test_min(self):
710 self.assertEqual(min('123123'), '1')
711 self.assertEqual(min(1, 2, 3), 1)
712 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
713 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
714
Guido van Rossume2a383d2007-01-15 16:59:06 +0000715 self.assertEqual(min(1, 2, 3.0), 1)
716 self.assertEqual(min(1, 2.0, 3), 1)
717 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000718
719 self.assertRaises(TypeError, min)
720 self.assertRaises(TypeError, min, 42)
721 self.assertRaises(ValueError, min, ())
722 class BadSeq:
723 def __getitem__(self, index):
724 raise ValueError
725 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000726
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000727 for stmt in (
728 "min(key=int)", # no args
729 "min(1, key=int)", # single arg not iterable
730 "min(1, 2, keystone=int)", # wrong keyword
731 "min(1, 2, key=int, abc=int)", # two many keywords
732 "min(1, 2, key=1)", # keyfunc is not callable
733 ):
Tim Peters7f061872004-12-07 21:17:46 +0000734 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000735 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000736 except TypeError:
737 pass
738 else:
739 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000740
741 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
742 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
743 self.assertEqual(min(1, 2, key=neg), 2) # two elems
744
745 data = [random.randrange(200) for i in range(100)]
746 keys = dict((elem, random.randrange(50)) for elem in data)
747 f = keys.__getitem__
748 self.assertEqual(min(data, key=f),
749 sorted(data, key=f)[0])
750
Georg Brandla18af4e2007-04-21 15:47:16 +0000751 def test_next(self):
752 it = iter(range(2))
753 self.assertEqual(next(it), 0)
754 self.assertEqual(next(it), 1)
755 self.assertRaises(StopIteration, next, it)
756 self.assertRaises(StopIteration, next, it)
757 self.assertEquals(next(it, 42), 42)
758
759 class Iter(object):
760 def __iter__(self):
761 return self
762 def __next__(self):
763 raise StopIteration
764
765 it = iter(Iter())
766 self.assertEquals(next(it, 42), 42)
767 self.assertRaises(StopIteration, next, it)
768
769 def gen():
770 yield 1
771 return
772
773 it = gen()
774 self.assertEquals(next(it), 1)
775 self.assertRaises(StopIteration, next, it)
776 self.assertEquals(next(it, 42), 42)
777
Walter Dörwald919497e2003-01-19 16:23:59 +0000778 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000779 self.assertEqual(oct(100), '0o144')
780 self.assertEqual(oct(100), '0o144')
781 self.assertEqual(oct(-100), '-0o144')
782 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000783 self.assertRaises(TypeError, oct, ())
784
785 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000786 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000787 fp = open(TESTFN, 'w')
788 try:
789 fp.write('1+1\n')
790 fp.write('1+1\n')
791 fp.write('The quick brown fox jumps over the lazy dog')
792 fp.write('.\n')
793 fp.write('Dear John\n')
794 fp.write('XXX'*100)
795 fp.write('YYY'*100)
796 finally:
797 fp.close()
798
799 def test_open(self):
800 self.write_testfile()
801 fp = open(TESTFN, 'r')
802 try:
803 self.assertEqual(fp.readline(4), '1+1\n')
804 self.assertEqual(fp.readline(4), '1+1\n')
805 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
806 self.assertEqual(fp.readline(4), 'Dear')
807 self.assertEqual(fp.readline(100), ' John\n')
808 self.assertEqual(fp.read(300), 'XXX'*100)
809 self.assertEqual(fp.read(1000), 'YYY'*100)
810 finally:
811 fp.close()
812 unlink(TESTFN)
813
814 def test_ord(self):
815 self.assertEqual(ord(' '), 32)
816 self.assertEqual(ord('A'), 65)
817 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000818 self.assertEqual(ord('\x80'), 128)
819 self.assertEqual(ord('\xff'), 255)
820
821 self.assertEqual(ord(b' '), 32)
822 self.assertEqual(ord(b'A'), 65)
823 self.assertEqual(ord(b'a'), 97)
824 self.assertEqual(ord(b'\x80'), 128)
825 self.assertEqual(ord(b'\xff'), 255)
826
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000827 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000829
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000830 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
831 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
832 self.assertEqual(ord("\U00010000"), 0x00010000)
833 self.assertEqual(ord("\U00010001"), 0x00010001)
834 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
835 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
836 self.assertEqual(ord("\U00100000"), 0x00100000)
837 self.assertEqual(ord("\U00100001"), 0x00100001)
838 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
839 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
840
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 def test_pow(self):
842 self.assertEqual(pow(0,0), 1)
843 self.assertEqual(pow(0,1), 0)
844 self.assertEqual(pow(1,0), 1)
845 self.assertEqual(pow(1,1), 1)
846
847 self.assertEqual(pow(2,0), 1)
848 self.assertEqual(pow(2,10), 1024)
849 self.assertEqual(pow(2,20), 1024*1024)
850 self.assertEqual(pow(2,30), 1024*1024*1024)
851
852 self.assertEqual(pow(-2,0), 1)
853 self.assertEqual(pow(-2,1), -2)
854 self.assertEqual(pow(-2,2), 4)
855 self.assertEqual(pow(-2,3), -8)
856
Guido van Rossume2a383d2007-01-15 16:59:06 +0000857 self.assertEqual(pow(0,0), 1)
858 self.assertEqual(pow(0,1), 0)
859 self.assertEqual(pow(1,0), 1)
860 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000861
Guido van Rossume2a383d2007-01-15 16:59:06 +0000862 self.assertEqual(pow(2,0), 1)
863 self.assertEqual(pow(2,10), 1024)
864 self.assertEqual(pow(2,20), 1024*1024)
865 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000866
Guido van Rossume2a383d2007-01-15 16:59:06 +0000867 self.assertEqual(pow(-2,0), 1)
868 self.assertEqual(pow(-2,1), -2)
869 self.assertEqual(pow(-2,2), 4)
870 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000871
872 self.assertAlmostEqual(pow(0.,0), 1.)
873 self.assertAlmostEqual(pow(0.,1), 0.)
874 self.assertAlmostEqual(pow(1.,0), 1.)
875 self.assertAlmostEqual(pow(1.,1), 1.)
876
877 self.assertAlmostEqual(pow(2.,0), 1.)
878 self.assertAlmostEqual(pow(2.,10), 1024.)
879 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
880 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
881
882 self.assertAlmostEqual(pow(-2.,0), 1.)
883 self.assertAlmostEqual(pow(-2.,1), -2.)
884 self.assertAlmostEqual(pow(-2.,2), 4.)
885 self.assertAlmostEqual(pow(-2.,3), -8.)
886
Guido van Rossume2a383d2007-01-15 16:59:06 +0000887 for x in 2, 2, 2.0:
888 for y in 10, 10, 10.0:
889 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000890 if isinstance(x, float) or \
891 isinstance(y, float) or \
892 isinstance(z, float):
893 self.assertRaises(TypeError, pow, x, y, z)
894 else:
895 self.assertAlmostEqual(pow(x, y, z), 24.0)
896
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000897 self.assertAlmostEqual(pow(-1, 0.5), 1j)
898 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
899
Walter Dörwald919497e2003-01-19 16:23:59 +0000900 self.assertRaises(TypeError, pow, -1, -2, 3)
901 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000902 self.assertRaises(TypeError, pow, -1, -2, 3)
903 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000904
905 self.assertRaises(TypeError, pow)
906
907 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000908 self.assertEqual(list(range(3)), [0, 1, 2])
909 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
910 self.assertEqual(list(range(0)), [])
911 self.assertEqual(list(range(-3)), [])
912 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
913 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000914
Guido van Rossum805365e2007-05-07 22:24:25 +0000915 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000916 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000917 self.assertEqual(list(range(-2**100)), [])
918 self.assertEqual(list(range(0, -2**100)), [])
919 self.assertEqual(list(range(0, 2**100, -1)), [])
920 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000921
Christian Heimesa37d4c62007-12-04 23:02:19 +0000922 a = int(10 * sys.maxsize)
923 b = int(100 * sys.maxsize)
924 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000925
Guido van Rossum805365e2007-05-07 22:24:25 +0000926 self.assertEqual(list(range(a, a+2)), [a, a+1])
927 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
928 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000929
Guido van Rossum805365e2007-05-07 22:24:25 +0000930 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000931 self.assert_(a in seq)
932 self.assert_(b not in seq)
933 self.assertEqual(len(seq), 2)
934
Guido van Rossum805365e2007-05-07 22:24:25 +0000935 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000936 self.assert_(b in seq)
937 self.assert_(a not in seq)
938 self.assertEqual(len(seq), 2)
939
Guido van Rossum805365e2007-05-07 22:24:25 +0000940 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000941 self.assert_(-a in seq)
942 self.assert_(-b not in seq)
943 self.assertEqual(len(seq), 2)
944
Walter Dörwald919497e2003-01-19 16:23:59 +0000945 self.assertRaises(TypeError, range)
946 self.assertRaises(TypeError, range, 1, 2, 3, 4)
947 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000948 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000949
950 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000951 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000952 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000953 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
954
955 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000956 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000957 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000958
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000959 # Reject floats when it would require PyLongs to represent.
960 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000961 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000962
Walter Dörwald357981e2003-04-15 18:59:28 +0000963 self.assertRaises(TypeError, range, 0, "spam")
964 self.assertRaises(TypeError, range, 0, 42, "spam")
965
Christian Heimesa37d4c62007-12-04 23:02:19 +0000966 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
967 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000968
Christian Heimesa37d4c62007-12-04 23:02:19 +0000969 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000970
Guido van Rossuma88a0332007-02-26 16:59:55 +0000971 def test_input(self):
972 self.write_testfile()
973 fp = open(TESTFN, 'r')
974 savestdin = sys.stdin
975 savestdout = sys.stdout # Eats the echo
976 try:
977 sys.stdin = fp
978 sys.stdout = BitBucket()
979 self.assertEqual(input(), "1+1")
980 self.assertEqual(input('testing\n'), "1+1")
981 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
982 self.assertEqual(input('testing\n'), 'Dear John')
983
984 # SF 1535165: don't segfault on closed stdin
985 # sys.stdout must be a regular file for triggering
986 sys.stdout = savestdout
987 sys.stdin.close()
988 self.assertRaises(ValueError, input)
989
990 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000991 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000992 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000993 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000994 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000995 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000996 self.assertRaises(EOFError, input)
997
998 del sys.stdout
999 self.assertRaises(RuntimeError, input, 'prompt')
1000 del sys.stdin
1001 self.assertRaises(RuntimeError, input, 'prompt')
1002 finally:
1003 sys.stdin = savestdin
1004 sys.stdout = savestdout
1005 fp.close()
1006 unlink(TESTFN)
1007
Walter Dörwald919497e2003-01-19 16:23:59 +00001008 def test_repr(self):
1009 self.assertEqual(repr(''), '\'\'')
1010 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001011 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001012 self.assertEqual(repr(()), '()')
1013 self.assertEqual(repr([]), '[]')
1014 self.assertEqual(repr({}), '{}')
1015 a = []
1016 a.append(a)
1017 self.assertEqual(repr(a), '[[...]]')
1018 a = {}
1019 a[0] = a
1020 self.assertEqual(repr(a), '{0: {...}}')
1021
1022 def test_round(self):
1023 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001024 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001025 self.assertEqual(round(1.0), 1.0)
1026 self.assertEqual(round(10.0), 10.0)
1027 self.assertEqual(round(1000000000.0), 1000000000.0)
1028 self.assertEqual(round(1e20), 1e20)
1029
1030 self.assertEqual(round(-1.0), -1.0)
1031 self.assertEqual(round(-10.0), -10.0)
1032 self.assertEqual(round(-1000000000.0), -1000000000.0)
1033 self.assertEqual(round(-1e20), -1e20)
1034
1035 self.assertEqual(round(0.1), 0.0)
1036 self.assertEqual(round(1.1), 1.0)
1037 self.assertEqual(round(10.1), 10.0)
1038 self.assertEqual(round(1000000000.1), 1000000000.0)
1039
1040 self.assertEqual(round(-1.1), -1.0)
1041 self.assertEqual(round(-10.1), -10.0)
1042 self.assertEqual(round(-1000000000.1), -1000000000.0)
1043
1044 self.assertEqual(round(0.9), 1.0)
1045 self.assertEqual(round(9.9), 10.0)
1046 self.assertEqual(round(999999999.9), 1000000000.0)
1047
1048 self.assertEqual(round(-0.9), -1.0)
1049 self.assertEqual(round(-9.9), -10.0)
1050 self.assertEqual(round(-999999999.9), -1000000000.0)
1051
1052 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001053 self.assertEqual(type(round(-8.0, -1)), float)
1054
1055 self.assertEqual(type(round(-8.0, 0)), float)
1056 self.assertEqual(type(round(-8.0, 1)), float)
1057
1058 # Check even / odd rounding behaviour
1059 self.assertEqual(round(5.5), 6)
1060 self.assertEqual(round(6.5), 6)
1061 self.assertEqual(round(-5.5), -6)
1062 self.assertEqual(round(-6.5), -6)
1063
1064 # Check behavior on ints
1065 self.assertEqual(round(0), 0)
1066 self.assertEqual(round(8), 8)
1067 self.assertEqual(round(-8), -8)
1068 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001069 self.assertEqual(type(round(-8, -1)), int)
1070 self.assertEqual(type(round(-8, 0)), int)
1071 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001072
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073 # test new kwargs
1074 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 self.assertRaises(TypeError, round)
1077
Alex Martelliae211f92007-08-22 23:21:33 +00001078 # test generic rounding delegation for reals
1079 class TestRound:
1080 def __round__(self):
1081 return 23
1082
1083 class TestNoRound:
1084 pass
1085
1086 self.assertEqual(round(TestRound()), 23)
1087
1088 self.assertRaises(TypeError, round, 1, 2, 3)
1089 self.assertRaises(TypeError, round, TestNoRound())
1090
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001091 t = TestNoRound()
1092 t.__round__ = lambda *args: args
1093 self.assertRaises(TypeError, round, t)
1094 self.assertRaises(TypeError, round, t, 0)
1095
Walter Dörwald919497e2003-01-19 16:23:59 +00001096 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001097 setattr(sys, 'spam', 1)
1098 self.assertEqual(sys.spam, 1)
1099 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1100 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001101
Walter Dörwald919497e2003-01-19 16:23:59 +00001102
Alex Martellia70b1912003-04-22 08:12:33 +00001103 def test_sum(self):
1104 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001105 self.assertEqual(sum(list(range(2,8))), 27)
1106 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001107 self.assertEqual(sum(Squares(10)), 285)
1108 self.assertEqual(sum(iter(Squares(10))), 285)
1109 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1110
1111 self.assertRaises(TypeError, sum)
1112 self.assertRaises(TypeError, sum, 42)
1113 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1114 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1115 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1116 self.assertRaises(TypeError, sum, [{2:3}])
1117 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1118
1119 class BadSeq:
1120 def __getitem__(self, index):
1121 raise ValueError
1122 self.assertRaises(ValueError, sum, BadSeq())
1123
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 def test_type(self):
1125 self.assertEqual(type(''), type('123'))
1126 self.assertNotEqual(type(''), type(()))
1127
Guido van Rossumfee7b932005-01-16 00:21:28 +00001128 # We don't want self in vars(), so these are static methods
1129
1130 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001131 def get_vars_f0():
1132 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001133
Guido van Rossumfee7b932005-01-16 00:21:28 +00001134 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 def get_vars_f2():
1136 BuiltinTest.get_vars_f0()
1137 a = 1
1138 b = 2
1139 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001140
1141 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001142 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001143 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001144 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001145 self.assertEqual(self.get_vars_f0(), {})
1146 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1147 self.assertRaises(TypeError, vars, 42, 42)
1148 self.assertRaises(TypeError, vars, 42)
1149
1150 def test_zip(self):
1151 a = (1, 2, 3)
1152 b = (4, 5, 6)
1153 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001154 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001156 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001158 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 class I:
1160 def __getitem__(self, i):
1161 if i < 0 or i > 2: raise IndexError
1162 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001163 self.assertEqual(list(zip(a, I())), t)
1164 self.assertEqual(list(zip()), [])
1165 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 self.assertRaises(TypeError, zip, None)
1167 class G:
1168 pass
1169 self.assertRaises(TypeError, zip, a, G())
1170
1171 # Make sure zip doesn't try to allocate a billion elements for the
1172 # result list when one of its arguments doesn't say how long it is.
1173 # A MemoryError is the most likely failure mode.
1174 class SequenceWithoutALength:
1175 def __getitem__(self, i):
1176 if i == 5:
1177 raise IndexError
1178 else:
1179 return i
1180 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001181 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001182 list(enumerate(range(5)))
1183 )
1184
1185 class BadSeq:
1186 def __getitem__(self, i):
1187 if i == 5:
1188 raise ValueError
1189 else:
1190 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001191 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001192
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001193 def test_bin(self):
1194 self.assertEqual(bin(0), '0b0')
1195 self.assertEqual(bin(1), '0b1')
1196 self.assertEqual(bin(-1), '-0b1')
1197 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1198 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1199 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1200 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1201
Raymond Hettinger64958a12003-12-17 20:43:33 +00001202class TestSorted(unittest.TestCase):
1203
1204 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001205 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001206 copy = data[:]
1207 random.shuffle(copy)
1208 self.assertEqual(data, sorted(copy))
1209 self.assertNotEqual(data, copy)
1210
1211 data.reverse()
1212 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001213 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1214 self.assertNotEqual(data, copy)
1215 random.shuffle(copy)
1216 self.assertEqual(data, sorted(copy, reverse=1))
1217 self.assertNotEqual(data, copy)
1218
1219 def test_inputtypes(self):
1220 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001221 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001222 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001223 self.assertEqual(sorted(s), sorted(T(s)))
1224
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001225 s = ''.join(set(s)) # unique letters only
1226 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001227 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001228 self.assertEqual(sorted(s), sorted(T(s)))
1229
1230 def test_baddecorator(self):
1231 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1232 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1233
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001234def test_main(verbose=None):
1235 test_classes = (BuiltinTest, TestSorted)
1236
1237 run_unittest(*test_classes)
1238
1239 # verify reference counting
1240 if verbose and hasattr(sys, "gettotalrefcount"):
1241 import gc
1242 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001243 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001244 run_unittest(*test_classes)
1245 gc.collect()
1246 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001247 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001248
Walter Dörwald919497e2003-01-19 16:23:59 +00001249
1250if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001251 test_main(verbose=True)