blob: 4ac924608a451cb34fbd6ab1bc0615665b6f69b6 [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004import test.support, unittest
5from test.support import fcmp, TESTFN, unlink, run_unittest, \
Walter Dörwald1f5947b2007-05-22 16:52:54 +00006 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00007from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00008
Raymond Hettinger53dbe392008-02-12 20:03:09 +00009import sys, warnings, random, collections, io, fractions
Walter Dörwald919497e2003-01-19 16:23:59 +000010warnings.filterwarnings("ignore", "hex../oct.. of negative int",
11 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000012warnings.filterwarnings("ignore", "integer argument expected",
13 DeprecationWarning, "unittest")
Mark Dickinsona56c4672009-01-27 18:17:45 +000014import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Walter Dörwald919497e2003-01-19 16:23:59 +000016class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000017
Walter Dörwald919497e2003-01-19 16:23:59 +000018 def __init__(self, max):
19 self.max = max
20 self.sofar = []
21
22 def __len__(self): return len(self.sofar)
23
24 def __getitem__(self, i):
25 if not 0 <= i < self.max: raise IndexError
26 n = len(self.sofar)
27 while n <= i:
28 self.sofar.append(n*n)
29 n += 1
30 return self.sofar[i]
31
32class StrSquares:
33
34 def __init__(self, max):
35 self.max = max
36 self.sofar = []
37
38 def __len__(self):
39 return len(self.sofar)
40
41 def __getitem__(self, i):
42 if not 0 <= i < self.max:
43 raise IndexError
44 n = len(self.sofar)
45 while n <= i:
46 self.sofar.append(str(n*n))
47 n += 1
48 return self.sofar[i]
49
50class BitBucket:
51 def write(self, line):
52 pass
53
Facundo Batista2336bdd2008-01-19 19:12:01 +000054test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000055 ('0', 0),
56 ('1', 1),
57 ('9', 9),
58 ('10', 10),
59 ('99', 99),
60 ('100', 100),
61 ('314', 314),
62 (' 314', 314),
63 ('314 ', 314),
64 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000065 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000066 (' 1x', ValueError),
67 (' 1 ', 1),
68 (' 1\02 ', ValueError),
69 ('', ValueError),
70 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000071 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000072 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000073 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000074]
75
Facundo Batista2336bdd2008-01-19 19:12:01 +000076test_conv_sign = [
77 ('0', 0),
78 ('1', 1),
79 ('9', 9),
80 ('10', 10),
81 ('99', 99),
82 ('100', 100),
83 ('314', 314),
84 (' 314', ValueError),
85 ('314 ', 314),
86 (' \t\t 314 \t\t ', ValueError),
87 (repr(sys.maxsize), sys.maxsize),
88 (' 1x', ValueError),
89 (' 1 ', ValueError),
90 (' 1\02 ', ValueError),
91 ('', ValueError),
92 (' ', ValueError),
93 (' \t\t ', ValueError),
94 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
95 (chr(0x200), ValueError),
96]
97
Raymond Hettinger96229b12005-03-11 06:49:40 +000098class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000099 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000100 raise RuntimeError
101
102class TestFailingIter:
103 def __iter__(self):
104 raise RuntimeError
105
Walter Dörwald919497e2003-01-19 16:23:59 +0000106class BuiltinTest(unittest.TestCase):
107
108 def test_import(self):
109 __import__('sys')
110 __import__('time')
111 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000112 __import__(name='sys')
113 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000114 self.assertRaises(ImportError, __import__, 'spamspam')
115 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000116 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000118
119 def test_abs(self):
120 # int
121 self.assertEqual(abs(0), 0)
122 self.assertEqual(abs(1234), 1234)
123 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000124 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000125 # float
126 self.assertEqual(abs(0.0), 0.0)
127 self.assertEqual(abs(3.14), 3.14)
128 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000129 # str
130 self.assertRaises(TypeError, abs, 'a')
131
Raymond Hettinger96229b12005-03-11 06:49:40 +0000132 def test_all(self):
133 self.assertEqual(all([2, 4, 6]), True)
134 self.assertEqual(all([2, None, 6]), False)
135 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
136 self.assertRaises(RuntimeError, all, TestFailingIter())
137 self.assertRaises(TypeError, all, 10) # Non-iterable
138 self.assertRaises(TypeError, all) # No args
139 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
140 self.assertEqual(all([]), True) # Empty iterator
141 S = [50, 60]
142 self.assertEqual(all(x > 42 for x in S), True)
143 S = [50, 40, 60]
144 self.assertEqual(all(x > 42 for x in S), False)
145
146 def test_any(self):
147 self.assertEqual(any([None, None, None]), False)
148 self.assertEqual(any([None, 4, None]), True)
149 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
150 self.assertRaises(RuntimeError, all, TestFailingIter())
151 self.assertRaises(TypeError, any, 10) # Non-iterable
152 self.assertRaises(TypeError, any) # No args
153 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
154 self.assertEqual(any([]), False) # Empty iterator
155 S = [40, 60, 30]
156 self.assertEqual(any(x > 42 for x in S), True)
157 S = [10, 20, 30]
158 self.assertEqual(any(x > 42 for x in S), False)
159
Georg Brandl559e5d72008-06-11 18:37:52 +0000160 def test_ascii(self):
161 self.assertEqual(ascii(''), '\'\'')
162 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000163 self.assertEqual(ascii(()), '()')
164 self.assertEqual(ascii([]), '[]')
165 self.assertEqual(ascii({}), '{}')
166 a = []
167 a.append(a)
168 self.assertEqual(ascii(a), '[[...]]')
169 a = {}
170 a[0] = a
171 self.assertEqual(ascii(a), '{0: {...}}')
172
Thomas Wouters89f507f2006-12-13 04:49:30 +0000173 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000174 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000175 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000176 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000178 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 def test_callable(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000180 self.assertTrue(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000181 def f(): pass
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000182 self.assertTrue(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 class C:
184 def meth(self): pass
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000185 self.assertTrue(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000186 x = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000187 self.assertTrue(hasattr(x.meth, '__call__'))
188 self.assertTrue(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000189 class D(C):
190 def __call__(self): pass
191 y = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000192 self.assertTrue(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 y()
194
195 def test_chr(self):
196 self.assertEqual(chr(32), ' ')
197 self.assertEqual(chr(65), 'A')
198 self.assertEqual(chr(97), 'a')
199 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000200 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000201 self.assertEqual(chr(sys.maxunicode),
202 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
203 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000204 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000205 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
206 self.assertEqual(chr(0x00010000), "\U00010000")
207 self.assertEqual(chr(0x00010001), "\U00010001")
208 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
209 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
210 self.assertEqual(chr(0x00100000), "\U00100000")
211 self.assertEqual(chr(0x00100001), "\U00100001")
212 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
213 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
214 self.assertRaises(ValueError, chr, -1)
215 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000216 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000217
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000218 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000219 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000220
Walter Dörwald919497e2003-01-19 16:23:59 +0000221 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000222 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000223 bom = b'\xef\xbb\xbf'
224 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000225 compile(source='pass', filename='?', mode='exec')
226 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
227 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000228 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000229 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000230 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
231 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000232 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000233 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
234 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000235 compile('print("\xe5")\n', '', 'exec')
236 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
237 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000238
Walter Dörwald919497e2003-01-19 16:23:59 +0000239 def test_delattr(self):
240 import sys
241 sys.spam = 1
242 delattr(sys, 'spam')
243 self.assertRaises(TypeError, delattr)
244
245 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000246 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000247 self.assertRaises(TypeError, dir, 42, 42)
248
Georg Brandle32b4222007-03-10 22:13:27 +0000249 # dir() - local scope
250 local_var = 1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000251 self.assertTrue('local_var' in dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000252
253 # dir(module)
254 import sys
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000255 self.assertTrue('exit' in dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000256
257 # dir(module_with_invalid__dict__)
258 import types
259 class Foo(types.ModuleType):
260 __dict__ = 8
261 f = Foo("foo")
262 self.assertRaises(TypeError, dir, f)
263
264 # dir(type)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000265 self.assertTrue("strip" in dir(str))
266 self.assertTrue("__mro__" not in dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000267
268 # dir(obj)
269 class Foo(object):
270 def __init__(self):
271 self.x = 7
272 self.y = 8
273 self.z = 9
274 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertTrue("y" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000276
277 # dir(obj_no__dict__)
278 class Foo(object):
279 __slots__ = []
280 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000281 self.assertTrue("__repr__" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000282
283 # dir(obj_no__class__with__dict__)
284 # (an ugly trick to cause getattr(f, "__class__") to fail)
285 class Foo(object):
286 __slots__ = ["__class__", "__dict__"]
287 def __init__(self):
288 self.bar = "wow"
289 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000290 self.assertTrue("__repr__" not in dir(f))
291 self.assertTrue("bar" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000292
293 # dir(obj_using __dir__)
294 class Foo(object):
295 def __dir__(self):
296 return ["kan", "ga", "roo"]
297 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000298 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000299
300 # dir(obj__dir__not_list)
301 class Foo(object):
302 def __dir__(self):
303 return 7
304 f = Foo()
305 self.assertRaises(TypeError, dir, f)
306
Collin Winter3eed7652007-08-14 17:53:54 +0000307 # dir(traceback)
308 try:
309 raise IndexError
310 except:
311 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
312
313
Walter Dörwald919497e2003-01-19 16:23:59 +0000314 def test_divmod(self):
315 self.assertEqual(divmod(12, 7), (1, 5))
316 self.assertEqual(divmod(-12, 7), (-2, 2))
317 self.assertEqual(divmod(12, -7), (-2, -2))
318 self.assertEqual(divmod(-12, -7), (1, -5))
319
Mark Dickinson5c2db372009-12-05 20:28:34 +0000320 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000321
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000322 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
323 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
324 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
325 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000326
327 self.assertRaises(TypeError, divmod)
328
329 def test_eval(self):
330 self.assertEqual(eval('1+1'), 2)
331 self.assertEqual(eval(' 1+1\n'), 2)
332 globals = {'a': 1, 'b': 2}
333 locals = {'b': 200, 'c': 300}
334 self.assertEqual(eval('a', globals) , 1)
335 self.assertEqual(eval('a', globals, locals), 1)
336 self.assertEqual(eval('b', globals, locals), 200)
337 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000338 globals = {'a': 1, 'b': 2}
339 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000340 bom = b'\xef\xbb\xbf'
341 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000342 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000343 self.assertRaises(TypeError, eval)
344 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000345 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000346
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000347 def test_general_eval(self):
348 # Tests that general mappings can be used for the locals argument
349
350 class M:
351 "Test mapping interface versus possible calls from eval()."
352 def __getitem__(self, key):
353 if key == 'a':
354 return 12
355 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000356 def keys(self):
357 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000358
359 m = M()
360 g = globals()
361 self.assertEqual(eval('a', g, m), 12)
362 self.assertRaises(NameError, eval, 'b', g, m)
363 self.assertEqual(eval('dir()', g, m), list('xyz'))
364 self.assertEqual(eval('globals()', g, m), g)
365 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000366 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000367 class A:
368 "Non-mapping"
369 pass
370 m = A()
371 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000372
373 # Verify that dict subclasses work as well
374 class D(dict):
375 def __getitem__(self, key):
376 if key == 'a':
377 return 12
378 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000379 def keys(self):
380 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000381
382 d = D()
383 self.assertEqual(eval('a', g, d), 12)
384 self.assertRaises(NameError, eval, 'b', g, d)
385 self.assertEqual(eval('dir()', g, d), list('xyz'))
386 self.assertEqual(eval('globals()', g, d), g)
387 self.assertEqual(eval('locals()', g, d), d)
388
389 # Verify locals stores (used by list comps)
390 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000391 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000392
393 class SpreadSheet:
394 "Sample application showing nested, calculated lookups."
395 _cells = {}
396 def __setitem__(self, key, formula):
397 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000398 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000399 return eval(self._cells[key], globals(), self)
400
401 ss = SpreadSheet()
402 ss['a1'] = '5'
403 ss['a2'] = 'a1*6'
404 ss['a3'] = 'a2*7'
405 self.assertEqual(ss['a3'], 210)
406
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000407 # Verify that dir() catches a non-list returned by eval
408 # SF bug #1004669
409 class C:
410 def __getitem__(self, item):
411 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000412 def keys(self):
413 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000414 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
415
Georg Brandl7cae87c2006-09-06 06:51:57 +0000416 def test_exec(self):
417 g = {}
418 exec('z = 1', g)
419 if '__builtins__' in g:
420 del g['__builtins__']
421 self.assertEqual(g, {'z': 1})
422
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000423 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000424 if '__builtins__' in g:
425 del g['__builtins__']
426 self.assertEqual(g, {'z': 2})
427 g = {}
428 l = {}
429
430 import warnings
431 warnings.filterwarnings("ignore", "global statement", module="<string>")
432 exec('global a; a = 1; b = 2', g, l)
433 if '__builtins__' in g:
434 del g['__builtins__']
435 if '__builtins__' in l:
436 del l['__builtins__']
437 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
438
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000439 def test_exec_redirected(self):
440 savestdout = sys.stdout
441 sys.stdout = None # Whatever that cannot flush()
442 try:
443 # Used to raise SystemError('error return without exception set')
444 exec('a')
445 except NameError:
446 pass
447 finally:
448 sys.stdout = savestdout
449
Walter Dörwald919497e2003-01-19 16:23:59 +0000450 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000451 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
452 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
453 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
454 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
455 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000456 def identity(item):
457 return 1
458 filter(identity, Squares(5))
459 self.assertRaises(TypeError, filter)
460 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000461 def __getitem__(self, index):
462 if index<4:
463 return 42
464 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000465 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000466 def badfunc():
467 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000468 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000469
Walter Dörwaldbf517072003-01-27 15:57:14 +0000470 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000471 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
472 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
473 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000474
Walter Dörwald919497e2003-01-19 16:23:59 +0000475 def test_getattr(self):
476 import sys
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000477 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000478 self.assertRaises(TypeError, getattr, sys, 1)
479 self.assertRaises(TypeError, getattr, sys, 1, "foo")
480 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000481 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000482
483 def test_hasattr(self):
484 import sys
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000485 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 self.assertRaises(TypeError, hasattr, sys, 1)
487 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000488 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000489
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000490 # Check that hasattr allows SystemExit and KeyboardInterrupts by
491 class A:
492 def __getattr__(self, what):
493 raise KeyboardInterrupt
494 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
495 class B:
496 def __getattr__(self, what):
497 raise SystemExit
498 self.assertRaises(SystemExit, hasattr, B(), "b")
499
Walter Dörwald919497e2003-01-19 16:23:59 +0000500 def test_hash(self):
501 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000502 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000503 self.assertEqual(hash(1), hash(1.0))
504 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000505 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000506 hash((0,1,2,3))
507 def f(): pass
508 self.assertRaises(TypeError, hash, [])
509 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000510 # Bug 1536021: Allow hash to return long objects
511 class X:
512 def __hash__(self):
513 return 2**100
514 self.assertEquals(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000515 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000516 def __hash__(self):
517 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000518 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000519
520 def test_hex(self):
521 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000522 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000523 self.assertRaises(TypeError, hex, {})
524
525 def test_id(self):
526 id(None)
527 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000528 id(1.0)
529 id('spam')
530 id((0,1,2,3))
531 id([0,1,2,3])
532 id({'spam': 1, 'eggs': 2, 'ham': 3})
533
Guido van Rossuma88a0332007-02-26 16:59:55 +0000534 # Test input() later, alphabetized as if it were raw_input
535
Walter Dörwald919497e2003-01-19 16:23:59 +0000536 def test_iter(self):
537 self.assertRaises(TypeError, iter)
538 self.assertRaises(TypeError, iter, 42, 42)
539 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000540 for l in lists:
541 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000542 self.assertEqual(next(i), '1')
543 self.assertEqual(next(i), '2')
544 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000545
546 def test_isinstance(self):
547 class C:
548 pass
549 class D(C):
550 pass
551 class E:
552 pass
553 c = C()
554 d = D()
555 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000556 self.assertTrue(isinstance(c, C))
557 self.assertTrue(isinstance(d, C))
558 self.assertTrue(not isinstance(e, C))
559 self.assertTrue(not isinstance(c, D))
560 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000561 self.assertRaises(TypeError, isinstance, E, 'foo')
562 self.assertRaises(TypeError, isinstance)
563
564 def test_issubclass(self):
565 class C:
566 pass
567 class D(C):
568 pass
569 class E:
570 pass
571 c = C()
572 d = D()
573 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000574 self.assertTrue(issubclass(D, C))
575 self.assertTrue(issubclass(C, C))
576 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000577 self.assertRaises(TypeError, issubclass, 'foo', E)
578 self.assertRaises(TypeError, issubclass, E, 'foo')
579 self.assertRaises(TypeError, issubclass)
580
581 def test_len(self):
582 self.assertEqual(len('123'), 3)
583 self.assertEqual(len(()), 0)
584 self.assertEqual(len((1, 2, 3, 4)), 4)
585 self.assertEqual(len([1, 2, 3, 4]), 4)
586 self.assertEqual(len({}), 0)
587 self.assertEqual(len({'a':1, 'b': 2}), 2)
588 class BadSeq:
589 def __len__(self):
590 raise ValueError
591 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000592 class InvalidLen:
593 def __len__(self):
594 return None
595 self.assertRaises(TypeError, len, InvalidLen())
596 class FloatLen:
597 def __len__(self):
598 return 4.5
599 self.assertRaises(TypeError, len, FloatLen())
600 class HugeLen:
601 def __len__(self):
602 return sys.maxsize + 1
603 self.assertRaises(OverflowError, len, HugeLen())
Walter Dörwald919497e2003-01-19 16:23:59 +0000604
Walter Dörwald919497e2003-01-19 16:23:59 +0000605 def test_map(self):
606 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000607 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000608 [1, 4, 9]
609 )
610 try:
611 from math import sqrt
612 except ImportError:
613 def sqrt(x):
614 return pow(x, 0.5)
615 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000616 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 [[4.0, 2.0], [9.0, 3.0]]
618 )
619 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000620 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000621 [10, 4, 6]
622 )
623
624 def plus(*v):
625 accu = 0
626 for i in v: accu = accu + i
627 return accu
628 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000629 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000630 [1, 3, 7]
631 )
632 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000633 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000634 [1+4, 3+9, 7+2]
635 )
636 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000637 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000638 [1+4+1, 3+9+1, 7+2+0]
639 )
640 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000641 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000642 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
643 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000644 def Max(a, b):
645 if a is None:
646 return b
647 if b is None:
648 return a
649 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000650 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000651 list(map(Max, Squares(3), Squares(2))),
652 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000653 )
654 self.assertRaises(TypeError, map)
655 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000656 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000657 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000658 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000659 yield None
660 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000661 def badfunc(x):
662 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000663 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000664
665 def test_max(self):
666 self.assertEqual(max('123123'), '3')
667 self.assertEqual(max(1, 2, 3), 3)
668 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
669 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
670
Guido van Rossume2a383d2007-01-15 16:59:06 +0000671 self.assertEqual(max(1, 2, 3.0), 3.0)
672 self.assertEqual(max(1, 2.0, 3), 3)
673 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000674
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000675 for stmt in (
676 "max(key=int)", # no args
677 "max(1, key=int)", # single arg not iterable
678 "max(1, 2, keystone=int)", # wrong keyword
679 "max(1, 2, key=int, abc=int)", # two many keywords
680 "max(1, 2, key=1)", # keyfunc is not callable
681 ):
Tim Peters7f061872004-12-07 21:17:46 +0000682 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000683 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000684 except TypeError:
685 pass
686 else:
687 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000688
689 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
690 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
691 self.assertEqual(max(1, 2, key=neg), 1) # two elems
692
693 data = [random.randrange(200) for i in range(100)]
694 keys = dict((elem, random.randrange(50)) for elem in data)
695 f = keys.__getitem__
696 self.assertEqual(max(data, key=f),
697 sorted(reversed(data), key=f)[-1])
698
Walter Dörwald919497e2003-01-19 16:23:59 +0000699 def test_min(self):
700 self.assertEqual(min('123123'), '1')
701 self.assertEqual(min(1, 2, 3), 1)
702 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
703 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
704
Guido van Rossume2a383d2007-01-15 16:59:06 +0000705 self.assertEqual(min(1, 2, 3.0), 1)
706 self.assertEqual(min(1, 2.0, 3), 1)
707 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000708
709 self.assertRaises(TypeError, min)
710 self.assertRaises(TypeError, min, 42)
711 self.assertRaises(ValueError, min, ())
712 class BadSeq:
713 def __getitem__(self, index):
714 raise ValueError
715 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000716
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000717 for stmt in (
718 "min(key=int)", # no args
719 "min(1, key=int)", # single arg not iterable
720 "min(1, 2, keystone=int)", # wrong keyword
721 "min(1, 2, key=int, abc=int)", # two many keywords
722 "min(1, 2, key=1)", # keyfunc is not callable
723 ):
Tim Peters7f061872004-12-07 21:17:46 +0000724 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000725 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000726 except TypeError:
727 pass
728 else:
729 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000730
731 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
732 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
733 self.assertEqual(min(1, 2, key=neg), 2) # two elems
734
735 data = [random.randrange(200) for i in range(100)]
736 keys = dict((elem, random.randrange(50)) for elem in data)
737 f = keys.__getitem__
738 self.assertEqual(min(data, key=f),
739 sorted(data, key=f)[0])
740
Georg Brandla18af4e2007-04-21 15:47:16 +0000741 def test_next(self):
742 it = iter(range(2))
743 self.assertEqual(next(it), 0)
744 self.assertEqual(next(it), 1)
745 self.assertRaises(StopIteration, next, it)
746 self.assertRaises(StopIteration, next, it)
747 self.assertEquals(next(it, 42), 42)
748
749 class Iter(object):
750 def __iter__(self):
751 return self
752 def __next__(self):
753 raise StopIteration
754
755 it = iter(Iter())
756 self.assertEquals(next(it, 42), 42)
757 self.assertRaises(StopIteration, next, it)
758
759 def gen():
760 yield 1
761 return
762
763 it = gen()
764 self.assertEquals(next(it), 1)
765 self.assertRaises(StopIteration, next, it)
766 self.assertEquals(next(it, 42), 42)
767
Walter Dörwald919497e2003-01-19 16:23:59 +0000768 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000769 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000770 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000771 self.assertRaises(TypeError, oct, ())
772
773 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000774 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000775 fp = open(TESTFN, 'w')
776 try:
777 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000778 fp.write('The quick brown fox jumps over the lazy dog')
779 fp.write('.\n')
780 fp.write('Dear John\n')
781 fp.write('XXX'*100)
782 fp.write('YYY'*100)
783 finally:
784 fp.close()
785
786 def test_open(self):
787 self.write_testfile()
788 fp = open(TESTFN, 'r')
789 try:
790 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000791 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
792 self.assertEqual(fp.readline(4), 'Dear')
793 self.assertEqual(fp.readline(100), ' John\n')
794 self.assertEqual(fp.read(300), 'XXX'*100)
795 self.assertEqual(fp.read(1000), 'YYY'*100)
796 finally:
797 fp.close()
798 unlink(TESTFN)
799
800 def test_ord(self):
801 self.assertEqual(ord(' '), 32)
802 self.assertEqual(ord('A'), 65)
803 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000804 self.assertEqual(ord('\x80'), 128)
805 self.assertEqual(ord('\xff'), 255)
806
807 self.assertEqual(ord(b' '), 32)
808 self.assertEqual(ord(b'A'), 65)
809 self.assertEqual(ord(b'a'), 97)
810 self.assertEqual(ord(b'\x80'), 128)
811 self.assertEqual(ord(b'\xff'), 255)
812
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000813 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000814 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000815
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000816 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
817 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
818 self.assertEqual(ord("\U00010000"), 0x00010000)
819 self.assertEqual(ord("\U00010001"), 0x00010001)
820 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
821 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
822 self.assertEqual(ord("\U00100000"), 0x00100000)
823 self.assertEqual(ord("\U00100001"), 0x00100001)
824 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
825 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
826
Walter Dörwald919497e2003-01-19 16:23:59 +0000827 def test_pow(self):
828 self.assertEqual(pow(0,0), 1)
829 self.assertEqual(pow(0,1), 0)
830 self.assertEqual(pow(1,0), 1)
831 self.assertEqual(pow(1,1), 1)
832
833 self.assertEqual(pow(2,0), 1)
834 self.assertEqual(pow(2,10), 1024)
835 self.assertEqual(pow(2,20), 1024*1024)
836 self.assertEqual(pow(2,30), 1024*1024*1024)
837
838 self.assertEqual(pow(-2,0), 1)
839 self.assertEqual(pow(-2,1), -2)
840 self.assertEqual(pow(-2,2), 4)
841 self.assertEqual(pow(-2,3), -8)
842
Walter Dörwald919497e2003-01-19 16:23:59 +0000843 self.assertAlmostEqual(pow(0.,0), 1.)
844 self.assertAlmostEqual(pow(0.,1), 0.)
845 self.assertAlmostEqual(pow(1.,0), 1.)
846 self.assertAlmostEqual(pow(1.,1), 1.)
847
848 self.assertAlmostEqual(pow(2.,0), 1.)
849 self.assertAlmostEqual(pow(2.,10), 1024.)
850 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
851 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
852
853 self.assertAlmostEqual(pow(-2.,0), 1.)
854 self.assertAlmostEqual(pow(-2.,1), -2.)
855 self.assertAlmostEqual(pow(-2.,2), 4.)
856 self.assertAlmostEqual(pow(-2.,3), -8.)
857
Mark Dickinson5c2db372009-12-05 20:28:34 +0000858 for x in 2, 2.0:
859 for y in 10, 10.0:
860 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000861 if isinstance(x, float) or \
862 isinstance(y, float) or \
863 isinstance(z, float):
864 self.assertRaises(TypeError, pow, x, y, z)
865 else:
866 self.assertAlmostEqual(pow(x, y, z), 24.0)
867
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000868 self.assertAlmostEqual(pow(-1, 0.5), 1j)
869 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
870
Walter Dörwald919497e2003-01-19 16:23:59 +0000871 self.assertRaises(TypeError, pow, -1, -2, 3)
872 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
874 self.assertRaises(TypeError, pow)
875
876 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000877 self.assertEqual(list(range(3)), [0, 1, 2])
878 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
879 self.assertEqual(list(range(0)), [])
880 self.assertEqual(list(range(-3)), [])
881 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
882 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000883
Mark Dickinsoneb36d312009-06-24 18:36:46 +0000884 #issue 6334: the internal stored range length was being
885 #computed incorrectly in some cases involving large arguments.
886 x = range(10**20, 10**20+10, 3)
887 self.assertEqual(len(x), 4)
888 self.assertEqual(len(list(x)), 4)
889
890 x = range(10**20+10, 10**20, 3)
891 self.assertEqual(len(x), 0)
892 self.assertEqual(len(list(x)), 0)
893
894 x = range(10**20, 10**20+10, -3)
895 self.assertEqual(len(x), 0)
896 self.assertEqual(len(list(x)), 0)
897
898 x = range(10**20+10, 10**20, -3)
899 self.assertEqual(len(x), 4)
900 self.assertEqual(len(list(x)), 4)
901
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000902 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000903 self.assertEqual(list(range(-2**100)), [])
904 self.assertEqual(list(range(0, -2**100)), [])
905 self.assertEqual(list(range(0, 2**100, -1)), [])
906 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000907
Christian Heimesa37d4c62007-12-04 23:02:19 +0000908 a = int(10 * sys.maxsize)
909 b = int(100 * sys.maxsize)
910 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000911
Guido van Rossum805365e2007-05-07 22:24:25 +0000912 self.assertEqual(list(range(a, a+2)), [a, a+1])
913 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
914 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000915
Guido van Rossum805365e2007-05-07 22:24:25 +0000916 seq = list(range(a, b, c))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000917 self.assertTrue(a in seq)
918 self.assertTrue(b not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000919 self.assertEqual(len(seq), 2)
920
Guido van Rossum805365e2007-05-07 22:24:25 +0000921 seq = list(range(b, a, -c))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000922 self.assertTrue(b in seq)
923 self.assertTrue(a not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000924 self.assertEqual(len(seq), 2)
925
Guido van Rossum805365e2007-05-07 22:24:25 +0000926 seq = list(range(-a, -b, -c))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000927 self.assertTrue(-a in seq)
928 self.assertTrue(-b not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000929 self.assertEqual(len(seq), 2)
930
Walter Dörwald919497e2003-01-19 16:23:59 +0000931 self.assertRaises(TypeError, range)
932 self.assertRaises(TypeError, range, 1, 2, 3, 4)
933 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000934 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000935
Mark Dickinson5c2db372009-12-05 20:28:34 +0000936 """ XXX(nnorwitz):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000937 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000938 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000939 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000940 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
941
942 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000943 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000944 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000945
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000946 # Reject floats when it would require PyLongs to represent.
947 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000948 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000949
Walter Dörwald357981e2003-04-15 18:59:28 +0000950 self.assertRaises(TypeError, range, 0, "spam")
951 self.assertRaises(TypeError, range, 0, 42, "spam")
952
Christian Heimesa37d4c62007-12-04 23:02:19 +0000953 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
954 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000955
Christian Heimesa37d4c62007-12-04 23:02:19 +0000956 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000957
Guido van Rossuma88a0332007-02-26 16:59:55 +0000958 def test_input(self):
959 self.write_testfile()
960 fp = open(TESTFN, 'r')
961 savestdin = sys.stdin
962 savestdout = sys.stdout # Eats the echo
963 try:
964 sys.stdin = fp
965 sys.stdout = BitBucket()
966 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000967 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
968 self.assertEqual(input('testing\n'), 'Dear John')
969
970 # SF 1535165: don't segfault on closed stdin
971 # sys.stdout must be a regular file for triggering
972 sys.stdout = savestdout
973 sys.stdin.close()
974 self.assertRaises(ValueError, input)
975
976 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000977 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000978 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000979 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000980 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000981 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000982 self.assertRaises(EOFError, input)
983
984 del sys.stdout
985 self.assertRaises(RuntimeError, input, 'prompt')
986 del sys.stdin
987 self.assertRaises(RuntimeError, input, 'prompt')
988 finally:
989 sys.stdin = savestdin
990 sys.stdout = savestdout
991 fp.close()
992 unlink(TESTFN)
993
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 def test_repr(self):
995 self.assertEqual(repr(''), '\'\'')
996 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +0000997 self.assertEqual(repr(()), '()')
998 self.assertEqual(repr([]), '[]')
999 self.assertEqual(repr({}), '{}')
1000 a = []
1001 a.append(a)
1002 self.assertEqual(repr(a), '[[...]]')
1003 a = {}
1004 a[0] = a
1005 self.assertEqual(repr(a), '{0: {...}}')
1006
1007 def test_round(self):
1008 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001009 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001010 self.assertEqual(round(1.0), 1.0)
1011 self.assertEqual(round(10.0), 10.0)
1012 self.assertEqual(round(1000000000.0), 1000000000.0)
1013 self.assertEqual(round(1e20), 1e20)
1014
1015 self.assertEqual(round(-1.0), -1.0)
1016 self.assertEqual(round(-10.0), -10.0)
1017 self.assertEqual(round(-1000000000.0), -1000000000.0)
1018 self.assertEqual(round(-1e20), -1e20)
1019
1020 self.assertEqual(round(0.1), 0.0)
1021 self.assertEqual(round(1.1), 1.0)
1022 self.assertEqual(round(10.1), 10.0)
1023 self.assertEqual(round(1000000000.1), 1000000000.0)
1024
1025 self.assertEqual(round(-1.1), -1.0)
1026 self.assertEqual(round(-10.1), -10.0)
1027 self.assertEqual(round(-1000000000.1), -1000000000.0)
1028
1029 self.assertEqual(round(0.9), 1.0)
1030 self.assertEqual(round(9.9), 10.0)
1031 self.assertEqual(round(999999999.9), 1000000000.0)
1032
1033 self.assertEqual(round(-0.9), -1.0)
1034 self.assertEqual(round(-9.9), -10.0)
1035 self.assertEqual(round(-999999999.9), -1000000000.0)
1036
1037 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001038 self.assertEqual(type(round(-8.0, -1)), float)
1039
1040 self.assertEqual(type(round(-8.0, 0)), float)
1041 self.assertEqual(type(round(-8.0, 1)), float)
1042
1043 # Check even / odd rounding behaviour
1044 self.assertEqual(round(5.5), 6)
1045 self.assertEqual(round(6.5), 6)
1046 self.assertEqual(round(-5.5), -6)
1047 self.assertEqual(round(-6.5), -6)
1048
1049 # Check behavior on ints
1050 self.assertEqual(round(0), 0)
1051 self.assertEqual(round(8), 8)
1052 self.assertEqual(round(-8), -8)
1053 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001054 self.assertEqual(type(round(-8, -1)), int)
1055 self.assertEqual(type(round(-8, 0)), int)
1056 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001057
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001058 # test new kwargs
1059 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1060
Walter Dörwald919497e2003-01-19 16:23:59 +00001061 self.assertRaises(TypeError, round)
1062
Alex Martelliae211f92007-08-22 23:21:33 +00001063 # test generic rounding delegation for reals
1064 class TestRound:
1065 def __round__(self):
1066 return 23
1067
1068 class TestNoRound:
1069 pass
1070
1071 self.assertEqual(round(TestRound()), 23)
1072
1073 self.assertRaises(TypeError, round, 1, 2, 3)
1074 self.assertRaises(TypeError, round, TestNoRound())
1075
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001076 t = TestNoRound()
1077 t.__round__ = lambda *args: args
1078 self.assertRaises(TypeError, round, t)
1079 self.assertRaises(TypeError, round, t, 0)
1080
Mark Dickinsonad731b92009-11-09 17:12:30 +00001081 # Some versions of glibc for alpha have a bug that affects
1082 # float -> integer rounding (floor, ceil, rint, round) for
1083 # values in the range [2**52, 2**53). See:
1084 #
1085 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1086 #
1087 # We skip this test on Linux/alpha if it would fail.
1088 linux_alpha = (platform.system().startswith('Linux') and
1089 platform.machine().startswith('alpha'))
1090 system_round_bug = round(5e15+1) != 5e15+1
1091 @unittest.skipIf(linux_alpha and system_round_bug,
1092 "test will fail; failure is probably due to a "
1093 "buggy system round function")
1094 def test_round_large(self):
1095 # Issue #1869: integral floats should remain unchanged
1096 self.assertEqual(round(5e15-1), 5e15-1)
1097 self.assertEqual(round(5e15), 5e15)
1098 self.assertEqual(round(5e15+1), 5e15+1)
1099 self.assertEqual(round(5e15+2), 5e15+2)
1100 self.assertEqual(round(5e15+3), 5e15+3)
1101
Walter Dörwald919497e2003-01-19 16:23:59 +00001102 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001103 setattr(sys, 'spam', 1)
1104 self.assertEqual(sys.spam, 1)
1105 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1106 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001107
Walter Dörwald919497e2003-01-19 16:23:59 +00001108
Alex Martellia70b1912003-04-22 08:12:33 +00001109 def test_sum(self):
1110 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001111 self.assertEqual(sum(list(range(2,8))), 27)
1112 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001113 self.assertEqual(sum(Squares(10)), 285)
1114 self.assertEqual(sum(iter(Squares(10))), 285)
1115 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1116
1117 self.assertRaises(TypeError, sum)
1118 self.assertRaises(TypeError, sum, 42)
1119 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1120 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1121 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1122 self.assertRaises(TypeError, sum, [{2:3}])
1123 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1124
1125 class BadSeq:
1126 def __getitem__(self, index):
1127 raise ValueError
1128 self.assertRaises(ValueError, sum, BadSeq())
1129
Mark Dickinson3a22b472009-10-17 21:48:16 +00001130 empty = []
1131 sum(([x] for x in range(10)), empty)
1132 self.assertEqual(empty, [])
1133
Walter Dörwald919497e2003-01-19 16:23:59 +00001134 def test_type(self):
1135 self.assertEqual(type(''), type('123'))
1136 self.assertNotEqual(type(''), type(()))
1137
Guido van Rossumfee7b932005-01-16 00:21:28 +00001138 # We don't want self in vars(), so these are static methods
1139
1140 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001141 def get_vars_f0():
1142 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001143
Guido van Rossumfee7b932005-01-16 00:21:28 +00001144 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001145 def get_vars_f2():
1146 BuiltinTest.get_vars_f0()
1147 a = 1
1148 b = 2
1149 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001150
1151 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001152 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001153 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001154 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 self.assertEqual(self.get_vars_f0(), {})
1156 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1157 self.assertRaises(TypeError, vars, 42, 42)
1158 self.assertRaises(TypeError, vars, 42)
1159
1160 def test_zip(self):
1161 a = (1, 2, 3)
1162 b = (4, 5, 6)
1163 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001164 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001166 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001167 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001168 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001169 class I:
1170 def __getitem__(self, i):
1171 if i < 0 or i > 2: raise IndexError
1172 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001173 self.assertEqual(list(zip(a, I())), t)
1174 self.assertEqual(list(zip()), [])
1175 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001176 self.assertRaises(TypeError, zip, None)
1177 class G:
1178 pass
1179 self.assertRaises(TypeError, zip, a, G())
1180
1181 # Make sure zip doesn't try to allocate a billion elements for the
1182 # result list when one of its arguments doesn't say how long it is.
1183 # A MemoryError is the most likely failure mode.
1184 class SequenceWithoutALength:
1185 def __getitem__(self, i):
1186 if i == 5:
1187 raise IndexError
1188 else:
1189 return i
1190 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001191 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 list(enumerate(range(5)))
1193 )
1194
1195 class BadSeq:
1196 def __getitem__(self, i):
1197 if i == 5:
1198 raise ValueError
1199 else:
1200 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001201 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001202
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001203 def test_bin(self):
1204 self.assertEqual(bin(0), '0b0')
1205 self.assertEqual(bin(1), '0b1')
1206 self.assertEqual(bin(-1), '-0b1')
1207 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1208 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1209 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1210 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1211
Georg Brandl953152f2009-07-22 12:03:59 +00001212 def test_bytearray_translate(self):
1213 x = bytearray(b"abc")
1214 self.assertRaises(ValueError, x.translate, b"1", 1)
1215 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1216
Raymond Hettinger64958a12003-12-17 20:43:33 +00001217class TestSorted(unittest.TestCase):
1218
1219 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001220 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001221 copy = data[:]
1222 random.shuffle(copy)
1223 self.assertEqual(data, sorted(copy))
1224 self.assertNotEqual(data, copy)
1225
1226 data.reverse()
1227 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001228 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1229 self.assertNotEqual(data, copy)
1230 random.shuffle(copy)
1231 self.assertEqual(data, sorted(copy, reverse=1))
1232 self.assertNotEqual(data, copy)
1233
1234 def test_inputtypes(self):
1235 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001236 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001237 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001238 self.assertEqual(sorted(s), sorted(T(s)))
1239
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001240 s = ''.join(set(s)) # unique letters only
1241 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001242 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001243 self.assertEqual(sorted(s), sorted(T(s)))
1244
1245 def test_baddecorator(self):
1246 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1247 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1248
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001249def test_main(verbose=None):
1250 test_classes = (BuiltinTest, TestSorted)
1251
1252 run_unittest(*test_classes)
1253
1254 # verify reference counting
1255 if verbose and hasattr(sys, "gettotalrefcount"):
1256 import gc
1257 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001258 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001259 run_unittest(*test_classes)
1260 gc.collect()
1261 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001262 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001263
Walter Dörwald919497e2003-01-19 16:23:59 +00001264
1265if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001266 test_main(verbose=True)