blob: 70980f8924f5e4eef5f02c3ac60134bdaa54c8a9 [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
Walter Dörwald919497e2003-01-19 16:23:59 +00003import test.test_support, unittest
Georg Brandlde9b6242006-04-30 11:13:56 +00004from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
5 run_unittest, run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Mark Dickinsond058cd22008-02-10 21:29:51 +00008import sys, warnings, cStringIO, random, fractions, UserDict
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")
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000014# count the number of test runs.
15# used to skip running test_execfile() multiple times
16numruns = 0
17
Walter Dörwald919497e2003-01-19 16:23:59 +000018class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000019
Walter Dörwald919497e2003-01-19 16:23:59 +000020 def __init__(self, max):
21 self.max = max
22 self.sofar = []
23
24 def __len__(self): return len(self.sofar)
25
26 def __getitem__(self, i):
27 if not 0 <= i < self.max: raise IndexError
28 n = len(self.sofar)
29 while n <= i:
30 self.sofar.append(n*n)
31 n += 1
32 return self.sofar[i]
33
34class StrSquares:
35
36 def __init__(self, max):
37 self.max = max
38 self.sofar = []
39
40 def __len__(self):
41 return len(self.sofar)
42
43 def __getitem__(self, i):
44 if not 0 <= i < self.max:
45 raise IndexError
46 n = len(self.sofar)
47 while n <= i:
48 self.sofar.append(str(n*n))
49 n += 1
50 return self.sofar[i]
51
52class BitBucket:
53 def write(self, line):
54 pass
55
Walter Dörwald919497e2003-01-19 16:23:59 +000056
Raymond Hettinger96229b12005-03-11 06:49:40 +000057class TestFailingBool:
58 def __nonzero__(self):
59 raise RuntimeError
60
61class TestFailingIter:
62 def __iter__(self):
63 raise RuntimeError
64
Walter Dörwald919497e2003-01-19 16:23:59 +000065class BuiltinTest(unittest.TestCase):
66
67 def test_import(self):
68 __import__('sys')
69 __import__('time')
70 __import__('string')
Georg Brandl5240d742007-03-13 20:46:32 +000071 __import__(name='sys')
72 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +000073 self.assertRaises(ImportError, __import__, 'spamspam')
74 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +000075 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +000076 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +000077
78 def test_abs(self):
79 # int
80 self.assertEqual(abs(0), 0)
81 self.assertEqual(abs(1234), 1234)
82 self.assertEqual(abs(-1234), 1234)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +000083 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +000084 # float
85 self.assertEqual(abs(0.0), 0.0)
86 self.assertEqual(abs(3.14), 3.14)
87 self.assertEqual(abs(-3.14), 3.14)
88 # long
89 self.assertEqual(abs(0L), 0L)
90 self.assertEqual(abs(1234L), 1234L)
91 self.assertEqual(abs(-1234L), 1234L)
92 # str
93 self.assertRaises(TypeError, abs, 'a')
94
Raymond Hettinger96229b12005-03-11 06:49:40 +000095 def test_all(self):
96 self.assertEqual(all([2, 4, 6]), True)
97 self.assertEqual(all([2, None, 6]), False)
98 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
99 self.assertRaises(RuntimeError, all, TestFailingIter())
100 self.assertRaises(TypeError, all, 10) # Non-iterable
101 self.assertRaises(TypeError, all) # No args
102 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
103 self.assertEqual(all([]), True) # Empty iterator
104 S = [50, 60]
105 self.assertEqual(all(x > 42 for x in S), True)
106 S = [50, 40, 60]
107 self.assertEqual(all(x > 42 for x in S), False)
108
109 def test_any(self):
110 self.assertEqual(any([None, None, None]), False)
111 self.assertEqual(any([None, 4, None]), True)
112 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
113 self.assertRaises(RuntimeError, all, TestFailingIter())
114 self.assertRaises(TypeError, any, 10) # Non-iterable
115 self.assertRaises(TypeError, any) # No args
116 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
117 self.assertEqual(any([]), False) # Empty iterator
118 S = [40, 60, 30]
119 self.assertEqual(any(x > 42 for x in S), True)
120 S = [10, 20, 30]
121 self.assertEqual(any(x > 42 for x in S), False)
122
Armin Rigo7ccbca92006-10-04 12:17:45 +0000123 def test_neg(self):
124 x = -sys.maxint-1
125 self.assert_(isinstance(x, int))
126 self.assertEqual(-x, sys.maxint+1)
127
Walter Dörwald919497e2003-01-19 16:23:59 +0000128 def test_apply(self):
129 def f0(*args):
130 self.assertEqual(args, ())
131 def f1(a1):
132 self.assertEqual(a1, 1)
133 def f2(a1, a2):
134 self.assertEqual(a1, 1)
135 self.assertEqual(a2, 2)
136 def f3(a1, a2, a3):
137 self.assertEqual(a1, 1)
138 self.assertEqual(a2, 2)
139 self.assertEqual(a3, 3)
140 apply(f0, ())
141 apply(f1, (1,))
142 apply(f2, (1, 2))
143 apply(f3, (1, 2, 3))
144
145 # A PyCFunction that takes only positional parameters should allow an
146 # empty keyword dictionary to pass without a complaint, but raise a
147 # TypeError if the dictionary is non-empty.
148 apply(id, (1,), {})
149 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
150 self.assertRaises(TypeError, apply)
151 self.assertRaises(TypeError, apply, id, 42)
152 self.assertRaises(TypeError, apply, id, (42,), 42)
153
154 def test_callable(self):
155 self.assert_(callable(len))
156 def f(): pass
157 self.assert_(callable(f))
158 class C:
159 def meth(self): pass
160 self.assert_(callable(C))
161 x = C()
162 self.assert_(callable(x.meth))
163 self.assert_(not callable(x))
164 class D(C):
165 def __call__(self): pass
166 y = D()
167 self.assert_(callable(y))
168 y()
169
170 def test_chr(self):
171 self.assertEqual(chr(32), ' ')
172 self.assertEqual(chr(65), 'A')
173 self.assertEqual(chr(97), 'a')
174 self.assertEqual(chr(0xff), '\xff')
175 self.assertRaises(ValueError, chr, 256)
176 self.assertRaises(TypeError, chr)
177
178 def test_cmp(self):
179 self.assertEqual(cmp(-1, 1), -1)
180 self.assertEqual(cmp(1, -1), 1)
181 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000182 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000183 a = []; a.append(a)
184 b = []; b.append(b)
185 from UserList import UserList
186 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000187 self.assertRaises(RuntimeError, cmp, a, b)
188 self.assertRaises(RuntimeError, cmp, b, c)
189 self.assertRaises(RuntimeError, cmp, c, a)
190 self.assertRaises(RuntimeError, cmp, a, c)
191 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000192 a.pop(); b.pop(); c.pop()
193 self.assertRaises(TypeError, cmp)
194
195 def test_coerce(self):
196 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
197 self.assertEqual(coerce(1, 1L), (1L, 1L))
198 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
199 self.assertRaises(TypeError, coerce)
200 class BadNumber:
201 def __coerce__(self, other):
202 raise ValueError
203 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000204 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000205
206 def test_compile(self):
207 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000208 bom = '\xef\xbb\xbf'
209 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000210 compile(source='pass', filename='?', mode='exec')
211 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
212 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 self.assertRaises(TypeError, compile)
214 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
215 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000216 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000217 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
218 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000219 if have_unicode:
220 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000221 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
222 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000223
Georg Brandl5240d742007-03-13 20:46:32 +0000224
Walter Dörwald919497e2003-01-19 16:23:59 +0000225 def test_delattr(self):
226 import sys
227 sys.spam = 1
228 delattr(sys, 'spam')
229 self.assertRaises(TypeError, delattr)
230
231 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000232 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000233 self.assertRaises(TypeError, dir, 42, 42)
234
Georg Brandl871f1bc2007-03-12 13:17:36 +0000235 # dir() - local scope
236 local_var = 1
237 self.assert_('local_var' in dir())
238
239 # dir(module)
240 import sys
241 self.assert_('exit' in dir(sys))
242
243 # dir(module_with_invalid__dict__)
244 import types
245 class Foo(types.ModuleType):
246 __dict__ = 8
247 f = Foo("foo")
248 self.assertRaises(TypeError, dir, f)
249
250 # dir(type)
251 self.assert_("strip" in dir(str))
252 self.assert_("__mro__" not in dir(str))
253
254 # dir(obj)
255 class Foo(object):
256 def __init__(self):
257 self.x = 7
258 self.y = 8
259 self.z = 9
260 f = Foo()
261 self.assert_("y" in dir(f))
262
263 # dir(obj_no__dict__)
264 class Foo(object):
265 __slots__ = []
266 f = Foo()
267 self.assert_("__repr__" in dir(f))
268
269 # dir(obj_no__class__with__dict__)
270 # (an ugly trick to cause getattr(f, "__class__") to fail)
271 class Foo(object):
272 __slots__ = ["__class__", "__dict__"]
273 def __init__(self):
274 self.bar = "wow"
275 f = Foo()
276 self.assert_("__repr__" not in dir(f))
277 self.assert_("bar" in dir(f))
278
279 # dir(obj_using __dir__)
280 class Foo(object):
281 def __dir__(self):
282 return ["kan", "ga", "roo"]
283 f = Foo()
284 self.assert_(dir(f) == ["ga", "kan", "roo"])
285
286 # dir(obj__dir__not_list)
287 class Foo(object):
288 def __dir__(self):
289 return 7
290 f = Foo()
291 self.assertRaises(TypeError, dir, f)
292
Walter Dörwald919497e2003-01-19 16:23:59 +0000293 def test_divmod(self):
294 self.assertEqual(divmod(12, 7), (1, 5))
295 self.assertEqual(divmod(-12, 7), (-2, 2))
296 self.assertEqual(divmod(12, -7), (-2, -2))
297 self.assertEqual(divmod(-12, -7), (1, -5))
298
299 self.assertEqual(divmod(12L, 7L), (1L, 5L))
300 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
301 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
302 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
303
304 self.assertEqual(divmod(12, 7L), (1, 5L))
305 self.assertEqual(divmod(-12, 7L), (-2, 2L))
306 self.assertEqual(divmod(12L, -7), (-2L, -2))
307 self.assertEqual(divmod(-12L, -7), (1L, -5))
308
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000309 self.assertEqual(divmod(-sys.maxint-1, -1),
310 (sys.maxint+1, 0))
311
Walter Dörwald919497e2003-01-19 16:23:59 +0000312 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
313 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
314 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
315 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
316
317 self.assertRaises(TypeError, divmod)
318
319 def test_eval(self):
320 self.assertEqual(eval('1+1'), 2)
321 self.assertEqual(eval(' 1+1\n'), 2)
322 globals = {'a': 1, 'b': 2}
323 locals = {'b': 200, 'c': 300}
324 self.assertEqual(eval('a', globals) , 1)
325 self.assertEqual(eval('a', globals, locals), 1)
326 self.assertEqual(eval('b', globals, locals), 200)
327 self.assertEqual(eval('c', globals, locals), 300)
328 if have_unicode:
329 self.assertEqual(eval(unicode('1+1')), 2)
330 self.assertEqual(eval(unicode(' 1+1\n')), 2)
331 globals = {'a': 1, 'b': 2}
332 locals = {'b': 200, 'c': 300}
333 if have_unicode:
334 self.assertEqual(eval(unicode('a'), globals), 1)
335 self.assertEqual(eval(unicode('a'), globals, locals), 1)
336 self.assertEqual(eval(unicode('b'), globals, locals), 200)
337 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000338 bom = '\xef\xbb\xbf'
339 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000340 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
341 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000342 self.assertRaises(TypeError, eval)
343 self.assertRaises(TypeError, eval, ())
344
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000345 def test_general_eval(self):
346 # Tests that general mappings can be used for the locals argument
347
348 class M:
349 "Test mapping interface versus possible calls from eval()."
350 def __getitem__(self, key):
351 if key == 'a':
352 return 12
353 raise KeyError
354 def keys(self):
355 return list('xyz')
356
357 m = M()
358 g = globals()
359 self.assertEqual(eval('a', g, m), 12)
360 self.assertRaises(NameError, eval, 'b', g, m)
361 self.assertEqual(eval('dir()', g, m), list('xyz'))
362 self.assertEqual(eval('globals()', g, m), g)
363 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000364 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000365 class A:
366 "Non-mapping"
367 pass
368 m = A()
369 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000370
371 # Verify that dict subclasses work as well
372 class D(dict):
373 def __getitem__(self, key):
374 if key == 'a':
375 return 12
376 return dict.__getitem__(self, key)
377 def keys(self):
378 return list('xyz')
379
380 d = D()
381 self.assertEqual(eval('a', g, d), 12)
382 self.assertRaises(NameError, eval, 'b', g, d)
383 self.assertEqual(eval('dir()', g, d), list('xyz'))
384 self.assertEqual(eval('globals()', g, d), g)
385 self.assertEqual(eval('locals()', g, d), d)
386
387 # Verify locals stores (used by list comps)
388 eval('[locals() for i in (2,3)]', g, d)
389 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
390
391 class SpreadSheet:
392 "Sample application showing nested, calculated lookups."
393 _cells = {}
394 def __setitem__(self, key, formula):
395 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000396 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000397 return eval(self._cells[key], globals(), self)
398
399 ss = SpreadSheet()
400 ss['a1'] = '5'
401 ss['a2'] = 'a1*6'
402 ss['a3'] = 'a2*7'
403 self.assertEqual(ss['a3'], 210)
404
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000405 # Verify that dir() catches a non-list returned by eval
406 # SF bug #1004669
407 class C:
408 def __getitem__(self, item):
409 raise KeyError(item)
410 def keys(self):
411 return 'a'
412 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
413
Walter Dörwald919497e2003-01-19 16:23:59 +0000414 # Done outside of the method test_z to get the correct scope
415 z = 0
416 f = open(TESTFN, 'w')
417 f.write('z = z+1\n')
418 f.write('z = z*2\n')
419 f.close()
420 execfile(TESTFN)
421
422 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000423 global numruns
424 if numruns:
425 return
426 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000427
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 globals = {'a': 1, 'b': 2}
429 locals = {'b': 200, 'c': 300}
430
431 self.assertEqual(self.__class__.z, 2)
432 globals['z'] = 0
433 execfile(TESTFN, globals)
434 self.assertEqual(globals['z'], 2)
435 locals['z'] = 0
436 execfile(TESTFN, globals, locals)
437 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000438
439 class M:
440 "Test mapping interface versus possible calls from execfile()."
441 def __init__(self):
442 self.z = 10
443 def __getitem__(self, key):
444 if key == 'z':
445 return self.z
446 raise KeyError
447 def __setitem__(self, key, value):
448 if key == 'z':
449 self.z = value
450 return
451 raise KeyError
452
453 locals = M()
454 locals['z'] = 0
455 execfile(TESTFN, globals, locals)
456 self.assertEqual(locals['z'], 2)
457
Walter Dörwald919497e2003-01-19 16:23:59 +0000458 unlink(TESTFN)
459 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000460 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000461 import os
462 self.assertRaises(IOError, execfile, os.curdir)
463 self.assertRaises(IOError, execfile, "I_dont_exist")
464
465 def test_filter(self):
466 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
467 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
468 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
469 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
470 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
471 def identity(item):
472 return 1
473 filter(identity, Squares(5))
474 self.assertRaises(TypeError, filter)
475 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000476 def __getitem__(self, index):
477 if index<4:
478 return 42
479 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000480 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
481 def badfunc():
482 pass
483 self.assertRaises(TypeError, filter, badfunc, range(5))
484
Walter Dörwaldbf517072003-01-27 15:57:14 +0000485 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 self.assertEqual(filter(None, (1, 2)), (1, 2))
487 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
488 self.assertRaises(TypeError, filter, 42, (1, 2))
489
Walter Dörwaldbf517072003-01-27 15:57:14 +0000490 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000491 self.assertEqual(filter(None, "12"), "12")
492 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
493 self.assertRaises(TypeError, filter, 42, "12")
494 class badstr(str):
495 def __getitem__(self, index):
496 raise ValueError
497 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000498
Walter Dörwald903f1e02003-02-04 16:28:00 +0000499 class badstr2(str):
500 def __getitem__(self, index):
501 return 42
502 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
503
504 class weirdstr(str):
505 def __getitem__(self, index):
506 return weirdstr(2*str.__getitem__(self, index))
507 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
508
Walter Dörwald5e61e242003-02-04 17:04:01 +0000509 class shiftstr(str):
510 def __getitem__(self, index):
511 return chr(ord(str.__getitem__(self, index))+1)
512 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
513
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000514 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000515 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000516 self.assertEqual(filter(None, unicode("12")), unicode("12"))
517 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
518 self.assertRaises(TypeError, filter, 42, unicode("12"))
519 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000520
Walter Dörwald903f1e02003-02-04 16:28:00 +0000521 class badunicode(unicode):
522 def __getitem__(self, index):
523 return 42
524 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
525
526 class weirdunicode(unicode):
527 def __getitem__(self, index):
528 return weirdunicode(2*unicode.__getitem__(self, index))
529 self.assertEqual(
530 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
531
Walter Dörwald5e61e242003-02-04 17:04:01 +0000532 class shiftunicode(unicode):
533 def __getitem__(self, index):
534 return unichr(ord(unicode.__getitem__(self, index))+1)
535 self.assertEqual(
536 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
537 unicode("345")
538 )
539
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000540 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000541 # test that filter() never returns tuple, str or unicode subclasses
542 # and that the result always goes through __getitem__
543 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000544 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000545 def __getitem__(self, index):
546 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000547 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000548 def __getitem__(self, index):
549 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000550 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000551 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000552 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000553 }
554 if have_unicode:
555 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000556 def __getitem__(self, index):
557 return 2*unicode.__getitem__(self, index)
558 inputs[unicode2] = {
559 unicode(): unicode(),
560 unicode("123"): unicode("112233")
561 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000562
Walter Dörwald1918f772003-02-10 13:19:13 +0000563 for (cls, inps) in inputs.iteritems():
564 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000565 # make sure the output goes through __getitem__
566 # even if func is None
567 self.assertEqual(
568 filter(funcs[0], cls(inp)),
569 filter(funcs[1], cls(inp))
570 )
571 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000572 outp = filter(func, cls(inp))
573 self.assertEqual(outp, exp)
574 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000575
Walter Dörwald919497e2003-01-19 16:23:59 +0000576 def test_getattr(self):
577 import sys
578 self.assert_(getattr(sys, 'stdout') is sys.stdout)
579 self.assertRaises(TypeError, getattr, sys, 1)
580 self.assertRaises(TypeError, getattr, sys, 1, "foo")
581 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000582 if have_unicode:
583 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000584
585 def test_hasattr(self):
586 import sys
587 self.assert_(hasattr(sys, 'stdout'))
588 self.assertRaises(TypeError, hasattr, sys, 1)
589 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000590 if have_unicode:
591 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000592
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000593 # Check that hasattr allows SystemExit and KeyboardInterrupts by
594 class A:
595 def __getattr__(self, what):
596 raise KeyboardInterrupt
597 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
598 class B:
599 def __getattr__(self, what):
600 raise SystemExit
601 self.assertRaises(SystemExit, hasattr, B(), "b")
602
Walter Dörwald919497e2003-01-19 16:23:59 +0000603 def test_hash(self):
604 hash(None)
605 self.assertEqual(hash(1), hash(1L))
606 self.assertEqual(hash(1), hash(1.0))
607 hash('spam')
608 if have_unicode:
609 self.assertEqual(hash('spam'), hash(unicode('spam')))
610 hash((0,1,2,3))
611 def f(): pass
612 self.assertRaises(TypeError, hash, [])
613 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000614 # Bug 1536021: Allow hash to return long objects
615 class X:
616 def __hash__(self):
617 return 2**100
618 self.assertEquals(type(hash(X())), int)
619 class Y(object):
620 def __hash__(self):
621 return 2**100
622 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000623 class Z(long):
624 def __hash__(self):
625 return self
626 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000627
628 def test_hex(self):
629 self.assertEqual(hex(16), '0x10')
630 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000631 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000632 self.assertEqual(hex(-16L), '-0x10L')
633 self.assertRaises(TypeError, hex, {})
634
635 def test_id(self):
636 id(None)
637 id(1)
638 id(1L)
639 id(1.0)
640 id('spam')
641 id((0,1,2,3))
642 id([0,1,2,3])
643 id({'spam': 1, 'eggs': 2, 'ham': 3})
644
645 # Test input() later, together with raw_input
646
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 def test_intern(self):
648 self.assertRaises(TypeError, intern)
649 s = "never interned before"
650 self.assert_(intern(s) is s)
651 s2 = s.swapcase().swapcase()
652 self.assert_(intern(s2) is s)
653
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000654 # Subclasses of string can't be interned, because they
655 # provide too much opportunity for insane things to happen.
656 # We don't want them in the interned dict and if they aren't
657 # actually interned, we don't want to create the appearance
658 # that they are by allowing intern() to succeeed.
659 class S(str):
660 def __hash__(self):
661 return 123
662
663 self.assertRaises(TypeError, intern, S("abc"))
664
665 # It's still safe to pass these strings to routines that
666 # call intern internally, e.g. PyObject_SetAttr().
667 s = S("abc")
668 setattr(s, s, s)
669 self.assertEqual(getattr(s, s), s)
670
Walter Dörwald919497e2003-01-19 16:23:59 +0000671 def test_iter(self):
672 self.assertRaises(TypeError, iter)
673 self.assertRaises(TypeError, iter, 42, 42)
674 lists = [("1", "2"), ["1", "2"], "12"]
675 if have_unicode:
676 lists.append(unicode("12"))
677 for l in lists:
678 i = iter(l)
679 self.assertEqual(i.next(), '1')
680 self.assertEqual(i.next(), '2')
681 self.assertRaises(StopIteration, i.next)
682
683 def test_isinstance(self):
684 class C:
685 pass
686 class D(C):
687 pass
688 class E:
689 pass
690 c = C()
691 d = D()
692 e = E()
693 self.assert_(isinstance(c, C))
694 self.assert_(isinstance(d, C))
695 self.assert_(not isinstance(e, C))
696 self.assert_(not isinstance(c, D))
697 self.assert_(not isinstance('foo', E))
698 self.assertRaises(TypeError, isinstance, E, 'foo')
699 self.assertRaises(TypeError, isinstance)
700
701 def test_issubclass(self):
702 class C:
703 pass
704 class D(C):
705 pass
706 class E:
707 pass
708 c = C()
709 d = D()
710 e = E()
711 self.assert_(issubclass(D, C))
712 self.assert_(issubclass(C, C))
713 self.assert_(not issubclass(C, D))
714 self.assertRaises(TypeError, issubclass, 'foo', E)
715 self.assertRaises(TypeError, issubclass, E, 'foo')
716 self.assertRaises(TypeError, issubclass)
717
718 def test_len(self):
719 self.assertEqual(len('123'), 3)
720 self.assertEqual(len(()), 0)
721 self.assertEqual(len((1, 2, 3, 4)), 4)
722 self.assertEqual(len([1, 2, 3, 4]), 4)
723 self.assertEqual(len({}), 0)
724 self.assertEqual(len({'a':1, 'b': 2}), 2)
725 class BadSeq:
726 def __len__(self):
727 raise ValueError
728 self.assertRaises(ValueError, len, BadSeq())
729
Walter Dörwald919497e2003-01-19 16:23:59 +0000730 def test_map(self):
731 self.assertEqual(
732 map(None, 'hello world'),
733 ['h','e','l','l','o',' ','w','o','r','l','d']
734 )
735 self.assertEqual(
736 map(None, 'abcd', 'efg'),
737 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
738 )
739 self.assertEqual(
740 map(None, range(10)),
741 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
742 )
743 self.assertEqual(
744 map(lambda x: x*x, range(1,4)),
745 [1, 4, 9]
746 )
747 try:
748 from math import sqrt
749 except ImportError:
750 def sqrt(x):
751 return pow(x, 0.5)
752 self.assertEqual(
753 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
754 [[4.0, 2.0], [9.0, 3.0]]
755 )
756 self.assertEqual(
757 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
758 [10, 4, 6]
759 )
760
761 def plus(*v):
762 accu = 0
763 for i in v: accu = accu + i
764 return accu
765 self.assertEqual(
766 map(plus, [1, 3, 7]),
767 [1, 3, 7]
768 )
769 self.assertEqual(
770 map(plus, [1, 3, 7], [4, 9, 2]),
771 [1+4, 3+9, 7+2]
772 )
773 self.assertEqual(
774 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
775 [1+4+1, 3+9+1, 7+2+0]
776 )
777 self.assertEqual(
778 map(None, Squares(10)),
779 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
780 )
781 self.assertEqual(
782 map(int, Squares(10)),
783 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
784 )
785 self.assertEqual(
786 map(None, Squares(3), Squares(2)),
787 [(0,0), (1,1), (4,None)]
788 )
789 self.assertEqual(
790 map(max, Squares(3), Squares(2)),
791 [0, 1, 4]
792 )
793 self.assertRaises(TypeError, map)
794 self.assertRaises(TypeError, map, lambda x: x, 42)
795 self.assertEqual(map(None, [42]), [42])
796 class BadSeq:
797 def __getitem__(self, index):
798 raise ValueError
799 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000800 def badfunc(x):
801 raise RuntimeError
802 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000803
804 def test_max(self):
805 self.assertEqual(max('123123'), '3')
806 self.assertEqual(max(1, 2, 3), 3)
807 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
808 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
809
810 self.assertEqual(max(1, 2L, 3.0), 3.0)
811 self.assertEqual(max(1L, 2.0, 3), 3)
812 self.assertEqual(max(1.0, 2, 3L), 3L)
813
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000814 for stmt in (
815 "max(key=int)", # no args
816 "max(1, key=int)", # single arg not iterable
817 "max(1, 2, keystone=int)", # wrong keyword
818 "max(1, 2, key=int, abc=int)", # two many keywords
819 "max(1, 2, key=1)", # keyfunc is not callable
820 ):
Tim Peters7f061872004-12-07 21:17:46 +0000821 try:
822 exec(stmt) in globals()
823 except TypeError:
824 pass
825 else:
826 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000827
828 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
829 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
830 self.assertEqual(max(1, 2, key=neg), 1) # two elems
831
832 data = [random.randrange(200) for i in range(100)]
833 keys = dict((elem, random.randrange(50)) for elem in data)
834 f = keys.__getitem__
835 self.assertEqual(max(data, key=f),
836 sorted(reversed(data), key=f)[-1])
837
Walter Dörwald919497e2003-01-19 16:23:59 +0000838 def test_min(self):
839 self.assertEqual(min('123123'), '1')
840 self.assertEqual(min(1, 2, 3), 1)
841 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
842 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
843
844 self.assertEqual(min(1, 2L, 3.0), 1)
845 self.assertEqual(min(1L, 2.0, 3), 1L)
846 self.assertEqual(min(1.0, 2, 3L), 1.0)
847
848 self.assertRaises(TypeError, min)
849 self.assertRaises(TypeError, min, 42)
850 self.assertRaises(ValueError, min, ())
851 class BadSeq:
852 def __getitem__(self, index):
853 raise ValueError
854 self.assertRaises(ValueError, min, BadSeq())
855 class BadNumber:
856 def __cmp__(self, other):
857 raise ValueError
858 self.assertRaises(ValueError, min, (42, BadNumber()))
859
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000860 for stmt in (
861 "min(key=int)", # no args
862 "min(1, key=int)", # single arg not iterable
863 "min(1, 2, keystone=int)", # wrong keyword
864 "min(1, 2, key=int, abc=int)", # two many keywords
865 "min(1, 2, key=1)", # keyfunc is not callable
866 ):
Tim Peters7f061872004-12-07 21:17:46 +0000867 try:
868 exec(stmt) in globals()
869 except TypeError:
870 pass
871 else:
872 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000873
874 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
875 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
876 self.assertEqual(min(1, 2, key=neg), 2) # two elems
877
878 data = [random.randrange(200) for i in range(100)]
879 keys = dict((elem, random.randrange(50)) for elem in data)
880 f = keys.__getitem__
881 self.assertEqual(min(data, key=f),
882 sorted(data, key=f)[0])
883
Georg Brandl28e08732008-04-30 19:47:09 +0000884 def test_next(self):
885 it = iter(range(2))
886 self.assertEqual(next(it), 0)
887 self.assertEqual(next(it), 1)
888 self.assertRaises(StopIteration, next, it)
889 self.assertRaises(StopIteration, next, it)
890 self.assertEquals(next(it, 42), 42)
891
892 class Iter(object):
893 def __iter__(self):
894 return self
895 def next(self):
896 raise StopIteration
897
898 it = iter(Iter())
899 self.assertEquals(next(it, 42), 42)
900 self.assertRaises(StopIteration, next, it)
901
902 def gen():
903 yield 1
904 return
905
906 it = gen()
907 self.assertEquals(next(it), 1)
908 self.assertRaises(StopIteration, next, it)
909 self.assertEquals(next(it, 42), 42)
910
Walter Dörwald919497e2003-01-19 16:23:59 +0000911 def test_oct(self):
912 self.assertEqual(oct(100), '0144')
913 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000914 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000915 self.assertEqual(oct(-100L), '-0144L')
916 self.assertRaises(TypeError, oct, ())
917
918 def write_testfile(self):
919 # NB the first 4 lines are also used to test input and raw_input, below
920 fp = open(TESTFN, 'w')
921 try:
922 fp.write('1+1\n')
923 fp.write('1+1\n')
924 fp.write('The quick brown fox jumps over the lazy dog')
925 fp.write('.\n')
926 fp.write('Dear John\n')
927 fp.write('XXX'*100)
928 fp.write('YYY'*100)
929 finally:
930 fp.close()
931
932 def test_open(self):
933 self.write_testfile()
934 fp = open(TESTFN, 'r')
935 try:
936 self.assertEqual(fp.readline(4), '1+1\n')
937 self.assertEqual(fp.readline(4), '1+1\n')
938 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
939 self.assertEqual(fp.readline(4), 'Dear')
940 self.assertEqual(fp.readline(100), ' John\n')
941 self.assertEqual(fp.read(300), 'XXX'*100)
942 self.assertEqual(fp.read(1000), 'YYY'*100)
943 finally:
944 fp.close()
945 unlink(TESTFN)
946
947 def test_ord(self):
948 self.assertEqual(ord(' '), 32)
949 self.assertEqual(ord('A'), 65)
950 self.assertEqual(ord('a'), 97)
951 if have_unicode:
952 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
953 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000954 if have_unicode:
955 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000956
957 def test_pow(self):
958 self.assertEqual(pow(0,0), 1)
959 self.assertEqual(pow(0,1), 0)
960 self.assertEqual(pow(1,0), 1)
961 self.assertEqual(pow(1,1), 1)
962
963 self.assertEqual(pow(2,0), 1)
964 self.assertEqual(pow(2,10), 1024)
965 self.assertEqual(pow(2,20), 1024*1024)
966 self.assertEqual(pow(2,30), 1024*1024*1024)
967
968 self.assertEqual(pow(-2,0), 1)
969 self.assertEqual(pow(-2,1), -2)
970 self.assertEqual(pow(-2,2), 4)
971 self.assertEqual(pow(-2,3), -8)
972
973 self.assertEqual(pow(0L,0), 1)
974 self.assertEqual(pow(0L,1), 0)
975 self.assertEqual(pow(1L,0), 1)
976 self.assertEqual(pow(1L,1), 1)
977
978 self.assertEqual(pow(2L,0), 1)
979 self.assertEqual(pow(2L,10), 1024)
980 self.assertEqual(pow(2L,20), 1024*1024)
981 self.assertEqual(pow(2L,30), 1024*1024*1024)
982
983 self.assertEqual(pow(-2L,0), 1)
984 self.assertEqual(pow(-2L,1), -2)
985 self.assertEqual(pow(-2L,2), 4)
986 self.assertEqual(pow(-2L,3), -8)
987
988 self.assertAlmostEqual(pow(0.,0), 1.)
989 self.assertAlmostEqual(pow(0.,1), 0.)
990 self.assertAlmostEqual(pow(1.,0), 1.)
991 self.assertAlmostEqual(pow(1.,1), 1.)
992
993 self.assertAlmostEqual(pow(2.,0), 1.)
994 self.assertAlmostEqual(pow(2.,10), 1024.)
995 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
996 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
997
998 self.assertAlmostEqual(pow(-2.,0), 1.)
999 self.assertAlmostEqual(pow(-2.,1), -2.)
1000 self.assertAlmostEqual(pow(-2.,2), 4.)
1001 self.assertAlmostEqual(pow(-2.,3), -8.)
1002
1003 for x in 2, 2L, 2.0:
1004 for y in 10, 10L, 10.0:
1005 for z in 1000, 1000L, 1000.0:
1006 if isinstance(x, float) or \
1007 isinstance(y, float) or \
1008 isinstance(z, float):
1009 self.assertRaises(TypeError, pow, x, y, z)
1010 else:
1011 self.assertAlmostEqual(pow(x, y, z), 24.0)
1012
1013 self.assertRaises(TypeError, pow, -1, -2, 3)
1014 self.assertRaises(ValueError, pow, 1, 2, 0)
1015 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1016 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001017 # Will return complex in 3.0:
1018 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001019
1020 self.assertRaises(TypeError, pow)
1021
1022 def test_range(self):
1023 self.assertEqual(range(3), [0, 1, 2])
1024 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1025 self.assertEqual(range(0), [])
1026 self.assertEqual(range(-3), [])
1027 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1028 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1029
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001030 # Now test range() with longs
1031 self.assertEqual(range(-2**100), [])
1032 self.assertEqual(range(0, -2**100), [])
1033 self.assertEqual(range(0, 2**100, -1), [])
1034 self.assertEqual(range(0, 2**100, -1), [])
1035
1036 a = long(10 * sys.maxint)
1037 b = long(100 * sys.maxint)
1038 c = long(50 * sys.maxint)
1039
1040 self.assertEqual(range(a, a+2), [a, a+1])
1041 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1042 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1043
1044 seq = range(a, b, c)
1045 self.assert_(a in seq)
1046 self.assert_(b not in seq)
1047 self.assertEqual(len(seq), 2)
1048
1049 seq = range(b, a, -c)
1050 self.assert_(b in seq)
1051 self.assert_(a not in seq)
1052 self.assertEqual(len(seq), 2)
1053
1054 seq = range(-a, -b, -c)
1055 self.assert_(-a in seq)
1056 self.assert_(-b not in seq)
1057 self.assertEqual(len(seq), 2)
1058
Walter Dörwald919497e2003-01-19 16:23:59 +00001059 self.assertRaises(TypeError, range)
1060 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1061 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001062 self.assertRaises(ValueError, range, a, a + 1, long(0))
1063
1064 class badzero(int):
1065 def __cmp__(self, other):
1066 raise RuntimeError
1067 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001068
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001069 # Reject floats when it would require PyLongs to represent.
1070 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001071 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001072
Walter Dörwald357981e2003-04-15 18:59:28 +00001073 self.assertRaises(TypeError, range, 0, "spam")
1074 self.assertRaises(TypeError, range, 0, 42, "spam")
1075
1076 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1077 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1078
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 def test_input_and_raw_input(self):
1080 self.write_testfile()
1081 fp = open(TESTFN, 'r')
1082 savestdin = sys.stdin
1083 savestdout = sys.stdout # Eats the echo
1084 try:
1085 sys.stdin = fp
1086 sys.stdout = BitBucket()
1087 self.assertEqual(input(), 2)
1088 self.assertEqual(input('testing\n'), 2)
1089 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1090 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001091
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001092 # SF 1535165: don't segfault on closed stdin
1093 # sys.stdout must be a regular file for triggering
1094 sys.stdout = savestdout
1095 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001096 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001097
1098 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001099 sys.stdin = cStringIO.StringIO("NULL\0")
1100 self.assertRaises(TypeError, input, 42, 42)
1101 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1102 self.assertEqual(input(), 'whitespace')
1103 sys.stdin = cStringIO.StringIO()
1104 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001105
1106 # SF 876178: make sure input() respect future options.
1107 sys.stdin = cStringIO.StringIO('1/2')
1108 sys.stdout = cStringIO.StringIO()
1109 exec compile('print input()', 'test_builtin_tmp', 'exec')
1110 sys.stdin.seek(0, 0)
1111 exec compile('from __future__ import division;print input()',
1112 'test_builtin_tmp', 'exec')
1113 sys.stdin.seek(0, 0)
1114 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001115 # The result we expect depends on whether new division semantics
1116 # are already in effect.
1117 if 1/2 == 0:
1118 # This test was compiled with old semantics.
1119 expected = ['0', '0.5', '0']
1120 else:
1121 # This test was compiled with new semantics (e.g., -Qnew
1122 # was given on the command line.
1123 expected = ['0.5', '0.5', '0.5']
1124 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001125
Walter Dörwald919497e2003-01-19 16:23:59 +00001126 del sys.stdout
1127 self.assertRaises(RuntimeError, input, 'prompt')
1128 del sys.stdin
1129 self.assertRaises(RuntimeError, input, 'prompt')
1130 finally:
1131 sys.stdin = savestdin
1132 sys.stdout = savestdout
1133 fp.close()
1134 unlink(TESTFN)
1135
1136 def test_reduce(self):
1137 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1138 self.assertEqual(
1139 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1140 ['a','c','d','w']
1141 )
1142 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1143 self.assertEqual(
1144 reduce(lambda x, y: x*y, range(2,21), 1L),
1145 2432902008176640000L
1146 )
1147 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1148 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1149 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1150 self.assertRaises(TypeError, reduce)
1151 self.assertRaises(TypeError, reduce, 42, 42)
1152 self.assertRaises(TypeError, reduce, 42, 42, 42)
1153 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1154 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1155 self.assertRaises(TypeError, reduce, 42, (42, 42))
1156
1157 class BadSeq:
1158 def __getitem__(self, index):
1159 raise ValueError
1160 self.assertRaises(ValueError, reduce, 42, BadSeq())
1161
1162 def test_reload(self):
1163 import marshal
1164 reload(marshal)
1165 import string
1166 reload(string)
1167 ## import sys
1168 ## self.assertRaises(ImportError, reload, sys)
1169
1170 def test_repr(self):
1171 self.assertEqual(repr(''), '\'\'')
1172 self.assertEqual(repr(0), '0')
1173 self.assertEqual(repr(0L), '0L')
1174 self.assertEqual(repr(()), '()')
1175 self.assertEqual(repr([]), '[]')
1176 self.assertEqual(repr({}), '{}')
1177 a = []
1178 a.append(a)
1179 self.assertEqual(repr(a), '[[...]]')
1180 a = {}
1181 a[0] = a
1182 self.assertEqual(repr(a), '{0: {...}}')
1183
1184 def test_round(self):
1185 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001186 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001187 self.assertEqual(round(1.0), 1.0)
1188 self.assertEqual(round(10.0), 10.0)
1189 self.assertEqual(round(1000000000.0), 1000000000.0)
1190 self.assertEqual(round(1e20), 1e20)
1191
1192 self.assertEqual(round(-1.0), -1.0)
1193 self.assertEqual(round(-10.0), -10.0)
1194 self.assertEqual(round(-1000000000.0), -1000000000.0)
1195 self.assertEqual(round(-1e20), -1e20)
1196
1197 self.assertEqual(round(0.1), 0.0)
1198 self.assertEqual(round(1.1), 1.0)
1199 self.assertEqual(round(10.1), 10.0)
1200 self.assertEqual(round(1000000000.1), 1000000000.0)
1201
1202 self.assertEqual(round(-1.1), -1.0)
1203 self.assertEqual(round(-10.1), -10.0)
1204 self.assertEqual(round(-1000000000.1), -1000000000.0)
1205
1206 self.assertEqual(round(0.9), 1.0)
1207 self.assertEqual(round(9.9), 10.0)
1208 self.assertEqual(round(999999999.9), 1000000000.0)
1209
1210 self.assertEqual(round(-0.9), -1.0)
1211 self.assertEqual(round(-9.9), -10.0)
1212 self.assertEqual(round(-999999999.9), -1000000000.0)
1213
1214 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001215 self.assertEqual(type(round(-8.0, -1)), float)
1216
1217 self.assertEqual(type(round(-8.0, 0)), float)
1218 self.assertEqual(type(round(-8.0, 1)), float)
1219
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001220 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001221 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001222 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001223 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001224 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001225
1226 # Check behavior on ints
1227 self.assertEqual(round(0), 0)
1228 self.assertEqual(round(8), 8)
1229 self.assertEqual(round(-8), -8)
1230 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1231 self.assertEqual(type(round(-8, -1)), float)
1232 self.assertEqual(type(round(-8, 0)), float)
1233 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001234
Georg Brandlccadf842006-03-31 18:54:53 +00001235 # test new kwargs
1236 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1237
Walter Dörwald919497e2003-01-19 16:23:59 +00001238 self.assertRaises(TypeError, round)
1239
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001240 # test generic rounding delegation for reals
1241 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001242 def __float__(self):
1243 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001244
1245 class TestNoRound(object):
1246 pass
1247
1248 self.assertEqual(round(TestRound()), 23)
1249
1250 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001251 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001252
1253 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001254 t.__float__ = lambda *args: args
1255 self.assertRaises(TypeError, round, t)
1256 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001257
Walter Dörwald919497e2003-01-19 16:23:59 +00001258 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001259 setattr(sys, 'spam', 1)
1260 self.assertEqual(sys.spam, 1)
1261 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1262 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001263
Alex Martellia70b1912003-04-22 08:12:33 +00001264 def test_sum(self):
1265 self.assertEqual(sum([]), 0)
1266 self.assertEqual(sum(range(2,8)), 27)
1267 self.assertEqual(sum(iter(range(2,8))), 27)
1268 self.assertEqual(sum(Squares(10)), 285)
1269 self.assertEqual(sum(iter(Squares(10))), 285)
1270 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1271
1272 self.assertRaises(TypeError, sum)
1273 self.assertRaises(TypeError, sum, 42)
1274 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1275 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1276 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1277 self.assertRaises(TypeError, sum, [{2:3}])
1278 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1279
1280 class BadSeq:
1281 def __getitem__(self, index):
1282 raise ValueError
1283 self.assertRaises(ValueError, sum, BadSeq())
1284
Walter Dörwald919497e2003-01-19 16:23:59 +00001285 def test_type(self):
1286 self.assertEqual(type(''), type('123'))
1287 self.assertNotEqual(type(''), type(()))
1288
1289 def test_unichr(self):
1290 if have_unicode:
1291 self.assertEqual(unichr(32), unicode(' '))
1292 self.assertEqual(unichr(65), unicode('A'))
1293 self.assertEqual(unichr(97), unicode('a'))
1294 self.assertEqual(
1295 unichr(sys.maxunicode),
1296 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1297 )
1298 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1299 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001300 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001301
Guido van Rossumfee7b932005-01-16 00:21:28 +00001302 # We don't want self in vars(), so these are static methods
1303
1304 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001305 def get_vars_f0():
1306 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001307
Guido van Rossumfee7b932005-01-16 00:21:28 +00001308 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001309 def get_vars_f2():
1310 BuiltinTest.get_vars_f0()
1311 a = 1
1312 b = 2
1313 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001314
1315 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001316 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001317 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001318 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001319 self.assertEqual(self.get_vars_f0(), {})
1320 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1321 self.assertRaises(TypeError, vars, 42, 42)
1322 self.assertRaises(TypeError, vars, 42)
1323
1324 def test_zip(self):
1325 a = (1, 2, 3)
1326 b = (4, 5, 6)
1327 t = [(1, 4), (2, 5), (3, 6)]
1328 self.assertEqual(zip(a, b), t)
1329 b = [4, 5, 6]
1330 self.assertEqual(zip(a, b), t)
1331 b = (4, 5, 6, 7)
1332 self.assertEqual(zip(a, b), t)
1333 class I:
1334 def __getitem__(self, i):
1335 if i < 0 or i > 2: raise IndexError
1336 return i + 4
1337 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001338 self.assertEqual(zip(), [])
1339 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001340 self.assertRaises(TypeError, zip, None)
1341 class G:
1342 pass
1343 self.assertRaises(TypeError, zip, a, G())
1344
1345 # Make sure zip doesn't try to allocate a billion elements for the
1346 # result list when one of its arguments doesn't say how long it is.
1347 # A MemoryError is the most likely failure mode.
1348 class SequenceWithoutALength:
1349 def __getitem__(self, i):
1350 if i == 5:
1351 raise IndexError
1352 else:
1353 return i
1354 self.assertEqual(
1355 zip(SequenceWithoutALength(), xrange(2**30)),
1356 list(enumerate(range(5)))
1357 )
1358
1359 class BadSeq:
1360 def __getitem__(self, i):
1361 if i == 5:
1362 raise ValueError
1363 else:
1364 return i
1365 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1366
Eric Smitha9f7d622008-02-17 19:46:49 +00001367 def test_format(self):
1368 # Test the basic machinery of the format() builtin. Don't test
1369 # the specifics of the various formatters
1370 self.assertEqual(format(3, ''), '3')
1371
1372 # Returns some classes to use for various tests. There's
1373 # an old-style version, and a new-style version
1374 def classes_new():
1375 class A(object):
1376 def __init__(self, x):
1377 self.x = x
1378 def __format__(self, format_spec):
1379 return str(self.x) + format_spec
1380 class DerivedFromA(A):
1381 pass
1382
1383 class Simple(object): pass
1384 class DerivedFromSimple(Simple):
1385 def __init__(self, x):
1386 self.x = x
1387 def __format__(self, format_spec):
1388 return str(self.x) + format_spec
1389 class DerivedFromSimple2(DerivedFromSimple): pass
1390 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1391
1392 # In 3.0, classes_classic has the same meaning as classes_new
1393 def classes_classic():
1394 class A:
1395 def __init__(self, x):
1396 self.x = x
1397 def __format__(self, format_spec):
1398 return str(self.x) + format_spec
1399 class DerivedFromA(A):
1400 pass
1401
1402 class Simple: pass
1403 class DerivedFromSimple(Simple):
1404 def __init__(self, x):
1405 self.x = x
1406 def __format__(self, format_spec):
1407 return str(self.x) + format_spec
1408 class DerivedFromSimple2(DerivedFromSimple): pass
1409 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1410
1411 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1412 self.assertEqual(format(A(3), 'spec'), '3spec')
1413 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1414 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1415 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1416 '10abcdef')
1417
1418 class_test(*classes_new())
1419 class_test(*classes_classic())
1420
1421 def empty_format_spec(value):
1422 # test that:
1423 # format(x, '') == str(x)
1424 # format(x) == str(x)
1425 self.assertEqual(format(value, ""), str(value))
1426 self.assertEqual(format(value), str(value))
1427
1428 # for builtin types, format(x, "") == str(x)
1429 empty_format_spec(17**13)
1430 empty_format_spec(1.0)
1431 empty_format_spec(3.1415e104)
1432 empty_format_spec(-3.1415e104)
1433 empty_format_spec(3.1415e-104)
1434 empty_format_spec(-3.1415e-104)
1435 empty_format_spec(object)
1436 empty_format_spec(None)
1437
1438 # TypeError because self.__format__ returns the wrong type
1439 class BadFormatResult:
1440 def __format__(self, format_spec):
1441 return 1.0
1442 self.assertRaises(TypeError, format, BadFormatResult(), "")
1443
1444 # TypeError because format_spec is not unicode or str
1445 self.assertRaises(TypeError, format, object(), 4)
1446 self.assertRaises(TypeError, format, object(), object())
1447
1448 # tests for object.__format__ really belong elsewhere, but
1449 # there's no good place to put them
1450 x = object().__format__('')
1451 self.assert_(x.startswith('<object object at'))
1452
1453 # first argument to object.__format__ must be string
1454 self.assertRaises(TypeError, object().__format__, 3)
1455 self.assertRaises(TypeError, object().__format__, object())
1456 self.assertRaises(TypeError, object().__format__, None)
1457
1458 # make sure we can take a subclass of str as a format spec
1459 class DerivedFromStr(str): pass
1460 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1461
Eric Smithfb0742f2008-02-22 17:43:17 +00001462 def test_bin(self):
1463 self.assertEqual(bin(0), '0b0')
1464 self.assertEqual(bin(1), '0b1')
1465 self.assertEqual(bin(-1), '-0b1')
1466 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1467 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1468 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1469 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1470
Eric Smithce584d42008-02-21 20:17:08 +00001471class TestSorted(unittest.TestCase):
1472
1473 def test_basic(self):
1474 data = range(100)
1475 copy = data[:]
1476 random.shuffle(copy)
1477 self.assertEqual(data, sorted(copy))
1478 self.assertNotEqual(data, copy)
1479
1480 data.reverse()
1481 random.shuffle(copy)
1482 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1483 self.assertNotEqual(data, copy)
1484 random.shuffle(copy)
1485 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1486 self.assertNotEqual(data, copy)
1487 random.shuffle(copy)
1488 self.assertEqual(data, sorted(copy, reverse=1))
1489 self.assertNotEqual(data, copy)
1490
1491 def test_inputtypes(self):
1492 s = 'abracadabra'
1493 types = [list, tuple]
1494 if have_unicode:
1495 types.insert(0, unicode)
1496 for T in types:
1497 self.assertEqual(sorted(s), sorted(T(s)))
1498
1499 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1500 types = [set, frozenset, list, tuple, dict.fromkeys]
1501 if have_unicode:
1502 types.insert(0, unicode)
1503 for T in types:
1504 self.assertEqual(sorted(s), sorted(T(s)))
1505
1506 def test_baddecorator(self):
1507 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1508 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1509
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001510def test_main(verbose=None):
1511 test_classes = (BuiltinTest, TestSorted)
1512
1513 run_unittest(*test_classes)
1514
1515 # verify reference counting
1516 if verbose and hasattr(sys, "gettotalrefcount"):
1517 import gc
1518 counts = [None] * 5
1519 for i in xrange(len(counts)):
1520 run_unittest(*test_classes)
1521 gc.collect()
1522 counts[i] = sys.gettotalrefcount()
1523 print counts
1524
Walter Dörwald919497e2003-01-19 16:23:59 +00001525
1526if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001527 test_main(verbose=True)