blob: 284f07e2ec03ce265bad73db9599a46642cc305a [file] [log] [blame]
Walter Dörwald919497e2003-01-19 16:23:59 +00001# Python test set -- built-in functions
Guido van Rossum3bead091992-01-27 17:00:37 +00002
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003import test.support, unittest
4from test.support import fcmp, TESTFN, unlink, run_unittest, \
Walter Dörwald1f5947b2007-05-22 16:52:54 +00005 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Raymond Hettinger53dbe392008-02-12 20:03:09 +00008import sys, warnings, random, collections, io, fractions
Walter Dörwald919497e2003-01-19 16:23:59 +00009warnings.filterwarnings("ignore", "hex../oct.. of negative int",
10 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000011warnings.filterwarnings("ignore", "integer argument expected",
12 DeprecationWarning, "unittest")
Mark Dickinsona56c4672009-01-27 18:17:45 +000013import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000014
Walter Dörwald919497e2003-01-19 16:23:59 +000015class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000016
Walter Dörwald919497e2003-01-19 16:23:59 +000017 def __init__(self, max):
18 self.max = max
19 self.sofar = []
20
21 def __len__(self): return len(self.sofar)
22
23 def __getitem__(self, i):
24 if not 0 <= i < self.max: raise IndexError
25 n = len(self.sofar)
26 while n <= i:
27 self.sofar.append(n*n)
28 n += 1
29 return self.sofar[i]
30
31class StrSquares:
32
33 def __init__(self, max):
34 self.max = max
35 self.sofar = []
36
37 def __len__(self):
38 return len(self.sofar)
39
40 def __getitem__(self, i):
41 if not 0 <= i < self.max:
42 raise IndexError
43 n = len(self.sofar)
44 while n <= i:
45 self.sofar.append(str(n*n))
46 n += 1
47 return self.sofar[i]
48
49class BitBucket:
50 def write(self, line):
51 pass
52
Facundo Batista2336bdd2008-01-19 19:12:01 +000053test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000054 ('0', 0),
55 ('1', 1),
56 ('9', 9),
57 ('10', 10),
58 ('99', 99),
59 ('100', 100),
60 ('314', 314),
61 (' 314', 314),
62 ('314 ', 314),
63 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000064 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000065 (' 1x', ValueError),
66 (' 1 ', 1),
67 (' 1\02 ', ValueError),
68 ('', ValueError),
69 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000070 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000071 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000072 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000073]
74
Facundo Batista2336bdd2008-01-19 19:12:01 +000075test_conv_sign = [
76 ('0', 0),
77 ('1', 1),
78 ('9', 9),
79 ('10', 10),
80 ('99', 99),
81 ('100', 100),
82 ('314', 314),
83 (' 314', ValueError),
84 ('314 ', 314),
85 (' \t\t 314 \t\t ', ValueError),
86 (repr(sys.maxsize), sys.maxsize),
87 (' 1x', ValueError),
88 (' 1 ', ValueError),
89 (' 1\02 ', ValueError),
90 ('', ValueError),
91 (' ', ValueError),
92 (' \t\t ', ValueError),
93 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
94 (chr(0x200), ValueError),
95]
96
Raymond Hettinger96229b12005-03-11 06:49:40 +000097class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000098 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000099 raise RuntimeError
100
101class TestFailingIter:
102 def __iter__(self):
103 raise RuntimeError
104
Walter Dörwald919497e2003-01-19 16:23:59 +0000105class BuiltinTest(unittest.TestCase):
106
107 def test_import(self):
108 __import__('sys')
109 __import__('time')
110 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 __import__(name='sys')
112 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000113 self.assertRaises(ImportError, __import__, 'spamspam')
114 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000115 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000116 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000117
118 def test_abs(self):
119 # int
120 self.assertEqual(abs(0), 0)
121 self.assertEqual(abs(1234), 1234)
122 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000123 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000124 # float
125 self.assertEqual(abs(0.0), 0.0)
126 self.assertEqual(abs(3.14), 3.14)
127 self.assertEqual(abs(-3.14), 3.14)
128 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000129 self.assertEqual(abs(0), 0)
130 self.assertEqual(abs(1234), 1234)
131 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000132 # str
133 self.assertRaises(TypeError, abs, 'a')
134
Raymond Hettinger96229b12005-03-11 06:49:40 +0000135 def test_all(self):
136 self.assertEqual(all([2, 4, 6]), True)
137 self.assertEqual(all([2, None, 6]), False)
138 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
139 self.assertRaises(RuntimeError, all, TestFailingIter())
140 self.assertRaises(TypeError, all, 10) # Non-iterable
141 self.assertRaises(TypeError, all) # No args
142 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
143 self.assertEqual(all([]), True) # Empty iterator
144 S = [50, 60]
145 self.assertEqual(all(x > 42 for x in S), True)
146 S = [50, 40, 60]
147 self.assertEqual(all(x > 42 for x in S), False)
148
149 def test_any(self):
150 self.assertEqual(any([None, None, None]), False)
151 self.assertEqual(any([None, 4, None]), True)
152 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
153 self.assertRaises(RuntimeError, all, TestFailingIter())
154 self.assertRaises(TypeError, any, 10) # Non-iterable
155 self.assertRaises(TypeError, any) # No args
156 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
157 self.assertEqual(any([]), False) # Empty iterator
158 S = [40, 60, 30]
159 self.assertEqual(any(x > 42 for x in S), True)
160 S = [10, 20, 30]
161 self.assertEqual(any(x > 42 for x in S), False)
162
Georg Brandl559e5d72008-06-11 18:37:52 +0000163 def test_ascii(self):
164 self.assertEqual(ascii(''), '\'\'')
165 self.assertEqual(ascii(0), '0')
166 self.assertEqual(ascii(0), '0')
167 self.assertEqual(ascii(()), '()')
168 self.assertEqual(ascii([]), '[]')
169 self.assertEqual(ascii({}), '{}')
170 a = []
171 a.append(a)
172 self.assertEqual(ascii(a), '[[...]]')
173 a = {}
174 a[0] = a
175 self.assertEqual(ascii(a), '{0: {...}}')
176
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000178 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000179 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000180 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000181
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000182 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000184 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000186 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000187 class C:
188 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000189 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000191 self.assert_(hasattr(x.meth, '__call__'))
192 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 class D(C):
194 def __call__(self): pass
195 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000196 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 y()
198
199 def test_chr(self):
200 self.assertEqual(chr(32), ' ')
201 self.assertEqual(chr(65), 'A')
202 self.assertEqual(chr(97), 'a')
203 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000204 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000205 self.assertEqual(chr(sys.maxunicode),
206 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
207 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000209 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
210 self.assertEqual(chr(0x00010000), "\U00010000")
211 self.assertEqual(chr(0x00010001), "\U00010001")
212 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
213 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
214 self.assertEqual(chr(0x00100000), "\U00100000")
215 self.assertEqual(chr(0x00100001), "\U00100001")
216 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
217 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
218 self.assertRaises(ValueError, chr, -1)
219 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000220 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000221
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000222 def test_cmp(self):
Mark Dickinsona56c4672009-01-27 18:17:45 +0000223 # uncomment the following line once cmp has been removed
224 #self.assert_(not hasattr(builtins, "cmp"))
225 pass
Walter Dörwald919497e2003-01-19 16:23:59 +0000226
Walter Dörwald919497e2003-01-19 16:23:59 +0000227 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000228 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000229 bom = b'\xef\xbb\xbf'
230 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000231 compile(source='pass', filename='?', mode='exec')
232 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
233 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000234 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000236 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
237 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000238 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000239 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
240 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000241 compile('print("\xe5")\n', '', 'exec')
242 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
243 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000244
Walter Dörwald919497e2003-01-19 16:23:59 +0000245 def test_delattr(self):
246 import sys
247 sys.spam = 1
248 delattr(sys, 'spam')
249 self.assertRaises(TypeError, delattr)
250
251 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000252 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000253 self.assertRaises(TypeError, dir, 42, 42)
254
Georg Brandle32b4222007-03-10 22:13:27 +0000255 # dir() - local scope
256 local_var = 1
257 self.assert_('local_var' in dir())
258
259 # dir(module)
260 import sys
261 self.assert_('exit' in dir(sys))
262
263 # dir(module_with_invalid__dict__)
264 import types
265 class Foo(types.ModuleType):
266 __dict__ = 8
267 f = Foo("foo")
268 self.assertRaises(TypeError, dir, f)
269
270 # dir(type)
271 self.assert_("strip" in dir(str))
272 self.assert_("__mro__" not in dir(str))
273
274 # dir(obj)
275 class Foo(object):
276 def __init__(self):
277 self.x = 7
278 self.y = 8
279 self.z = 9
280 f = Foo()
281 self.assert_("y" in dir(f))
282
283 # dir(obj_no__dict__)
284 class Foo(object):
285 __slots__ = []
286 f = Foo()
287 self.assert_("__repr__" in dir(f))
288
289 # dir(obj_no__class__with__dict__)
290 # (an ugly trick to cause getattr(f, "__class__") to fail)
291 class Foo(object):
292 __slots__ = ["__class__", "__dict__"]
293 def __init__(self):
294 self.bar = "wow"
295 f = Foo()
296 self.assert_("__repr__" not in dir(f))
297 self.assert_("bar" in dir(f))
298
299 # dir(obj_using __dir__)
300 class Foo(object):
301 def __dir__(self):
302 return ["kan", "ga", "roo"]
303 f = Foo()
304 self.assert_(dir(f) == ["ga", "kan", "roo"])
305
306 # dir(obj__dir__not_list)
307 class Foo(object):
308 def __dir__(self):
309 return 7
310 f = Foo()
311 self.assertRaises(TypeError, dir, f)
312
Collin Winter3eed7652007-08-14 17:53:54 +0000313 # dir(traceback)
314 try:
315 raise IndexError
316 except:
317 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
318
319
Walter Dörwald919497e2003-01-19 16:23:59 +0000320 def test_divmod(self):
321 self.assertEqual(divmod(12, 7), (1, 5))
322 self.assertEqual(divmod(-12, 7), (-2, 2))
323 self.assertEqual(divmod(12, -7), (-2, -2))
324 self.assertEqual(divmod(-12, -7), (1, -5))
325
Guido van Rossume2a383d2007-01-15 16:59:06 +0000326 self.assertEqual(divmod(12, 7), (1, 5))
327 self.assertEqual(divmod(-12, 7), (-2, 2))
328 self.assertEqual(divmod(12, -7), (-2, -2))
329 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000330
Guido van Rossume2a383d2007-01-15 16:59:06 +0000331 self.assertEqual(divmod(12, 7), (1, 5))
332 self.assertEqual(divmod(-12, 7), (-2, 2))
333 self.assertEqual(divmod(12, -7), (-2, -2))
334 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000335
Christian Heimesa37d4c62007-12-04 23:02:19 +0000336 self.assertEqual(divmod(-sys.maxsize-1, -1),
337 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000338
Walter Dörwald919497e2003-01-19 16:23:59 +0000339 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
340 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
341 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
342 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
343
344 self.assertRaises(TypeError, divmod)
345
346 def test_eval(self):
347 self.assertEqual(eval('1+1'), 2)
348 self.assertEqual(eval(' 1+1\n'), 2)
349 globals = {'a': 1, 'b': 2}
350 locals = {'b': 200, 'c': 300}
351 self.assertEqual(eval('a', globals) , 1)
352 self.assertEqual(eval('a', globals, locals), 1)
353 self.assertEqual(eval('b', globals, locals), 200)
354 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 globals = {'a': 1, 'b': 2}
356 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000357 bom = b'\xef\xbb\xbf'
358 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000359 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000360 self.assertRaises(TypeError, eval)
361 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000362 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000363
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000364 def test_general_eval(self):
365 # Tests that general mappings can be used for the locals argument
366
367 class M:
368 "Test mapping interface versus possible calls from eval()."
369 def __getitem__(self, key):
370 if key == 'a':
371 return 12
372 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000373 def keys(self):
374 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000375
376 m = M()
377 g = globals()
378 self.assertEqual(eval('a', g, m), 12)
379 self.assertRaises(NameError, eval, 'b', g, m)
380 self.assertEqual(eval('dir()', g, m), list('xyz'))
381 self.assertEqual(eval('globals()', g, m), g)
382 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000383 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000384 class A:
385 "Non-mapping"
386 pass
387 m = A()
388 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000389
390 # Verify that dict subclasses work as well
391 class D(dict):
392 def __getitem__(self, key):
393 if key == 'a':
394 return 12
395 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000396 def keys(self):
397 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000398
399 d = D()
400 self.assertEqual(eval('a', g, d), 12)
401 self.assertRaises(NameError, eval, 'b', g, d)
402 self.assertEqual(eval('dir()', g, d), list('xyz'))
403 self.assertEqual(eval('globals()', g, d), g)
404 self.assertEqual(eval('locals()', g, d), d)
405
406 # Verify locals stores (used by list comps)
407 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000408 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000409
410 class SpreadSheet:
411 "Sample application showing nested, calculated lookups."
412 _cells = {}
413 def __setitem__(self, key, formula):
414 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000415 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000416 return eval(self._cells[key], globals(), self)
417
418 ss = SpreadSheet()
419 ss['a1'] = '5'
420 ss['a2'] = 'a1*6'
421 ss['a3'] = 'a2*7'
422 self.assertEqual(ss['a3'], 210)
423
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000424 # Verify that dir() catches a non-list returned by eval
425 # SF bug #1004669
426 class C:
427 def __getitem__(self, item):
428 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000429 def keys(self):
430 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000431 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
432
Georg Brandl7cae87c2006-09-06 06:51:57 +0000433 def test_exec(self):
434 g = {}
435 exec('z = 1', g)
436 if '__builtins__' in g:
437 del g['__builtins__']
438 self.assertEqual(g, {'z': 1})
439
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000440 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000441 if '__builtins__' in g:
442 del g['__builtins__']
443 self.assertEqual(g, {'z': 2})
444 g = {}
445 l = {}
446
447 import warnings
448 warnings.filterwarnings("ignore", "global statement", module="<string>")
449 exec('global a; a = 1; b = 2', g, l)
450 if '__builtins__' in g:
451 del g['__builtins__']
452 if '__builtins__' in l:
453 del l['__builtins__']
454 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
455
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000456 def test_exec_redirected(self):
457 savestdout = sys.stdout
458 sys.stdout = None # Whatever that cannot flush()
459 try:
460 # Used to raise SystemError('error return without exception set')
461 exec('a')
462 except NameError:
463 pass
464 finally:
465 sys.stdout = savestdout
466
Walter Dörwald919497e2003-01-19 16:23:59 +0000467 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000468 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
469 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
470 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
471 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
472 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000473 def identity(item):
474 return 1
475 filter(identity, Squares(5))
476 self.assertRaises(TypeError, filter)
477 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000478 def __getitem__(self, index):
479 if index<4:
480 return 42
481 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000482 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000483 def badfunc():
484 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000485 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000486
Walter Dörwaldbf517072003-01-27 15:57:14 +0000487 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000488 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
489 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
490 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000491
Walter Dörwald919497e2003-01-19 16:23:59 +0000492 def test_getattr(self):
493 import sys
494 self.assert_(getattr(sys, 'stdout') is sys.stdout)
495 self.assertRaises(TypeError, getattr, sys, 1)
496 self.assertRaises(TypeError, getattr, sys, 1, "foo")
497 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000498 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000499
500 def test_hasattr(self):
501 import sys
502 self.assert_(hasattr(sys, 'stdout'))
503 self.assertRaises(TypeError, hasattr, sys, 1)
504 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000505 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000506
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000507 # Check that hasattr allows SystemExit and KeyboardInterrupts by
508 class A:
509 def __getattr__(self, what):
510 raise KeyboardInterrupt
511 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
512 class B:
513 def __getattr__(self, what):
514 raise SystemExit
515 self.assertRaises(SystemExit, hasattr, B(), "b")
516
Walter Dörwald919497e2003-01-19 16:23:59 +0000517 def test_hash(self):
518 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000519 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000520 self.assertEqual(hash(1), hash(1.0))
521 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000522 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000523 hash((0,1,2,3))
524 def f(): pass
525 self.assertRaises(TypeError, hash, [])
526 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000527 # Bug 1536021: Allow hash to return long objects
528 class X:
529 def __hash__(self):
530 return 2**100
531 self.assertEquals(type(hash(X())), int)
532 class Y(object):
533 def __hash__(self):
534 return 2**100
535 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000536 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000537 def __hash__(self):
538 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000539 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000540
541 def test_hex(self):
542 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000543 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000544 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000545 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000546 self.assertRaises(TypeError, hex, {})
547
548 def test_id(self):
549 id(None)
550 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000551 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000552 id(1.0)
553 id('spam')
554 id((0,1,2,3))
555 id([0,1,2,3])
556 id({'spam': 1, 'eggs': 2, 'ham': 3})
557
Guido van Rossuma88a0332007-02-26 16:59:55 +0000558 # Test input() later, alphabetized as if it were raw_input
559
Walter Dörwald919497e2003-01-19 16:23:59 +0000560 def test_iter(self):
561 self.assertRaises(TypeError, iter)
562 self.assertRaises(TypeError, iter, 42, 42)
563 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000564 for l in lists:
565 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000566 self.assertEqual(next(i), '1')
567 self.assertEqual(next(i), '2')
568 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000569
570 def test_isinstance(self):
571 class C:
572 pass
573 class D(C):
574 pass
575 class E:
576 pass
577 c = C()
578 d = D()
579 e = E()
580 self.assert_(isinstance(c, C))
581 self.assert_(isinstance(d, C))
582 self.assert_(not isinstance(e, C))
583 self.assert_(not isinstance(c, D))
584 self.assert_(not isinstance('foo', E))
585 self.assertRaises(TypeError, isinstance, E, 'foo')
586 self.assertRaises(TypeError, isinstance)
587
588 def test_issubclass(self):
589 class C:
590 pass
591 class D(C):
592 pass
593 class E:
594 pass
595 c = C()
596 d = D()
597 e = E()
598 self.assert_(issubclass(D, C))
599 self.assert_(issubclass(C, C))
600 self.assert_(not issubclass(C, D))
601 self.assertRaises(TypeError, issubclass, 'foo', E)
602 self.assertRaises(TypeError, issubclass, E, 'foo')
603 self.assertRaises(TypeError, issubclass)
604
605 def test_len(self):
606 self.assertEqual(len('123'), 3)
607 self.assertEqual(len(()), 0)
608 self.assertEqual(len((1, 2, 3, 4)), 4)
609 self.assertEqual(len([1, 2, 3, 4]), 4)
610 self.assertEqual(len({}), 0)
611 self.assertEqual(len({'a':1, 'b': 2}), 2)
612 class BadSeq:
613 def __len__(self):
614 raise ValueError
615 self.assertRaises(ValueError, len, BadSeq())
616
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 def test_map(self):
618 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000619 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000620 [1, 4, 9]
621 )
622 try:
623 from math import sqrt
624 except ImportError:
625 def sqrt(x):
626 return pow(x, 0.5)
627 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000628 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000629 [[4.0, 2.0], [9.0, 3.0]]
630 )
631 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000632 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 [10, 4, 6]
634 )
635
636 def plus(*v):
637 accu = 0
638 for i in v: accu = accu + i
639 return accu
640 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000641 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000642 [1, 3, 7]
643 )
644 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000645 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000646 [1+4, 3+9, 7+2]
647 )
648 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000649 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000650 [1+4+1, 3+9+1, 7+2+0]
651 )
652 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000653 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000654 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
655 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000656 def Max(a, b):
657 if a is None:
658 return b
659 if b is None:
660 return a
661 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000662 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000663 list(map(Max, Squares(3), Squares(2))),
664 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000665 )
666 self.assertRaises(TypeError, map)
667 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000668 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000669 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000670 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000671 yield None
672 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000673 def badfunc(x):
674 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000675 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000676
677 def test_max(self):
678 self.assertEqual(max('123123'), '3')
679 self.assertEqual(max(1, 2, 3), 3)
680 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
681 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
682
Guido van Rossume2a383d2007-01-15 16:59:06 +0000683 self.assertEqual(max(1, 2, 3.0), 3.0)
684 self.assertEqual(max(1, 2.0, 3), 3)
685 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000686
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000687 for stmt in (
688 "max(key=int)", # no args
689 "max(1, key=int)", # single arg not iterable
690 "max(1, 2, keystone=int)", # wrong keyword
691 "max(1, 2, key=int, abc=int)", # two many keywords
692 "max(1, 2, key=1)", # keyfunc is not callable
693 ):
Tim Peters7f061872004-12-07 21:17:46 +0000694 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000695 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000696 except TypeError:
697 pass
698 else:
699 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000700
701 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
702 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
703 self.assertEqual(max(1, 2, key=neg), 1) # two elems
704
705 data = [random.randrange(200) for i in range(100)]
706 keys = dict((elem, random.randrange(50)) for elem in data)
707 f = keys.__getitem__
708 self.assertEqual(max(data, key=f),
709 sorted(reversed(data), key=f)[-1])
710
Walter Dörwald919497e2003-01-19 16:23:59 +0000711 def test_min(self):
712 self.assertEqual(min('123123'), '1')
713 self.assertEqual(min(1, 2, 3), 1)
714 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
715 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
716
Guido van Rossume2a383d2007-01-15 16:59:06 +0000717 self.assertEqual(min(1, 2, 3.0), 1)
718 self.assertEqual(min(1, 2.0, 3), 1)
719 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000720
721 self.assertRaises(TypeError, min)
722 self.assertRaises(TypeError, min, 42)
723 self.assertRaises(ValueError, min, ())
724 class BadSeq:
725 def __getitem__(self, index):
726 raise ValueError
727 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000728
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000729 for stmt in (
730 "min(key=int)", # no args
731 "min(1, key=int)", # single arg not iterable
732 "min(1, 2, keystone=int)", # wrong keyword
733 "min(1, 2, key=int, abc=int)", # two many keywords
734 "min(1, 2, key=1)", # keyfunc is not callable
735 ):
Tim Peters7f061872004-12-07 21:17:46 +0000736 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000737 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000738 except TypeError:
739 pass
740 else:
741 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000742
743 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
744 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
745 self.assertEqual(min(1, 2, key=neg), 2) # two elems
746
747 data = [random.randrange(200) for i in range(100)]
748 keys = dict((elem, random.randrange(50)) for elem in data)
749 f = keys.__getitem__
750 self.assertEqual(min(data, key=f),
751 sorted(data, key=f)[0])
752
Georg Brandla18af4e2007-04-21 15:47:16 +0000753 def test_next(self):
754 it = iter(range(2))
755 self.assertEqual(next(it), 0)
756 self.assertEqual(next(it), 1)
757 self.assertRaises(StopIteration, next, it)
758 self.assertRaises(StopIteration, next, it)
759 self.assertEquals(next(it, 42), 42)
760
761 class Iter(object):
762 def __iter__(self):
763 return self
764 def __next__(self):
765 raise StopIteration
766
767 it = iter(Iter())
768 self.assertEquals(next(it, 42), 42)
769 self.assertRaises(StopIteration, next, it)
770
771 def gen():
772 yield 1
773 return
774
775 it = gen()
776 self.assertEquals(next(it), 1)
777 self.assertRaises(StopIteration, next, it)
778 self.assertEquals(next(it, 42), 42)
779
Walter Dörwald919497e2003-01-19 16:23:59 +0000780 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000781 self.assertEqual(oct(100), '0o144')
782 self.assertEqual(oct(100), '0o144')
783 self.assertEqual(oct(-100), '-0o144')
784 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000785 self.assertRaises(TypeError, oct, ())
786
787 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000788 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000789 fp = open(TESTFN, 'w')
790 try:
791 fp.write('1+1\n')
792 fp.write('1+1\n')
793 fp.write('The quick brown fox jumps over the lazy dog')
794 fp.write('.\n')
795 fp.write('Dear John\n')
796 fp.write('XXX'*100)
797 fp.write('YYY'*100)
798 finally:
799 fp.close()
800
801 def test_open(self):
802 self.write_testfile()
803 fp = open(TESTFN, 'r')
804 try:
805 self.assertEqual(fp.readline(4), '1+1\n')
806 self.assertEqual(fp.readline(4), '1+1\n')
807 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
808 self.assertEqual(fp.readline(4), 'Dear')
809 self.assertEqual(fp.readline(100), ' John\n')
810 self.assertEqual(fp.read(300), 'XXX'*100)
811 self.assertEqual(fp.read(1000), 'YYY'*100)
812 finally:
813 fp.close()
814 unlink(TESTFN)
815
816 def test_ord(self):
817 self.assertEqual(ord(' '), 32)
818 self.assertEqual(ord('A'), 65)
819 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000820 self.assertEqual(ord('\x80'), 128)
821 self.assertEqual(ord('\xff'), 255)
822
823 self.assertEqual(ord(b' '), 32)
824 self.assertEqual(ord(b'A'), 65)
825 self.assertEqual(ord(b'a'), 97)
826 self.assertEqual(ord(b'\x80'), 128)
827 self.assertEqual(ord(b'\xff'), 255)
828
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000829 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000830 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000831
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000832 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
833 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
834 self.assertEqual(ord("\U00010000"), 0x00010000)
835 self.assertEqual(ord("\U00010001"), 0x00010001)
836 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
837 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
838 self.assertEqual(ord("\U00100000"), 0x00100000)
839 self.assertEqual(ord("\U00100001"), 0x00100001)
840 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
841 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
842
Walter Dörwald919497e2003-01-19 16:23:59 +0000843 def test_pow(self):
844 self.assertEqual(pow(0,0), 1)
845 self.assertEqual(pow(0,1), 0)
846 self.assertEqual(pow(1,0), 1)
847 self.assertEqual(pow(1,1), 1)
848
849 self.assertEqual(pow(2,0), 1)
850 self.assertEqual(pow(2,10), 1024)
851 self.assertEqual(pow(2,20), 1024*1024)
852 self.assertEqual(pow(2,30), 1024*1024*1024)
853
854 self.assertEqual(pow(-2,0), 1)
855 self.assertEqual(pow(-2,1), -2)
856 self.assertEqual(pow(-2,2), 4)
857 self.assertEqual(pow(-2,3), -8)
858
Guido van Rossume2a383d2007-01-15 16:59:06 +0000859 self.assertEqual(pow(0,0), 1)
860 self.assertEqual(pow(0,1), 0)
861 self.assertEqual(pow(1,0), 1)
862 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000863
Guido van Rossume2a383d2007-01-15 16:59:06 +0000864 self.assertEqual(pow(2,0), 1)
865 self.assertEqual(pow(2,10), 1024)
866 self.assertEqual(pow(2,20), 1024*1024)
867 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000868
Guido van Rossume2a383d2007-01-15 16:59:06 +0000869 self.assertEqual(pow(-2,0), 1)
870 self.assertEqual(pow(-2,1), -2)
871 self.assertEqual(pow(-2,2), 4)
872 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873
874 self.assertAlmostEqual(pow(0.,0), 1.)
875 self.assertAlmostEqual(pow(0.,1), 0.)
876 self.assertAlmostEqual(pow(1.,0), 1.)
877 self.assertAlmostEqual(pow(1.,1), 1.)
878
879 self.assertAlmostEqual(pow(2.,0), 1.)
880 self.assertAlmostEqual(pow(2.,10), 1024.)
881 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
882 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
883
884 self.assertAlmostEqual(pow(-2.,0), 1.)
885 self.assertAlmostEqual(pow(-2.,1), -2.)
886 self.assertAlmostEqual(pow(-2.,2), 4.)
887 self.assertAlmostEqual(pow(-2.,3), -8.)
888
Guido van Rossume2a383d2007-01-15 16:59:06 +0000889 for x in 2, 2, 2.0:
890 for y in 10, 10, 10.0:
891 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000892 if isinstance(x, float) or \
893 isinstance(y, float) or \
894 isinstance(z, float):
895 self.assertRaises(TypeError, pow, x, y, z)
896 else:
897 self.assertAlmostEqual(pow(x, y, z), 24.0)
898
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000899 self.assertAlmostEqual(pow(-1, 0.5), 1j)
900 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
901
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 self.assertRaises(TypeError, pow, -1, -2, 3)
903 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000904 self.assertRaises(TypeError, pow, -1, -2, 3)
905 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000906
907 self.assertRaises(TypeError, pow)
908
909 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000910 self.assertEqual(list(range(3)), [0, 1, 2])
911 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
912 self.assertEqual(list(range(0)), [])
913 self.assertEqual(list(range(-3)), [])
914 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
915 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000916
Guido van Rossum805365e2007-05-07 22:24:25 +0000917 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000918 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000919 self.assertEqual(list(range(-2**100)), [])
920 self.assertEqual(list(range(0, -2**100)), [])
921 self.assertEqual(list(range(0, 2**100, -1)), [])
922 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000923
Christian Heimesa37d4c62007-12-04 23:02:19 +0000924 a = int(10 * sys.maxsize)
925 b = int(100 * sys.maxsize)
926 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000927
Guido van Rossum805365e2007-05-07 22:24:25 +0000928 self.assertEqual(list(range(a, a+2)), [a, a+1])
929 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
930 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000931
Guido van Rossum805365e2007-05-07 22:24:25 +0000932 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000933 self.assert_(a in seq)
934 self.assert_(b not in seq)
935 self.assertEqual(len(seq), 2)
936
Guido van Rossum805365e2007-05-07 22:24:25 +0000937 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000938 self.assert_(b in seq)
939 self.assert_(a not in seq)
940 self.assertEqual(len(seq), 2)
941
Guido van Rossum805365e2007-05-07 22:24:25 +0000942 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000943 self.assert_(-a in seq)
944 self.assert_(-b not in seq)
945 self.assertEqual(len(seq), 2)
946
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 self.assertRaises(TypeError, range)
948 self.assertRaises(TypeError, range, 1, 2, 3, 4)
949 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000950 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000951
952 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000953 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +0000954 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000955 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
956
957 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +0000958 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +0000959 """
Walter Dörwald919497e2003-01-19 16:23:59 +0000960
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000961 # Reject floats when it would require PyLongs to represent.
962 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000963 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000964
Walter Dörwald357981e2003-04-15 18:59:28 +0000965 self.assertRaises(TypeError, range, 0, "spam")
966 self.assertRaises(TypeError, range, 0, 42, "spam")
967
Christian Heimesa37d4c62007-12-04 23:02:19 +0000968 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
969 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +0000970
Christian Heimesa37d4c62007-12-04 23:02:19 +0000971 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +0000972
Guido van Rossuma88a0332007-02-26 16:59:55 +0000973 def test_input(self):
974 self.write_testfile()
975 fp = open(TESTFN, 'r')
976 savestdin = sys.stdin
977 savestdout = sys.stdout # Eats the echo
978 try:
979 sys.stdin = fp
980 sys.stdout = BitBucket()
981 self.assertEqual(input(), "1+1")
982 self.assertEqual(input('testing\n'), "1+1")
983 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
984 self.assertEqual(input('testing\n'), 'Dear John')
985
986 # SF 1535165: don't segfault on closed stdin
987 # sys.stdout must be a regular file for triggering
988 sys.stdout = savestdout
989 sys.stdin.close()
990 self.assertRaises(ValueError, input)
991
992 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000993 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000994 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000995 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000996 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000997 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000998 self.assertRaises(EOFError, input)
999
1000 del sys.stdout
1001 self.assertRaises(RuntimeError, input, 'prompt')
1002 del sys.stdin
1003 self.assertRaises(RuntimeError, input, 'prompt')
1004 finally:
1005 sys.stdin = savestdin
1006 sys.stdout = savestdout
1007 fp.close()
1008 unlink(TESTFN)
1009
Walter Dörwald919497e2003-01-19 16:23:59 +00001010 def test_repr(self):
1011 self.assertEqual(repr(''), '\'\'')
1012 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001013 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001014 self.assertEqual(repr(()), '()')
1015 self.assertEqual(repr([]), '[]')
1016 self.assertEqual(repr({}), '{}')
1017 a = []
1018 a.append(a)
1019 self.assertEqual(repr(a), '[[...]]')
1020 a = {}
1021 a[0] = a
1022 self.assertEqual(repr(a), '{0: {...}}')
1023
1024 def test_round(self):
1025 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001026 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001027 self.assertEqual(round(1.0), 1.0)
1028 self.assertEqual(round(10.0), 10.0)
1029 self.assertEqual(round(1000000000.0), 1000000000.0)
1030 self.assertEqual(round(1e20), 1e20)
1031
1032 self.assertEqual(round(-1.0), -1.0)
1033 self.assertEqual(round(-10.0), -10.0)
1034 self.assertEqual(round(-1000000000.0), -1000000000.0)
1035 self.assertEqual(round(-1e20), -1e20)
1036
1037 self.assertEqual(round(0.1), 0.0)
1038 self.assertEqual(round(1.1), 1.0)
1039 self.assertEqual(round(10.1), 10.0)
1040 self.assertEqual(round(1000000000.1), 1000000000.0)
1041
1042 self.assertEqual(round(-1.1), -1.0)
1043 self.assertEqual(round(-10.1), -10.0)
1044 self.assertEqual(round(-1000000000.1), -1000000000.0)
1045
1046 self.assertEqual(round(0.9), 1.0)
1047 self.assertEqual(round(9.9), 10.0)
1048 self.assertEqual(round(999999999.9), 1000000000.0)
1049
1050 self.assertEqual(round(-0.9), -1.0)
1051 self.assertEqual(round(-9.9), -10.0)
1052 self.assertEqual(round(-999999999.9), -1000000000.0)
1053
1054 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001055 self.assertEqual(type(round(-8.0, -1)), float)
1056
1057 self.assertEqual(type(round(-8.0, 0)), float)
1058 self.assertEqual(type(round(-8.0, 1)), float)
1059
1060 # Check even / odd rounding behaviour
1061 self.assertEqual(round(5.5), 6)
1062 self.assertEqual(round(6.5), 6)
1063 self.assertEqual(round(-5.5), -6)
1064 self.assertEqual(round(-6.5), -6)
1065
1066 # Check behavior on ints
1067 self.assertEqual(round(0), 0)
1068 self.assertEqual(round(8), 8)
1069 self.assertEqual(round(-8), -8)
1070 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001071 self.assertEqual(type(round(-8, -1)), int)
1072 self.assertEqual(type(round(-8, 0)), int)
1073 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001074
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075 # test new kwargs
1076 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1077
Walter Dörwald919497e2003-01-19 16:23:59 +00001078 self.assertRaises(TypeError, round)
1079
Alex Martelliae211f92007-08-22 23:21:33 +00001080 # test generic rounding delegation for reals
1081 class TestRound:
1082 def __round__(self):
1083 return 23
1084
1085 class TestNoRound:
1086 pass
1087
1088 self.assertEqual(round(TestRound()), 23)
1089
1090 self.assertRaises(TypeError, round, 1, 2, 3)
1091 self.assertRaises(TypeError, round, TestNoRound())
1092
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001093 t = TestNoRound()
1094 t.__round__ = lambda *args: args
1095 self.assertRaises(TypeError, round, t)
1096 self.assertRaises(TypeError, round, t, 0)
1097
Walter Dörwald919497e2003-01-19 16:23:59 +00001098 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001099 setattr(sys, 'spam', 1)
1100 self.assertEqual(sys.spam, 1)
1101 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1102 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001103
Walter Dörwald919497e2003-01-19 16:23:59 +00001104
Alex Martellia70b1912003-04-22 08:12:33 +00001105 def test_sum(self):
1106 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001107 self.assertEqual(sum(list(range(2,8))), 27)
1108 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001109 self.assertEqual(sum(Squares(10)), 285)
1110 self.assertEqual(sum(iter(Squares(10))), 285)
1111 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1112
1113 self.assertRaises(TypeError, sum)
1114 self.assertRaises(TypeError, sum, 42)
1115 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1116 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1117 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1118 self.assertRaises(TypeError, sum, [{2:3}])
1119 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1120
1121 class BadSeq:
1122 def __getitem__(self, index):
1123 raise ValueError
1124 self.assertRaises(ValueError, sum, BadSeq())
1125
Walter Dörwald919497e2003-01-19 16:23:59 +00001126 def test_type(self):
1127 self.assertEqual(type(''), type('123'))
1128 self.assertNotEqual(type(''), type(()))
1129
Guido van Rossumfee7b932005-01-16 00:21:28 +00001130 # We don't want self in vars(), so these are static methods
1131
1132 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def get_vars_f0():
1134 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001135
Guido van Rossumfee7b932005-01-16 00:21:28 +00001136 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001137 def get_vars_f2():
1138 BuiltinTest.get_vars_f0()
1139 a = 1
1140 b = 2
1141 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001142
1143 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001144 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001145 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001146 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001147 self.assertEqual(self.get_vars_f0(), {})
1148 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1149 self.assertRaises(TypeError, vars, 42, 42)
1150 self.assertRaises(TypeError, vars, 42)
1151
1152 def test_zip(self):
1153 a = (1, 2, 3)
1154 b = (4, 5, 6)
1155 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001156 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001158 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001160 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001161 class I:
1162 def __getitem__(self, i):
1163 if i < 0 or i > 2: raise IndexError
1164 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001165 self.assertEqual(list(zip(a, I())), t)
1166 self.assertEqual(list(zip()), [])
1167 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 self.assertRaises(TypeError, zip, None)
1169 class G:
1170 pass
1171 self.assertRaises(TypeError, zip, a, G())
1172
1173 # Make sure zip doesn't try to allocate a billion elements for the
1174 # result list when one of its arguments doesn't say how long it is.
1175 # A MemoryError is the most likely failure mode.
1176 class SequenceWithoutALength:
1177 def __getitem__(self, i):
1178 if i == 5:
1179 raise IndexError
1180 else:
1181 return i
1182 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001183 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 list(enumerate(range(5)))
1185 )
1186
1187 class BadSeq:
1188 def __getitem__(self, i):
1189 if i == 5:
1190 raise ValueError
1191 else:
1192 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001193 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001194
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001195 def test_bin(self):
1196 self.assertEqual(bin(0), '0b0')
1197 self.assertEqual(bin(1), '0b1')
1198 self.assertEqual(bin(-1), '-0b1')
1199 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1200 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1201 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1202 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1203
Raymond Hettinger64958a12003-12-17 20:43:33 +00001204class TestSorted(unittest.TestCase):
1205
1206 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001207 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001208 copy = data[:]
1209 random.shuffle(copy)
1210 self.assertEqual(data, sorted(copy))
1211 self.assertNotEqual(data, copy)
1212
1213 data.reverse()
1214 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001215 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1216 self.assertNotEqual(data, copy)
1217 random.shuffle(copy)
1218 self.assertEqual(data, sorted(copy, reverse=1))
1219 self.assertNotEqual(data, copy)
1220
1221 def test_inputtypes(self):
1222 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001223 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001224 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001225 self.assertEqual(sorted(s), sorted(T(s)))
1226
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001227 s = ''.join(set(s)) # unique letters only
1228 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001229 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001230 self.assertEqual(sorted(s), sorted(T(s)))
1231
1232 def test_baddecorator(self):
1233 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1234 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1235
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001236def test_main(verbose=None):
1237 test_classes = (BuiltinTest, TestSorted)
1238
1239 run_unittest(*test_classes)
1240
1241 # verify reference counting
1242 if verbose and hasattr(sys, "gettotalrefcount"):
1243 import gc
1244 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001245 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001246 run_unittest(*test_classes)
1247 gc.collect()
1248 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001249 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001250
Walter Dörwald919497e2003-01-19 16:23:59 +00001251
1252if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001253 test_main(verbose=True)