blob: 94c68787857bb1fd4028831dde89063328f6538f [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
Mark Dickinsonad731b92009-11-09 17:12:30 +00003import platform
Georg Brandl1b37e872010-03-14 10:45:50 +00004import unittest
Brett Cannon77628992010-03-20 20:59:33 +00005from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Georg Brandl1b37e872010-03-14 10:45:50 +00008import sys, warnings, random, collections, io
9
Mark Dickinsona56c4672009-01-27 18:17:45 +000010import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Walter Dörwald919497e2003-01-19 16:23:59 +000012class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014 def __init__(self, max):
15 self.max = max
16 self.sofar = []
17
18 def __len__(self): return len(self.sofar)
19
20 def __getitem__(self, i):
21 if not 0 <= i < self.max: raise IndexError
22 n = len(self.sofar)
23 while n <= i:
24 self.sofar.append(n*n)
25 n += 1
26 return self.sofar[i]
27
28class StrSquares:
29
30 def __init__(self, max):
31 self.max = max
32 self.sofar = []
33
34 def __len__(self):
35 return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max:
39 raise IndexError
40 n = len(self.sofar)
41 while n <= i:
42 self.sofar.append(str(n*n))
43 n += 1
44 return self.sofar[i]
45
46class BitBucket:
47 def write(self, line):
48 pass
49
Facundo Batista2336bdd2008-01-19 19:12:01 +000050test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000051 ('0', 0),
52 ('1', 1),
53 ('9', 9),
54 ('10', 10),
55 ('99', 99),
56 ('100', 100),
57 ('314', 314),
58 (' 314', 314),
59 ('314 ', 314),
60 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000061 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000062 (' 1x', ValueError),
63 (' 1 ', 1),
64 (' 1\02 ', ValueError),
65 ('', ValueError),
66 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000067 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000068 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000069 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000070]
71
Facundo Batista2336bdd2008-01-19 19:12:01 +000072test_conv_sign = [
73 ('0', 0),
74 ('1', 1),
75 ('9', 9),
76 ('10', 10),
77 ('99', 99),
78 ('100', 100),
79 ('314', 314),
80 (' 314', ValueError),
81 ('314 ', 314),
82 (' \t\t 314 \t\t ', ValueError),
83 (repr(sys.maxsize), sys.maxsize),
84 (' 1x', ValueError),
85 (' 1 ', ValueError),
86 (' 1\02 ', ValueError),
87 ('', ValueError),
88 (' ', ValueError),
89 (' \t\t ', ValueError),
90 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
91 (chr(0x200), ValueError),
92]
93
Raymond Hettinger96229b12005-03-11 06:49:40 +000094class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000095 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000096 raise RuntimeError
97
98class TestFailingIter:
99 def __iter__(self):
100 raise RuntimeError
101
Walter Dörwald919497e2003-01-19 16:23:59 +0000102class BuiltinTest(unittest.TestCase):
103
104 def test_import(self):
105 __import__('sys')
106 __import__('time')
107 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108 __import__(name='sys')
109 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000110 self.assertRaises(ImportError, __import__, 'spamspam')
111 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000112 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000113 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000114
115 def test_abs(self):
116 # int
117 self.assertEqual(abs(0), 0)
118 self.assertEqual(abs(1234), 1234)
119 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000120 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000121 # float
122 self.assertEqual(abs(0.0), 0.0)
123 self.assertEqual(abs(3.14), 3.14)
124 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000125 # str
126 self.assertRaises(TypeError, abs, 'a')
127
Raymond Hettinger96229b12005-03-11 06:49:40 +0000128 def test_all(self):
129 self.assertEqual(all([2, 4, 6]), True)
130 self.assertEqual(all([2, None, 6]), False)
131 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
132 self.assertRaises(RuntimeError, all, TestFailingIter())
133 self.assertRaises(TypeError, all, 10) # Non-iterable
134 self.assertRaises(TypeError, all) # No args
135 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
136 self.assertEqual(all([]), True) # Empty iterator
137 S = [50, 60]
138 self.assertEqual(all(x > 42 for x in S), True)
139 S = [50, 40, 60]
140 self.assertEqual(all(x > 42 for x in S), False)
141
142 def test_any(self):
143 self.assertEqual(any([None, None, None]), False)
144 self.assertEqual(any([None, 4, None]), True)
145 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
146 self.assertRaises(RuntimeError, all, TestFailingIter())
147 self.assertRaises(TypeError, any, 10) # Non-iterable
148 self.assertRaises(TypeError, any) # No args
149 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
150 self.assertEqual(any([]), False) # Empty iterator
151 S = [40, 60, 30]
152 self.assertEqual(any(x > 42 for x in S), True)
153 S = [10, 20, 30]
154 self.assertEqual(any(x > 42 for x in S), False)
155
Georg Brandl559e5d72008-06-11 18:37:52 +0000156 def test_ascii(self):
157 self.assertEqual(ascii(''), '\'\'')
158 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000159 self.assertEqual(ascii(()), '()')
160 self.assertEqual(ascii([]), '[]')
161 self.assertEqual(ascii({}), '{}')
162 a = []
163 a.append(a)
164 self.assertEqual(ascii(a), '[[...]]')
165 a = {}
166 a[0] = a
167 self.assertEqual(ascii(a), '{0: {...}}')
168
Thomas Wouters89f507f2006-12-13 04:49:30 +0000169 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000170 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000171 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000172 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000173
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000174 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000175 def test_callable(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000176 self.assertTrue(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000177 def f(): pass
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000178 self.assertTrue(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 class C:
180 def meth(self): pass
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000181 self.assertTrue(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 x = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000183 self.assertTrue(hasattr(x.meth, '__call__'))
184 self.assertTrue(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 class D(C):
186 def __call__(self): pass
187 y = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000188 self.assertTrue(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000189 y()
190
191 def test_chr(self):
192 self.assertEqual(chr(32), ' ')
193 self.assertEqual(chr(65), 'A')
194 self.assertEqual(chr(97), 'a')
195 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000196 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000197 self.assertEqual(chr(sys.maxunicode),
198 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
199 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000200 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000201 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
202 self.assertEqual(chr(0x00010000), "\U00010000")
203 self.assertEqual(chr(0x00010001), "\U00010001")
204 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
205 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
206 self.assertEqual(chr(0x00100000), "\U00100000")
207 self.assertEqual(chr(0x00100001), "\U00100001")
208 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
209 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
210 self.assertRaises(ValueError, chr, -1)
211 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000212 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000213
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000214 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000215 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000216
Walter Dörwald919497e2003-01-19 16:23:59 +0000217 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000218 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000219 bom = b'\xef\xbb\xbf'
220 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000221 compile(source='pass', filename='?', mode='exec')
222 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
223 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000224 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000226 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
227 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000228 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
230 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000231 compile('print("\xe5")\n', '', 'exec')
232 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
233 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 def test_delattr(self):
236 import sys
237 sys.spam = 1
238 delattr(sys, 'spam')
239 self.assertRaises(TypeError, delattr)
240
241 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000242 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000243 self.assertRaises(TypeError, dir, 42, 42)
244
Georg Brandle32b4222007-03-10 22:13:27 +0000245 # dir() - local scope
246 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000247 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000248
249 # dir(module)
250 import sys
Benjamin Peterson577473f2010-01-19 00:09:57 +0000251 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000252
253 # dir(module_with_invalid__dict__)
254 import types
255 class Foo(types.ModuleType):
256 __dict__ = 8
257 f = Foo("foo")
258 self.assertRaises(TypeError, dir, f)
259
260 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000261 self.assertIn("strip", dir(str))
262 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000263
264 # dir(obj)
265 class Foo(object):
266 def __init__(self):
267 self.x = 7
268 self.y = 8
269 self.z = 9
270 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000271 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000272
273 # dir(obj_no__dict__)
274 class Foo(object):
275 __slots__ = []
276 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000277 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000278
279 # dir(obj_no__class__with__dict__)
280 # (an ugly trick to cause getattr(f, "__class__") to fail)
281 class Foo(object):
282 __slots__ = ["__class__", "__dict__"]
283 def __init__(self):
284 self.bar = "wow"
285 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000286 self.assertNotIn("__repr__", dir(f))
287 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000288
289 # dir(obj_using __dir__)
290 class Foo(object):
291 def __dir__(self):
292 return ["kan", "ga", "roo"]
293 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000294 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000295
296 # dir(obj__dir__not_list)
297 class Foo(object):
298 def __dir__(self):
299 return 7
300 f = Foo()
301 self.assertRaises(TypeError, dir, f)
302
Collin Winter3eed7652007-08-14 17:53:54 +0000303 # dir(traceback)
304 try:
305 raise IndexError
306 except:
307 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
308
309
Walter Dörwald919497e2003-01-19 16:23:59 +0000310 def test_divmod(self):
311 self.assertEqual(divmod(12, 7), (1, 5))
312 self.assertEqual(divmod(-12, 7), (-2, 2))
313 self.assertEqual(divmod(12, -7), (-2, -2))
314 self.assertEqual(divmod(-12, -7), (1, -5))
315
Mark Dickinson5c2db372009-12-05 20:28:34 +0000316 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000317
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000318 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
319 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
320 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
321 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000322
323 self.assertRaises(TypeError, divmod)
324
325 def test_eval(self):
326 self.assertEqual(eval('1+1'), 2)
327 self.assertEqual(eval(' 1+1\n'), 2)
328 globals = {'a': 1, 'b': 2}
329 locals = {'b': 200, 'c': 300}
330 self.assertEqual(eval('a', globals) , 1)
331 self.assertEqual(eval('a', globals, locals), 1)
332 self.assertEqual(eval('b', globals, locals), 200)
333 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 globals = {'a': 1, 'b': 2}
335 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000336 bom = b'\xef\xbb\xbf'
337 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000338 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000339 self.assertRaises(TypeError, eval)
340 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000341 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000342
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000343 def test_general_eval(self):
344 # Tests that general mappings can be used for the locals argument
345
346 class M:
347 "Test mapping interface versus possible calls from eval()."
348 def __getitem__(self, key):
349 if key == 'a':
350 return 12
351 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000352 def keys(self):
353 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000354
355 m = M()
356 g = globals()
357 self.assertEqual(eval('a', g, m), 12)
358 self.assertRaises(NameError, eval, 'b', g, m)
359 self.assertEqual(eval('dir()', g, m), list('xyz'))
360 self.assertEqual(eval('globals()', g, m), g)
361 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000362 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000363 class A:
364 "Non-mapping"
365 pass
366 m = A()
367 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000368
369 # Verify that dict subclasses work as well
370 class D(dict):
371 def __getitem__(self, key):
372 if key == 'a':
373 return 12
374 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000375 def keys(self):
376 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000377
378 d = D()
379 self.assertEqual(eval('a', g, d), 12)
380 self.assertRaises(NameError, eval, 'b', g, d)
381 self.assertEqual(eval('dir()', g, d), list('xyz'))
382 self.assertEqual(eval('globals()', g, d), g)
383 self.assertEqual(eval('locals()', g, d), d)
384
385 # Verify locals stores (used by list comps)
386 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000387 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000388
389 class SpreadSheet:
390 "Sample application showing nested, calculated lookups."
391 _cells = {}
392 def __setitem__(self, key, formula):
393 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000394 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000395 return eval(self._cells[key], globals(), self)
396
397 ss = SpreadSheet()
398 ss['a1'] = '5'
399 ss['a2'] = 'a1*6'
400 ss['a3'] = 'a2*7'
401 self.assertEqual(ss['a3'], 210)
402
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000403 # Verify that dir() catches a non-list returned by eval
404 # SF bug #1004669
405 class C:
406 def __getitem__(self, item):
407 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000408 def keys(self):
409 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000410 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
411
Georg Brandl7cae87c2006-09-06 06:51:57 +0000412 def test_exec(self):
413 g = {}
414 exec('z = 1', g)
415 if '__builtins__' in g:
416 del g['__builtins__']
417 self.assertEqual(g, {'z': 1})
418
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000419 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000420 if '__builtins__' in g:
421 del g['__builtins__']
422 self.assertEqual(g, {'z': 2})
423 g = {}
424 l = {}
425
Brett Cannon77628992010-03-20 20:59:33 +0000426 with check_warnings():
427 warnings.filterwarnings("ignore", "global statement",
428 module="<string>")
429 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000430 if '__builtins__' in g:
431 del g['__builtins__']
432 if '__builtins__' in l:
433 del l['__builtins__']
434 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
435
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000436 def test_exec_redirected(self):
437 savestdout = sys.stdout
438 sys.stdout = None # Whatever that cannot flush()
439 try:
440 # Used to raise SystemError('error return without exception set')
441 exec('a')
442 except NameError:
443 pass
444 finally:
445 sys.stdout = savestdout
446
Walter Dörwald919497e2003-01-19 16:23:59 +0000447 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000448 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
449 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
450 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
451 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
452 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 def identity(item):
454 return 1
455 filter(identity, Squares(5))
456 self.assertRaises(TypeError, filter)
457 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000458 def __getitem__(self, index):
459 if index<4:
460 return 42
461 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000462 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000463 def badfunc():
464 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000465 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000466
Walter Dörwaldbf517072003-01-27 15:57:14 +0000467 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000468 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
469 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
470 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000471
Walter Dörwald919497e2003-01-19 16:23:59 +0000472 def test_getattr(self):
473 import sys
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000474 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000475 self.assertRaises(TypeError, getattr, sys, 1)
476 self.assertRaises(TypeError, getattr, sys, 1, "foo")
477 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000478 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000479 # unicode surrogates are not encodable to the default encoding (utf8)
480 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000481
482 def test_hasattr(self):
483 import sys
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000484 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000485 self.assertRaises(TypeError, hasattr, sys, 1)
486 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000487 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000488
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000489 # Check that hasattr allows SystemExit and KeyboardInterrupts by
490 class A:
491 def __getattr__(self, what):
492 raise KeyboardInterrupt
493 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
494 class B:
495 def __getattr__(self, what):
496 raise SystemExit
497 self.assertRaises(SystemExit, hasattr, B(), "b")
498
Walter Dörwald919497e2003-01-19 16:23:59 +0000499 def test_hash(self):
500 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000501 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000502 self.assertEqual(hash(1), hash(1.0))
503 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000504 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000505 hash((0,1,2,3))
506 def f(): pass
507 self.assertRaises(TypeError, hash, [])
508 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000509 # Bug 1536021: Allow hash to return long objects
510 class X:
511 def __hash__(self):
512 return 2**100
513 self.assertEquals(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000514 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000515 def __hash__(self):
516 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000517 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000518
519 def test_hex(self):
520 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000521 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000522 self.assertRaises(TypeError, hex, {})
523
524 def test_id(self):
525 id(None)
526 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000527 id(1.0)
528 id('spam')
529 id((0,1,2,3))
530 id([0,1,2,3])
531 id({'spam': 1, 'eggs': 2, 'ham': 3})
532
Guido van Rossuma88a0332007-02-26 16:59:55 +0000533 # Test input() later, alphabetized as if it were raw_input
534
Walter Dörwald919497e2003-01-19 16:23:59 +0000535 def test_iter(self):
536 self.assertRaises(TypeError, iter)
537 self.assertRaises(TypeError, iter, 42, 42)
538 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000539 for l in lists:
540 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000541 self.assertEqual(next(i), '1')
542 self.assertEqual(next(i), '2')
543 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000544
545 def test_isinstance(self):
546 class C:
547 pass
548 class D(C):
549 pass
550 class E:
551 pass
552 c = C()
553 d = D()
554 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000555 self.assertTrue(isinstance(c, C))
556 self.assertTrue(isinstance(d, C))
557 self.assertTrue(not isinstance(e, C))
558 self.assertTrue(not isinstance(c, D))
559 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000560 self.assertRaises(TypeError, isinstance, E, 'foo')
561 self.assertRaises(TypeError, isinstance)
562
563 def test_issubclass(self):
564 class C:
565 pass
566 class D(C):
567 pass
568 class E:
569 pass
570 c = C()
571 d = D()
572 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000573 self.assertTrue(issubclass(D, C))
574 self.assertTrue(issubclass(C, C))
575 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000576 self.assertRaises(TypeError, issubclass, 'foo', E)
577 self.assertRaises(TypeError, issubclass, E, 'foo')
578 self.assertRaises(TypeError, issubclass)
579
580 def test_len(self):
581 self.assertEqual(len('123'), 3)
582 self.assertEqual(len(()), 0)
583 self.assertEqual(len((1, 2, 3, 4)), 4)
584 self.assertEqual(len([1, 2, 3, 4]), 4)
585 self.assertEqual(len({}), 0)
586 self.assertEqual(len({'a':1, 'b': 2}), 2)
587 class BadSeq:
588 def __len__(self):
589 raise ValueError
590 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000591 class InvalidLen:
592 def __len__(self):
593 return None
594 self.assertRaises(TypeError, len, InvalidLen())
595 class FloatLen:
596 def __len__(self):
597 return 4.5
598 self.assertRaises(TypeError, len, FloatLen())
599 class HugeLen:
600 def __len__(self):
601 return sys.maxsize + 1
602 self.assertRaises(OverflowError, len, HugeLen())
Walter Dörwald919497e2003-01-19 16:23:59 +0000603
Walter Dörwald919497e2003-01-19 16:23:59 +0000604 def test_map(self):
605 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000606 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000607 [1, 4, 9]
608 )
609 try:
610 from math import sqrt
611 except ImportError:
612 def sqrt(x):
613 return pow(x, 0.5)
614 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000615 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000616 [[4.0, 2.0], [9.0, 3.0]]
617 )
618 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000619 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000620 [10, 4, 6]
621 )
622
623 def plus(*v):
624 accu = 0
625 for i in v: accu = accu + i
626 return accu
627 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000628 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000629 [1, 3, 7]
630 )
631 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000632 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 [1+4, 3+9, 7+2]
634 )
635 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000636 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000637 [1+4+1, 3+9+1, 7+2+0]
638 )
639 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000640 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000641 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
642 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000643 def Max(a, b):
644 if a is None:
645 return b
646 if b is None:
647 return a
648 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000650 list(map(Max, Squares(3), Squares(2))),
651 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 )
653 self.assertRaises(TypeError, map)
654 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000656 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000657 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000658 yield None
659 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000660 def badfunc(x):
661 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000662 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000663
664 def test_max(self):
665 self.assertEqual(max('123123'), '3')
666 self.assertEqual(max(1, 2, 3), 3)
667 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
668 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
669
Guido van Rossume2a383d2007-01-15 16:59:06 +0000670 self.assertEqual(max(1, 2, 3.0), 3.0)
671 self.assertEqual(max(1, 2.0, 3), 3)
672 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000673
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000674 for stmt in (
675 "max(key=int)", # no args
676 "max(1, key=int)", # single arg not iterable
677 "max(1, 2, keystone=int)", # wrong keyword
678 "max(1, 2, key=int, abc=int)", # two many keywords
679 "max(1, 2, key=1)", # keyfunc is not callable
680 ):
Tim Peters7f061872004-12-07 21:17:46 +0000681 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000682 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000683 except TypeError:
684 pass
685 else:
686 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000687
688 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
689 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
690 self.assertEqual(max(1, 2, key=neg), 1) # two elems
691
692 data = [random.randrange(200) for i in range(100)]
693 keys = dict((elem, random.randrange(50)) for elem in data)
694 f = keys.__getitem__
695 self.assertEqual(max(data, key=f),
696 sorted(reversed(data), key=f)[-1])
697
Walter Dörwald919497e2003-01-19 16:23:59 +0000698 def test_min(self):
699 self.assertEqual(min('123123'), '1')
700 self.assertEqual(min(1, 2, 3), 1)
701 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
702 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
703
Guido van Rossume2a383d2007-01-15 16:59:06 +0000704 self.assertEqual(min(1, 2, 3.0), 1)
705 self.assertEqual(min(1, 2.0, 3), 1)
706 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000707
708 self.assertRaises(TypeError, min)
709 self.assertRaises(TypeError, min, 42)
710 self.assertRaises(ValueError, min, ())
711 class BadSeq:
712 def __getitem__(self, index):
713 raise ValueError
714 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000715
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000716 for stmt in (
717 "min(key=int)", # no args
718 "min(1, key=int)", # single arg not iterable
719 "min(1, 2, keystone=int)", # wrong keyword
720 "min(1, 2, key=int, abc=int)", # two many keywords
721 "min(1, 2, key=1)", # keyfunc is not callable
722 ):
Tim Peters7f061872004-12-07 21:17:46 +0000723 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000724 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000725 except TypeError:
726 pass
727 else:
728 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000729
730 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
731 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
732 self.assertEqual(min(1, 2, key=neg), 2) # two elems
733
734 data = [random.randrange(200) for i in range(100)]
735 keys = dict((elem, random.randrange(50)) for elem in data)
736 f = keys.__getitem__
737 self.assertEqual(min(data, key=f),
738 sorted(data, key=f)[0])
739
Georg Brandla18af4e2007-04-21 15:47:16 +0000740 def test_next(self):
741 it = iter(range(2))
742 self.assertEqual(next(it), 0)
743 self.assertEqual(next(it), 1)
744 self.assertRaises(StopIteration, next, it)
745 self.assertRaises(StopIteration, next, it)
746 self.assertEquals(next(it, 42), 42)
747
748 class Iter(object):
749 def __iter__(self):
750 return self
751 def __next__(self):
752 raise StopIteration
753
754 it = iter(Iter())
755 self.assertEquals(next(it, 42), 42)
756 self.assertRaises(StopIteration, next, it)
757
758 def gen():
759 yield 1
760 return
761
762 it = gen()
763 self.assertEquals(next(it), 1)
764 self.assertRaises(StopIteration, next, it)
765 self.assertEquals(next(it, 42), 42)
766
Walter Dörwald919497e2003-01-19 16:23:59 +0000767 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000768 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000769 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000770 self.assertRaises(TypeError, oct, ())
771
772 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000773 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000774 fp = open(TESTFN, 'w')
775 try:
776 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 fp.write('The quick brown fox jumps over the lazy dog')
778 fp.write('.\n')
779 fp.write('Dear John\n')
780 fp.write('XXX'*100)
781 fp.write('YYY'*100)
782 finally:
783 fp.close()
784
785 def test_open(self):
786 self.write_testfile()
787 fp = open(TESTFN, 'r')
788 try:
789 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
791 self.assertEqual(fp.readline(4), 'Dear')
792 self.assertEqual(fp.readline(100), ' John\n')
793 self.assertEqual(fp.read(300), 'XXX'*100)
794 self.assertEqual(fp.read(1000), 'YYY'*100)
795 finally:
796 fp.close()
797 unlink(TESTFN)
798
799 def test_ord(self):
800 self.assertEqual(ord(' '), 32)
801 self.assertEqual(ord('A'), 65)
802 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000803 self.assertEqual(ord('\x80'), 128)
804 self.assertEqual(ord('\xff'), 255)
805
806 self.assertEqual(ord(b' '), 32)
807 self.assertEqual(ord(b'A'), 65)
808 self.assertEqual(ord(b'a'), 97)
809 self.assertEqual(ord(b'\x80'), 128)
810 self.assertEqual(ord(b'\xff'), 255)
811
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000812 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000814
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000815 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
816 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
817 self.assertEqual(ord("\U00010000"), 0x00010000)
818 self.assertEqual(ord("\U00010001"), 0x00010001)
819 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
820 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
821 self.assertEqual(ord("\U00100000"), 0x00100000)
822 self.assertEqual(ord("\U00100001"), 0x00100001)
823 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
824 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
825
Walter Dörwald919497e2003-01-19 16:23:59 +0000826 def test_pow(self):
827 self.assertEqual(pow(0,0), 1)
828 self.assertEqual(pow(0,1), 0)
829 self.assertEqual(pow(1,0), 1)
830 self.assertEqual(pow(1,1), 1)
831
832 self.assertEqual(pow(2,0), 1)
833 self.assertEqual(pow(2,10), 1024)
834 self.assertEqual(pow(2,20), 1024*1024)
835 self.assertEqual(pow(2,30), 1024*1024*1024)
836
837 self.assertEqual(pow(-2,0), 1)
838 self.assertEqual(pow(-2,1), -2)
839 self.assertEqual(pow(-2,2), 4)
840 self.assertEqual(pow(-2,3), -8)
841
Walter Dörwald919497e2003-01-19 16:23:59 +0000842 self.assertAlmostEqual(pow(0.,0), 1.)
843 self.assertAlmostEqual(pow(0.,1), 0.)
844 self.assertAlmostEqual(pow(1.,0), 1.)
845 self.assertAlmostEqual(pow(1.,1), 1.)
846
847 self.assertAlmostEqual(pow(2.,0), 1.)
848 self.assertAlmostEqual(pow(2.,10), 1024.)
849 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
850 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
851
852 self.assertAlmostEqual(pow(-2.,0), 1.)
853 self.assertAlmostEqual(pow(-2.,1), -2.)
854 self.assertAlmostEqual(pow(-2.,2), 4.)
855 self.assertAlmostEqual(pow(-2.,3), -8.)
856
Mark Dickinson5c2db372009-12-05 20:28:34 +0000857 for x in 2, 2.0:
858 for y in 10, 10.0:
859 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000860 if isinstance(x, float) or \
861 isinstance(y, float) or \
862 isinstance(z, float):
863 self.assertRaises(TypeError, pow, x, y, z)
864 else:
865 self.assertAlmostEqual(pow(x, y, z), 24.0)
866
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000867 self.assertAlmostEqual(pow(-1, 0.5), 1j)
868 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
869
Walter Dörwald919497e2003-01-19 16:23:59 +0000870 self.assertRaises(TypeError, pow, -1, -2, 3)
871 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000872
873 self.assertRaises(TypeError, pow)
874
875 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000876 self.assertEqual(list(range(3)), [0, 1, 2])
877 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
878 self.assertEqual(list(range(0)), [])
879 self.assertEqual(list(range(-3)), [])
880 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
881 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000882
Mark Dickinsoneb36d312009-06-24 18:36:46 +0000883 #issue 6334: the internal stored range length was being
884 #computed incorrectly in some cases involving large arguments.
885 x = range(10**20, 10**20+10, 3)
886 self.assertEqual(len(x), 4)
887 self.assertEqual(len(list(x)), 4)
888
889 x = range(10**20+10, 10**20, 3)
890 self.assertEqual(len(x), 0)
891 self.assertEqual(len(list(x)), 0)
892
893 x = range(10**20, 10**20+10, -3)
894 self.assertEqual(len(x), 0)
895 self.assertEqual(len(list(x)), 0)
896
897 x = range(10**20+10, 10**20, -3)
898 self.assertEqual(len(x), 4)
899 self.assertEqual(len(list(x)), 4)
900
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000901 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000902 self.assertEqual(list(range(-2**100)), [])
903 self.assertEqual(list(range(0, -2**100)), [])
904 self.assertEqual(list(range(0, 2**100, -1)), [])
905 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000906
Christian Heimesa37d4c62007-12-04 23:02:19 +0000907 a = int(10 * sys.maxsize)
908 b = int(100 * sys.maxsize)
909 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000910
Guido van Rossum805365e2007-05-07 22:24:25 +0000911 self.assertEqual(list(range(a, a+2)), [a, a+1])
912 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
913 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000914
Guido van Rossum805365e2007-05-07 22:24:25 +0000915 seq = list(range(a, b, c))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000916 self.assertIn(a, seq)
917 self.assertNotIn(b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000918 self.assertEqual(len(seq), 2)
919
Guido van Rossum805365e2007-05-07 22:24:25 +0000920 seq = list(range(b, a, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000921 self.assertIn(b, seq)
922 self.assertNotIn(a, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000923 self.assertEqual(len(seq), 2)
924
Guido van Rossum805365e2007-05-07 22:24:25 +0000925 seq = list(range(-a, -b, -c))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000926 self.assertIn(-a, seq)
927 self.assertNotIn(-b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000928 self.assertEqual(len(seq), 2)
929
Walter Dörwald919497e2003-01-19 16:23:59 +0000930 self.assertRaises(TypeError, range)
931 self.assertRaises(TypeError, range, 1, 2, 3, 4)
932 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000933 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000934
Mark Dickinson5c2db372009-12-05 20:28:34 +0000935 """ XXX(nnorwitz):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000936 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000937 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000938 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000939 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
940
941 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000942 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000943 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000944
Mark Dickinson85b53532010-05-05 22:39:58 +0000945 # Reject floats.
946 self.assertRaises(TypeError, range, 1., 1., 1.)
Tim Peters299b3df2003-04-15 14:40:03 +0000947 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000948
Walter Dörwald357981e2003-04-15 18:59:28 +0000949 self.assertRaises(TypeError, range, 0, "spam")
950 self.assertRaises(TypeError, range, 0, 42, "spam")
951
Christian Heimesa37d4c62007-12-04 23:02:19 +0000952 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
953 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000954
Christian Heimesa37d4c62007-12-04 23:02:19 +0000955 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000956
Mark Dickinson85b53532010-05-05 22:39:58 +0000957 bignum = 2*sys.maxsize
958 smallnum = 42
959
960 # User-defined class with an __index__ method
961 class I:
962 def __init__(self, n):
963 self.n = int(n)
964 def __index__(self):
965 return self.n
966 self.assertEqual(list(range(I(bignum), I(bignum + 1))), [bignum])
967 self.assertEqual(list(range(I(smallnum), I(smallnum + 1))), [smallnum])
968
969 # User-defined class with a failing __index__ method
970 class IX:
971 def __index__(self):
972 raise RuntimeError
973 self.assertRaises(RuntimeError, range, IX())
974
975 # User-defined class with an invalid __index__ method
976 class IN:
977 def __index__(self):
978 return "not a number"
979
980 self.assertRaises(TypeError, range, IN())
981 # Exercise various combinations of bad arguments, to check
982 # refcounting logic
983 self.assertRaises(TypeError, range, 0.0)
984
985 self.assertRaises(TypeError, range, 0, 0.0)
986 self.assertRaises(TypeError, range, 0.0, 0)
987 self.assertRaises(TypeError, range, 0.0, 0.0)
988
989 self.assertRaises(TypeError, range, 0, 0, 1.0)
990 self.assertRaises(TypeError, range, 0, 0.0, 1)
991 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
992 self.assertRaises(TypeError, range, 0.0, 0, 1)
993 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
994 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
995 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
996
Guido van Rossuma88a0332007-02-26 16:59:55 +0000997 def test_input(self):
998 self.write_testfile()
999 fp = open(TESTFN, 'r')
1000 savestdin = sys.stdin
1001 savestdout = sys.stdout # Eats the echo
1002 try:
1003 sys.stdin = fp
1004 sys.stdout = BitBucket()
1005 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001006 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1007 self.assertEqual(input('testing\n'), 'Dear John')
1008
1009 # SF 1535165: don't segfault on closed stdin
1010 # sys.stdout must be a regular file for triggering
1011 sys.stdout = savestdout
1012 sys.stdin.close()
1013 self.assertRaises(ValueError, input)
1014
1015 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001016 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001017 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001018 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001019 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001020 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001021 self.assertRaises(EOFError, input)
1022
1023 del sys.stdout
1024 self.assertRaises(RuntimeError, input, 'prompt')
1025 del sys.stdin
1026 self.assertRaises(RuntimeError, input, 'prompt')
1027 finally:
1028 sys.stdin = savestdin
1029 sys.stdout = savestdout
1030 fp.close()
1031 unlink(TESTFN)
1032
Walter Dörwald919497e2003-01-19 16:23:59 +00001033 def test_repr(self):
1034 self.assertEqual(repr(''), '\'\'')
1035 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001036 self.assertEqual(repr(()), '()')
1037 self.assertEqual(repr([]), '[]')
1038 self.assertEqual(repr({}), '{}')
1039 a = []
1040 a.append(a)
1041 self.assertEqual(repr(a), '[[...]]')
1042 a = {}
1043 a[0] = a
1044 self.assertEqual(repr(a), '{0: {...}}')
1045
1046 def test_round(self):
1047 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001048 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001049 self.assertEqual(round(1.0), 1.0)
1050 self.assertEqual(round(10.0), 10.0)
1051 self.assertEqual(round(1000000000.0), 1000000000.0)
1052 self.assertEqual(round(1e20), 1e20)
1053
1054 self.assertEqual(round(-1.0), -1.0)
1055 self.assertEqual(round(-10.0), -10.0)
1056 self.assertEqual(round(-1000000000.0), -1000000000.0)
1057 self.assertEqual(round(-1e20), -1e20)
1058
1059 self.assertEqual(round(0.1), 0.0)
1060 self.assertEqual(round(1.1), 1.0)
1061 self.assertEqual(round(10.1), 10.0)
1062 self.assertEqual(round(1000000000.1), 1000000000.0)
1063
1064 self.assertEqual(round(-1.1), -1.0)
1065 self.assertEqual(round(-10.1), -10.0)
1066 self.assertEqual(round(-1000000000.1), -1000000000.0)
1067
1068 self.assertEqual(round(0.9), 1.0)
1069 self.assertEqual(round(9.9), 10.0)
1070 self.assertEqual(round(999999999.9), 1000000000.0)
1071
1072 self.assertEqual(round(-0.9), -1.0)
1073 self.assertEqual(round(-9.9), -10.0)
1074 self.assertEqual(round(-999999999.9), -1000000000.0)
1075
1076 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001077 self.assertEqual(type(round(-8.0, -1)), float)
1078
1079 self.assertEqual(type(round(-8.0, 0)), float)
1080 self.assertEqual(type(round(-8.0, 1)), float)
1081
1082 # Check even / odd rounding behaviour
1083 self.assertEqual(round(5.5), 6)
1084 self.assertEqual(round(6.5), 6)
1085 self.assertEqual(round(-5.5), -6)
1086 self.assertEqual(round(-6.5), -6)
1087
1088 # Check behavior on ints
1089 self.assertEqual(round(0), 0)
1090 self.assertEqual(round(8), 8)
1091 self.assertEqual(round(-8), -8)
1092 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001093 self.assertEqual(type(round(-8, -1)), int)
1094 self.assertEqual(type(round(-8, 0)), int)
1095 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001096
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001097 # test new kwargs
1098 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1099
Walter Dörwald919497e2003-01-19 16:23:59 +00001100 self.assertRaises(TypeError, round)
1101
Alex Martelliae211f92007-08-22 23:21:33 +00001102 # test generic rounding delegation for reals
1103 class TestRound:
1104 def __round__(self):
1105 return 23
1106
1107 class TestNoRound:
1108 pass
1109
1110 self.assertEqual(round(TestRound()), 23)
1111
1112 self.assertRaises(TypeError, round, 1, 2, 3)
1113 self.assertRaises(TypeError, round, TestNoRound())
1114
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001115 t = TestNoRound()
1116 t.__round__ = lambda *args: args
1117 self.assertRaises(TypeError, round, t)
1118 self.assertRaises(TypeError, round, t, 0)
1119
Mark Dickinsonad731b92009-11-09 17:12:30 +00001120 # Some versions of glibc for alpha have a bug that affects
1121 # float -> integer rounding (floor, ceil, rint, round) for
1122 # values in the range [2**52, 2**53). See:
1123 #
1124 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1125 #
1126 # We skip this test on Linux/alpha if it would fail.
1127 linux_alpha = (platform.system().startswith('Linux') and
1128 platform.machine().startswith('alpha'))
1129 system_round_bug = round(5e15+1) != 5e15+1
1130 @unittest.skipIf(linux_alpha and system_round_bug,
1131 "test will fail; failure is probably due to a "
1132 "buggy system round function")
1133 def test_round_large(self):
1134 # Issue #1869: integral floats should remain unchanged
1135 self.assertEqual(round(5e15-1), 5e15-1)
1136 self.assertEqual(round(5e15), 5e15)
1137 self.assertEqual(round(5e15+1), 5e15+1)
1138 self.assertEqual(round(5e15+2), 5e15+2)
1139 self.assertEqual(round(5e15+3), 5e15+3)
1140
Walter Dörwald919497e2003-01-19 16:23:59 +00001141 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001142 setattr(sys, 'spam', 1)
1143 self.assertEqual(sys.spam, 1)
1144 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1145 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001146
Walter Dörwald919497e2003-01-19 16:23:59 +00001147
Alex Martellia70b1912003-04-22 08:12:33 +00001148 def test_sum(self):
1149 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001150 self.assertEqual(sum(list(range(2,8))), 27)
1151 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001152 self.assertEqual(sum(Squares(10)), 285)
1153 self.assertEqual(sum(iter(Squares(10))), 285)
1154 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1155
1156 self.assertRaises(TypeError, sum)
1157 self.assertRaises(TypeError, sum, 42)
1158 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1159 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1160 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1161 self.assertRaises(TypeError, sum, [{2:3}])
1162 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1163
1164 class BadSeq:
1165 def __getitem__(self, index):
1166 raise ValueError
1167 self.assertRaises(ValueError, sum, BadSeq())
1168
Mark Dickinson3a22b472009-10-17 21:48:16 +00001169 empty = []
1170 sum(([x] for x in range(10)), empty)
1171 self.assertEqual(empty, [])
1172
Walter Dörwald919497e2003-01-19 16:23:59 +00001173 def test_type(self):
1174 self.assertEqual(type(''), type('123'))
1175 self.assertNotEqual(type(''), type(()))
1176
Guido van Rossumfee7b932005-01-16 00:21:28 +00001177 # We don't want self in vars(), so these are static methods
1178
1179 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001180 def get_vars_f0():
1181 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001182
Guido van Rossumfee7b932005-01-16 00:21:28 +00001183 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 def get_vars_f2():
1185 BuiltinTest.get_vars_f0()
1186 a = 1
1187 b = 2
1188 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001189
1190 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001191 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001193 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001194 self.assertEqual(self.get_vars_f0(), {})
1195 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1196 self.assertRaises(TypeError, vars, 42, 42)
1197 self.assertRaises(TypeError, vars, 42)
1198
1199 def test_zip(self):
1200 a = (1, 2, 3)
1201 b = (4, 5, 6)
1202 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001203 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001204 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001205 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001206 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001207 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001208 class I:
1209 def __getitem__(self, i):
1210 if i < 0 or i > 2: raise IndexError
1211 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001212 self.assertEqual(list(zip(a, I())), t)
1213 self.assertEqual(list(zip()), [])
1214 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001215 self.assertRaises(TypeError, zip, None)
1216 class G:
1217 pass
1218 self.assertRaises(TypeError, zip, a, G())
1219
1220 # Make sure zip doesn't try to allocate a billion elements for the
1221 # result list when one of its arguments doesn't say how long it is.
1222 # A MemoryError is the most likely failure mode.
1223 class SequenceWithoutALength:
1224 def __getitem__(self, i):
1225 if i == 5:
1226 raise IndexError
1227 else:
1228 return i
1229 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001230 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001231 list(enumerate(range(5)))
1232 )
1233
1234 class BadSeq:
1235 def __getitem__(self, i):
1236 if i == 5:
1237 raise ValueError
1238 else:
1239 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001240 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001241
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001242 def test_bin(self):
1243 self.assertEqual(bin(0), '0b0')
1244 self.assertEqual(bin(1), '0b1')
1245 self.assertEqual(bin(-1), '-0b1')
1246 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1247 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1248 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1249 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1250
Georg Brandl953152f2009-07-22 12:03:59 +00001251 def test_bytearray_translate(self):
1252 x = bytearray(b"abc")
1253 self.assertRaises(ValueError, x.translate, b"1", 1)
1254 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1255
Raymond Hettinger64958a12003-12-17 20:43:33 +00001256class TestSorted(unittest.TestCase):
1257
1258 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001259 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001260 copy = data[:]
1261 random.shuffle(copy)
1262 self.assertEqual(data, sorted(copy))
1263 self.assertNotEqual(data, copy)
1264
1265 data.reverse()
1266 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001267 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1268 self.assertNotEqual(data, copy)
1269 random.shuffle(copy)
1270 self.assertEqual(data, sorted(copy, reverse=1))
1271 self.assertNotEqual(data, copy)
1272
1273 def test_inputtypes(self):
1274 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001275 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001276 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001277 self.assertEqual(sorted(s), sorted(T(s)))
1278
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001279 s = ''.join(set(s)) # unique letters only
1280 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001281 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001282 self.assertEqual(sorted(s), sorted(T(s)))
1283
1284 def test_baddecorator(self):
1285 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1286 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1287
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001288def test_main(verbose=None):
1289 test_classes = (BuiltinTest, TestSorted)
1290
1291 run_unittest(*test_classes)
1292
1293 # verify reference counting
1294 if verbose and hasattr(sys, "gettotalrefcount"):
1295 import gc
1296 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001297 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001298 run_unittest(*test_classes)
1299 gc.collect()
1300 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001301 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001302
Walter Dörwald919497e2003-01-19 16:23:59 +00001303
1304if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001305 test_main(verbose=True)