blob: 5df7efbe901a14b05c947583d5c47676fab11748 [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
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000945 # Reject floats when it would require PyLongs to represent.
946 # (smaller floats still accepted, but deprecated)
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
Guido van Rossuma88a0332007-02-26 16:59:55 +0000957 def test_input(self):
958 self.write_testfile()
959 fp = open(TESTFN, 'r')
960 savestdin = sys.stdin
961 savestdout = sys.stdout # Eats the echo
962 try:
963 sys.stdin = fp
964 sys.stdout = BitBucket()
965 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000966 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
967 self.assertEqual(input('testing\n'), 'Dear John')
968
969 # SF 1535165: don't segfault on closed stdin
970 # sys.stdout must be a regular file for triggering
971 sys.stdout = savestdout
972 sys.stdin.close()
973 self.assertRaises(ValueError, input)
974
975 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000976 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000977 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000978 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000979 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000980 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000981 self.assertRaises(EOFError, input)
982
983 del sys.stdout
984 self.assertRaises(RuntimeError, input, 'prompt')
985 del sys.stdin
986 self.assertRaises(RuntimeError, input, 'prompt')
987 finally:
988 sys.stdin = savestdin
989 sys.stdout = savestdout
990 fp.close()
991 unlink(TESTFN)
992
Walter Dörwald919497e2003-01-19 16:23:59 +0000993 def test_repr(self):
994 self.assertEqual(repr(''), '\'\'')
995 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 self.assertEqual(repr(()), '()')
997 self.assertEqual(repr([]), '[]')
998 self.assertEqual(repr({}), '{}')
999 a = []
1000 a.append(a)
1001 self.assertEqual(repr(a), '[[...]]')
1002 a = {}
1003 a[0] = a
1004 self.assertEqual(repr(a), '{0: {...}}')
1005
1006 def test_round(self):
1007 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001008 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001009 self.assertEqual(round(1.0), 1.0)
1010 self.assertEqual(round(10.0), 10.0)
1011 self.assertEqual(round(1000000000.0), 1000000000.0)
1012 self.assertEqual(round(1e20), 1e20)
1013
1014 self.assertEqual(round(-1.0), -1.0)
1015 self.assertEqual(round(-10.0), -10.0)
1016 self.assertEqual(round(-1000000000.0), -1000000000.0)
1017 self.assertEqual(round(-1e20), -1e20)
1018
1019 self.assertEqual(round(0.1), 0.0)
1020 self.assertEqual(round(1.1), 1.0)
1021 self.assertEqual(round(10.1), 10.0)
1022 self.assertEqual(round(1000000000.1), 1000000000.0)
1023
1024 self.assertEqual(round(-1.1), -1.0)
1025 self.assertEqual(round(-10.1), -10.0)
1026 self.assertEqual(round(-1000000000.1), -1000000000.0)
1027
1028 self.assertEqual(round(0.9), 1.0)
1029 self.assertEqual(round(9.9), 10.0)
1030 self.assertEqual(round(999999999.9), 1000000000.0)
1031
1032 self.assertEqual(round(-0.9), -1.0)
1033 self.assertEqual(round(-9.9), -10.0)
1034 self.assertEqual(round(-999999999.9), -1000000000.0)
1035
1036 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001037 self.assertEqual(type(round(-8.0, -1)), float)
1038
1039 self.assertEqual(type(round(-8.0, 0)), float)
1040 self.assertEqual(type(round(-8.0, 1)), float)
1041
1042 # Check even / odd rounding behaviour
1043 self.assertEqual(round(5.5), 6)
1044 self.assertEqual(round(6.5), 6)
1045 self.assertEqual(round(-5.5), -6)
1046 self.assertEqual(round(-6.5), -6)
1047
1048 # Check behavior on ints
1049 self.assertEqual(round(0), 0)
1050 self.assertEqual(round(8), 8)
1051 self.assertEqual(round(-8), -8)
1052 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001053 self.assertEqual(type(round(-8, -1)), int)
1054 self.assertEqual(type(round(-8, 0)), int)
1055 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001056
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001057 # test new kwargs
1058 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1059
Walter Dörwald919497e2003-01-19 16:23:59 +00001060 self.assertRaises(TypeError, round)
1061
Alex Martelliae211f92007-08-22 23:21:33 +00001062 # test generic rounding delegation for reals
1063 class TestRound:
1064 def __round__(self):
1065 return 23
1066
1067 class TestNoRound:
1068 pass
1069
1070 self.assertEqual(round(TestRound()), 23)
1071
1072 self.assertRaises(TypeError, round, 1, 2, 3)
1073 self.assertRaises(TypeError, round, TestNoRound())
1074
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001075 t = TestNoRound()
1076 t.__round__ = lambda *args: args
1077 self.assertRaises(TypeError, round, t)
1078 self.assertRaises(TypeError, round, t, 0)
1079
Mark Dickinsonad731b92009-11-09 17:12:30 +00001080 # Some versions of glibc for alpha have a bug that affects
1081 # float -> integer rounding (floor, ceil, rint, round) for
1082 # values in the range [2**52, 2**53). See:
1083 #
1084 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1085 #
1086 # We skip this test on Linux/alpha if it would fail.
1087 linux_alpha = (platform.system().startswith('Linux') and
1088 platform.machine().startswith('alpha'))
1089 system_round_bug = round(5e15+1) != 5e15+1
1090 @unittest.skipIf(linux_alpha and system_round_bug,
1091 "test will fail; failure is probably due to a "
1092 "buggy system round function")
1093 def test_round_large(self):
1094 # Issue #1869: integral floats should remain unchanged
1095 self.assertEqual(round(5e15-1), 5e15-1)
1096 self.assertEqual(round(5e15), 5e15)
1097 self.assertEqual(round(5e15+1), 5e15+1)
1098 self.assertEqual(round(5e15+2), 5e15+2)
1099 self.assertEqual(round(5e15+3), 5e15+3)
1100
Walter Dörwald919497e2003-01-19 16:23:59 +00001101 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001102 setattr(sys, 'spam', 1)
1103 self.assertEqual(sys.spam, 1)
1104 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1105 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001106
Walter Dörwald919497e2003-01-19 16:23:59 +00001107
Alex Martellia70b1912003-04-22 08:12:33 +00001108 def test_sum(self):
1109 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001110 self.assertEqual(sum(list(range(2,8))), 27)
1111 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001112 self.assertEqual(sum(Squares(10)), 285)
1113 self.assertEqual(sum(iter(Squares(10))), 285)
1114 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1115
1116 self.assertRaises(TypeError, sum)
1117 self.assertRaises(TypeError, sum, 42)
1118 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1119 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1120 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1121 self.assertRaises(TypeError, sum, [{2:3}])
1122 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1123
1124 class BadSeq:
1125 def __getitem__(self, index):
1126 raise ValueError
1127 self.assertRaises(ValueError, sum, BadSeq())
1128
Mark Dickinson3a22b472009-10-17 21:48:16 +00001129 empty = []
1130 sum(([x] for x in range(10)), empty)
1131 self.assertEqual(empty, [])
1132
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def test_type(self):
1134 self.assertEqual(type(''), type('123'))
1135 self.assertNotEqual(type(''), type(()))
1136
Guido van Rossumfee7b932005-01-16 00:21:28 +00001137 # We don't want self in vars(), so these are static methods
1138
1139 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001140 def get_vars_f0():
1141 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001142
Guido van Rossumfee7b932005-01-16 00:21:28 +00001143 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001144 def get_vars_f2():
1145 BuiltinTest.get_vars_f0()
1146 a = 1
1147 b = 2
1148 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
1150 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001151 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001152 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001153 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001154 self.assertEqual(self.get_vars_f0(), {})
1155 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1156 self.assertRaises(TypeError, vars, 42, 42)
1157 self.assertRaises(TypeError, vars, 42)
1158
1159 def test_zip(self):
1160 a = (1, 2, 3)
1161 b = (4, 5, 6)
1162 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001163 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001164 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001165 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001167 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 class I:
1169 def __getitem__(self, i):
1170 if i < 0 or i > 2: raise IndexError
1171 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001172 self.assertEqual(list(zip(a, I())), t)
1173 self.assertEqual(list(zip()), [])
1174 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 self.assertRaises(TypeError, zip, None)
1176 class G:
1177 pass
1178 self.assertRaises(TypeError, zip, a, G())
1179
1180 # Make sure zip doesn't try to allocate a billion elements for the
1181 # result list when one of its arguments doesn't say how long it is.
1182 # A MemoryError is the most likely failure mode.
1183 class SequenceWithoutALength:
1184 def __getitem__(self, i):
1185 if i == 5:
1186 raise IndexError
1187 else:
1188 return i
1189 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001190 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001191 list(enumerate(range(5)))
1192 )
1193
1194 class BadSeq:
1195 def __getitem__(self, i):
1196 if i == 5:
1197 raise ValueError
1198 else:
1199 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001200 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001201
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001202 def test_bin(self):
1203 self.assertEqual(bin(0), '0b0')
1204 self.assertEqual(bin(1), '0b1')
1205 self.assertEqual(bin(-1), '-0b1')
1206 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1207 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1208 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1209 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1210
Georg Brandl953152f2009-07-22 12:03:59 +00001211 def test_bytearray_translate(self):
1212 x = bytearray(b"abc")
1213 self.assertRaises(ValueError, x.translate, b"1", 1)
1214 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1215
Raymond Hettinger64958a12003-12-17 20:43:33 +00001216class TestSorted(unittest.TestCase):
1217
1218 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001219 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001220 copy = data[:]
1221 random.shuffle(copy)
1222 self.assertEqual(data, sorted(copy))
1223 self.assertNotEqual(data, copy)
1224
1225 data.reverse()
1226 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001227 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1228 self.assertNotEqual(data, copy)
1229 random.shuffle(copy)
1230 self.assertEqual(data, sorted(copy, reverse=1))
1231 self.assertNotEqual(data, copy)
1232
1233 def test_inputtypes(self):
1234 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001235 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001236 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001237 self.assertEqual(sorted(s), sorted(T(s)))
1238
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001239 s = ''.join(set(s)) # unique letters only
1240 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001241 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001242 self.assertEqual(sorted(s), sorted(T(s)))
1243
1244 def test_baddecorator(self):
1245 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1246 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1247
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001248def test_main(verbose=None):
1249 test_classes = (BuiltinTest, TestSorted)
1250
1251 run_unittest(*test_classes)
1252
1253 # verify reference counting
1254 if verbose and hasattr(sys, "gettotalrefcount"):
1255 import gc
1256 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001257 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001258 run_unittest(*test_classes)
1259 gc.collect()
1260 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001261 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001262
Walter Dörwald919497e2003-01-19 16:23:59 +00001263
1264if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001265 test_main(verbose=True)