blob: 1e559eb9ba83bd8088c4463fe752d8a9ac87d373 [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
593 def test_hash(self):
594 hash(None)
595 self.assertEqual(hash(1), hash(1L))
596 self.assertEqual(hash(1), hash(1.0))
597 hash('spam')
598 if have_unicode:
599 self.assertEqual(hash('spam'), hash(unicode('spam')))
600 hash((0,1,2,3))
601 def f(): pass
602 self.assertRaises(TypeError, hash, [])
603 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000604 # Bug 1536021: Allow hash to return long objects
605 class X:
606 def __hash__(self):
607 return 2**100
608 self.assertEquals(type(hash(X())), int)
609 class Y(object):
610 def __hash__(self):
611 return 2**100
612 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000613 class Z(long):
614 def __hash__(self):
615 return self
616 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000617
618 def test_hex(self):
619 self.assertEqual(hex(16), '0x10')
620 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000621 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 self.assertEqual(hex(-16L), '-0x10L')
623 self.assertRaises(TypeError, hex, {})
624
625 def test_id(self):
626 id(None)
627 id(1)
628 id(1L)
629 id(1.0)
630 id('spam')
631 id((0,1,2,3))
632 id([0,1,2,3])
633 id({'spam': 1, 'eggs': 2, 'ham': 3})
634
635 # Test input() later, together with raw_input
636
Walter Dörwald919497e2003-01-19 16:23:59 +0000637 def test_intern(self):
638 self.assertRaises(TypeError, intern)
639 s = "never interned before"
640 self.assert_(intern(s) is s)
641 s2 = s.swapcase().swapcase()
642 self.assert_(intern(s2) is s)
643
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000644 # Subclasses of string can't be interned, because they
645 # provide too much opportunity for insane things to happen.
646 # We don't want them in the interned dict and if they aren't
647 # actually interned, we don't want to create the appearance
648 # that they are by allowing intern() to succeeed.
649 class S(str):
650 def __hash__(self):
651 return 123
652
653 self.assertRaises(TypeError, intern, S("abc"))
654
655 # It's still safe to pass these strings to routines that
656 # call intern internally, e.g. PyObject_SetAttr().
657 s = S("abc")
658 setattr(s, s, s)
659 self.assertEqual(getattr(s, s), s)
660
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 def test_iter(self):
662 self.assertRaises(TypeError, iter)
663 self.assertRaises(TypeError, iter, 42, 42)
664 lists = [("1", "2"), ["1", "2"], "12"]
665 if have_unicode:
666 lists.append(unicode("12"))
667 for l in lists:
668 i = iter(l)
669 self.assertEqual(i.next(), '1')
670 self.assertEqual(i.next(), '2')
671 self.assertRaises(StopIteration, i.next)
672
673 def test_isinstance(self):
674 class C:
675 pass
676 class D(C):
677 pass
678 class E:
679 pass
680 c = C()
681 d = D()
682 e = E()
683 self.assert_(isinstance(c, C))
684 self.assert_(isinstance(d, C))
685 self.assert_(not isinstance(e, C))
686 self.assert_(not isinstance(c, D))
687 self.assert_(not isinstance('foo', E))
688 self.assertRaises(TypeError, isinstance, E, 'foo')
689 self.assertRaises(TypeError, isinstance)
690
691 def test_issubclass(self):
692 class C:
693 pass
694 class D(C):
695 pass
696 class E:
697 pass
698 c = C()
699 d = D()
700 e = E()
701 self.assert_(issubclass(D, C))
702 self.assert_(issubclass(C, C))
703 self.assert_(not issubclass(C, D))
704 self.assertRaises(TypeError, issubclass, 'foo', E)
705 self.assertRaises(TypeError, issubclass, E, 'foo')
706 self.assertRaises(TypeError, issubclass)
707
708 def test_len(self):
709 self.assertEqual(len('123'), 3)
710 self.assertEqual(len(()), 0)
711 self.assertEqual(len((1, 2, 3, 4)), 4)
712 self.assertEqual(len([1, 2, 3, 4]), 4)
713 self.assertEqual(len({}), 0)
714 self.assertEqual(len({'a':1, 'b': 2}), 2)
715 class BadSeq:
716 def __len__(self):
717 raise ValueError
718 self.assertRaises(ValueError, len, BadSeq())
719
Walter Dörwald919497e2003-01-19 16:23:59 +0000720 def test_map(self):
721 self.assertEqual(
722 map(None, 'hello world'),
723 ['h','e','l','l','o',' ','w','o','r','l','d']
724 )
725 self.assertEqual(
726 map(None, 'abcd', 'efg'),
727 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
728 )
729 self.assertEqual(
730 map(None, range(10)),
731 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
732 )
733 self.assertEqual(
734 map(lambda x: x*x, range(1,4)),
735 [1, 4, 9]
736 )
737 try:
738 from math import sqrt
739 except ImportError:
740 def sqrt(x):
741 return pow(x, 0.5)
742 self.assertEqual(
743 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
744 [[4.0, 2.0], [9.0, 3.0]]
745 )
746 self.assertEqual(
747 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
748 [10, 4, 6]
749 )
750
751 def plus(*v):
752 accu = 0
753 for i in v: accu = accu + i
754 return accu
755 self.assertEqual(
756 map(plus, [1, 3, 7]),
757 [1, 3, 7]
758 )
759 self.assertEqual(
760 map(plus, [1, 3, 7], [4, 9, 2]),
761 [1+4, 3+9, 7+2]
762 )
763 self.assertEqual(
764 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
765 [1+4+1, 3+9+1, 7+2+0]
766 )
767 self.assertEqual(
768 map(None, Squares(10)),
769 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
770 )
771 self.assertEqual(
772 map(int, Squares(10)),
773 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
774 )
775 self.assertEqual(
776 map(None, Squares(3), Squares(2)),
777 [(0,0), (1,1), (4,None)]
778 )
779 self.assertEqual(
780 map(max, Squares(3), Squares(2)),
781 [0, 1, 4]
782 )
783 self.assertRaises(TypeError, map)
784 self.assertRaises(TypeError, map, lambda x: x, 42)
785 self.assertEqual(map(None, [42]), [42])
786 class BadSeq:
787 def __getitem__(self, index):
788 raise ValueError
789 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000790 def badfunc(x):
791 raise RuntimeError
792 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000793
794 def test_max(self):
795 self.assertEqual(max('123123'), '3')
796 self.assertEqual(max(1, 2, 3), 3)
797 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
798 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
799
800 self.assertEqual(max(1, 2L, 3.0), 3.0)
801 self.assertEqual(max(1L, 2.0, 3), 3)
802 self.assertEqual(max(1.0, 2, 3L), 3L)
803
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000804 for stmt in (
805 "max(key=int)", # no args
806 "max(1, key=int)", # single arg not iterable
807 "max(1, 2, keystone=int)", # wrong keyword
808 "max(1, 2, key=int, abc=int)", # two many keywords
809 "max(1, 2, key=1)", # keyfunc is not callable
810 ):
Tim Peters7f061872004-12-07 21:17:46 +0000811 try:
812 exec(stmt) in globals()
813 except TypeError:
814 pass
815 else:
816 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000817
818 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
819 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
820 self.assertEqual(max(1, 2, key=neg), 1) # two elems
821
822 data = [random.randrange(200) for i in range(100)]
823 keys = dict((elem, random.randrange(50)) for elem in data)
824 f = keys.__getitem__
825 self.assertEqual(max(data, key=f),
826 sorted(reversed(data), key=f)[-1])
827
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 def test_min(self):
829 self.assertEqual(min('123123'), '1')
830 self.assertEqual(min(1, 2, 3), 1)
831 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
832 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
833
834 self.assertEqual(min(1, 2L, 3.0), 1)
835 self.assertEqual(min(1L, 2.0, 3), 1L)
836 self.assertEqual(min(1.0, 2, 3L), 1.0)
837
838 self.assertRaises(TypeError, min)
839 self.assertRaises(TypeError, min, 42)
840 self.assertRaises(ValueError, min, ())
841 class BadSeq:
842 def __getitem__(self, index):
843 raise ValueError
844 self.assertRaises(ValueError, min, BadSeq())
845 class BadNumber:
846 def __cmp__(self, other):
847 raise ValueError
848 self.assertRaises(ValueError, min, (42, BadNumber()))
849
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000850 for stmt in (
851 "min(key=int)", # no args
852 "min(1, key=int)", # single arg not iterable
853 "min(1, 2, keystone=int)", # wrong keyword
854 "min(1, 2, key=int, abc=int)", # two many keywords
855 "min(1, 2, key=1)", # keyfunc is not callable
856 ):
Tim Peters7f061872004-12-07 21:17:46 +0000857 try:
858 exec(stmt) in globals()
859 except TypeError:
860 pass
861 else:
862 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000863
864 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
865 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
866 self.assertEqual(min(1, 2, key=neg), 2) # two elems
867
868 data = [random.randrange(200) for i in range(100)]
869 keys = dict((elem, random.randrange(50)) for elem in data)
870 f = keys.__getitem__
871 self.assertEqual(min(data, key=f),
872 sorted(data, key=f)[0])
873
Georg Brandl28e08732008-04-30 19:47:09 +0000874 def test_next(self):
875 it = iter(range(2))
876 self.assertEqual(next(it), 0)
877 self.assertEqual(next(it), 1)
878 self.assertRaises(StopIteration, next, it)
879 self.assertRaises(StopIteration, next, it)
880 self.assertEquals(next(it, 42), 42)
881
882 class Iter(object):
883 def __iter__(self):
884 return self
885 def next(self):
886 raise StopIteration
887
888 it = iter(Iter())
889 self.assertEquals(next(it, 42), 42)
890 self.assertRaises(StopIteration, next, it)
891
892 def gen():
893 yield 1
894 return
895
896 it = gen()
897 self.assertEquals(next(it), 1)
898 self.assertRaises(StopIteration, next, it)
899 self.assertEquals(next(it, 42), 42)
900
Walter Dörwald919497e2003-01-19 16:23:59 +0000901 def test_oct(self):
902 self.assertEqual(oct(100), '0144')
903 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000904 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000905 self.assertEqual(oct(-100L), '-0144L')
906 self.assertRaises(TypeError, oct, ())
907
908 def write_testfile(self):
909 # NB the first 4 lines are also used to test input and raw_input, below
910 fp = open(TESTFN, 'w')
911 try:
912 fp.write('1+1\n')
913 fp.write('1+1\n')
914 fp.write('The quick brown fox jumps over the lazy dog')
915 fp.write('.\n')
916 fp.write('Dear John\n')
917 fp.write('XXX'*100)
918 fp.write('YYY'*100)
919 finally:
920 fp.close()
921
922 def test_open(self):
923 self.write_testfile()
924 fp = open(TESTFN, 'r')
925 try:
926 self.assertEqual(fp.readline(4), '1+1\n')
927 self.assertEqual(fp.readline(4), '1+1\n')
928 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
929 self.assertEqual(fp.readline(4), 'Dear')
930 self.assertEqual(fp.readline(100), ' John\n')
931 self.assertEqual(fp.read(300), 'XXX'*100)
932 self.assertEqual(fp.read(1000), 'YYY'*100)
933 finally:
934 fp.close()
935 unlink(TESTFN)
936
937 def test_ord(self):
938 self.assertEqual(ord(' '), 32)
939 self.assertEqual(ord('A'), 65)
940 self.assertEqual(ord('a'), 97)
941 if have_unicode:
942 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
943 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000944 if have_unicode:
945 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000946
947 def test_pow(self):
948 self.assertEqual(pow(0,0), 1)
949 self.assertEqual(pow(0,1), 0)
950 self.assertEqual(pow(1,0), 1)
951 self.assertEqual(pow(1,1), 1)
952
953 self.assertEqual(pow(2,0), 1)
954 self.assertEqual(pow(2,10), 1024)
955 self.assertEqual(pow(2,20), 1024*1024)
956 self.assertEqual(pow(2,30), 1024*1024*1024)
957
958 self.assertEqual(pow(-2,0), 1)
959 self.assertEqual(pow(-2,1), -2)
960 self.assertEqual(pow(-2,2), 4)
961 self.assertEqual(pow(-2,3), -8)
962
963 self.assertEqual(pow(0L,0), 1)
964 self.assertEqual(pow(0L,1), 0)
965 self.assertEqual(pow(1L,0), 1)
966 self.assertEqual(pow(1L,1), 1)
967
968 self.assertEqual(pow(2L,0), 1)
969 self.assertEqual(pow(2L,10), 1024)
970 self.assertEqual(pow(2L,20), 1024*1024)
971 self.assertEqual(pow(2L,30), 1024*1024*1024)
972
973 self.assertEqual(pow(-2L,0), 1)
974 self.assertEqual(pow(-2L,1), -2)
975 self.assertEqual(pow(-2L,2), 4)
976 self.assertEqual(pow(-2L,3), -8)
977
978 self.assertAlmostEqual(pow(0.,0), 1.)
979 self.assertAlmostEqual(pow(0.,1), 0.)
980 self.assertAlmostEqual(pow(1.,0), 1.)
981 self.assertAlmostEqual(pow(1.,1), 1.)
982
983 self.assertAlmostEqual(pow(2.,0), 1.)
984 self.assertAlmostEqual(pow(2.,10), 1024.)
985 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
986 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
987
988 self.assertAlmostEqual(pow(-2.,0), 1.)
989 self.assertAlmostEqual(pow(-2.,1), -2.)
990 self.assertAlmostEqual(pow(-2.,2), 4.)
991 self.assertAlmostEqual(pow(-2.,3), -8.)
992
993 for x in 2, 2L, 2.0:
994 for y in 10, 10L, 10.0:
995 for z in 1000, 1000L, 1000.0:
996 if isinstance(x, float) or \
997 isinstance(y, float) or \
998 isinstance(z, float):
999 self.assertRaises(TypeError, pow, x, y, z)
1000 else:
1001 self.assertAlmostEqual(pow(x, y, z), 24.0)
1002
1003 self.assertRaises(TypeError, pow, -1, -2, 3)
1004 self.assertRaises(ValueError, pow, 1, 2, 0)
1005 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1006 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001007 # Will return complex in 3.0:
1008 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001009
1010 self.assertRaises(TypeError, pow)
1011
1012 def test_range(self):
1013 self.assertEqual(range(3), [0, 1, 2])
1014 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1015 self.assertEqual(range(0), [])
1016 self.assertEqual(range(-3), [])
1017 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1018 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1019
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001020 # Now test range() with longs
1021 self.assertEqual(range(-2**100), [])
1022 self.assertEqual(range(0, -2**100), [])
1023 self.assertEqual(range(0, 2**100, -1), [])
1024 self.assertEqual(range(0, 2**100, -1), [])
1025
1026 a = long(10 * sys.maxint)
1027 b = long(100 * sys.maxint)
1028 c = long(50 * sys.maxint)
1029
1030 self.assertEqual(range(a, a+2), [a, a+1])
1031 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1032 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1033
1034 seq = range(a, b, c)
1035 self.assert_(a in seq)
1036 self.assert_(b not in seq)
1037 self.assertEqual(len(seq), 2)
1038
1039 seq = range(b, a, -c)
1040 self.assert_(b in seq)
1041 self.assert_(a not in seq)
1042 self.assertEqual(len(seq), 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
Walter Dörwald919497e2003-01-19 16:23:59 +00001049 self.assertRaises(TypeError, range)
1050 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1051 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001052 self.assertRaises(ValueError, range, a, a + 1, long(0))
1053
1054 class badzero(int):
1055 def __cmp__(self, other):
1056 raise RuntimeError
1057 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001058
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001059 # Reject floats when it would require PyLongs to represent.
1060 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001061 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001062
Walter Dörwald357981e2003-04-15 18:59:28 +00001063 self.assertRaises(TypeError, range, 0, "spam")
1064 self.assertRaises(TypeError, range, 0, 42, "spam")
1065
1066 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1067 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1068
Walter Dörwald919497e2003-01-19 16:23:59 +00001069 def test_input_and_raw_input(self):
1070 self.write_testfile()
1071 fp = open(TESTFN, 'r')
1072 savestdin = sys.stdin
1073 savestdout = sys.stdout # Eats the echo
1074 try:
1075 sys.stdin = fp
1076 sys.stdout = BitBucket()
1077 self.assertEqual(input(), 2)
1078 self.assertEqual(input('testing\n'), 2)
1079 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1080 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001081
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001082 # SF 1535165: don't segfault on closed stdin
1083 # sys.stdout must be a regular file for triggering
1084 sys.stdout = savestdout
1085 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001086 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001087
1088 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001089 sys.stdin = cStringIO.StringIO("NULL\0")
1090 self.assertRaises(TypeError, input, 42, 42)
1091 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1092 self.assertEqual(input(), 'whitespace')
1093 sys.stdin = cStringIO.StringIO()
1094 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001095
1096 # SF 876178: make sure input() respect future options.
1097 sys.stdin = cStringIO.StringIO('1/2')
1098 sys.stdout = cStringIO.StringIO()
1099 exec compile('print input()', 'test_builtin_tmp', 'exec')
1100 sys.stdin.seek(0, 0)
1101 exec compile('from __future__ import division;print input()',
1102 'test_builtin_tmp', 'exec')
1103 sys.stdin.seek(0, 0)
1104 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001105 # The result we expect depends on whether new division semantics
1106 # are already in effect.
1107 if 1/2 == 0:
1108 # This test was compiled with old semantics.
1109 expected = ['0', '0.5', '0']
1110 else:
1111 # This test was compiled with new semantics (e.g., -Qnew
1112 # was given on the command line.
1113 expected = ['0.5', '0.5', '0.5']
1114 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001115
Walter Dörwald919497e2003-01-19 16:23:59 +00001116 del sys.stdout
1117 self.assertRaises(RuntimeError, input, 'prompt')
1118 del sys.stdin
1119 self.assertRaises(RuntimeError, input, 'prompt')
1120 finally:
1121 sys.stdin = savestdin
1122 sys.stdout = savestdout
1123 fp.close()
1124 unlink(TESTFN)
1125
1126 def test_reduce(self):
1127 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1128 self.assertEqual(
1129 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1130 ['a','c','d','w']
1131 )
1132 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1133 self.assertEqual(
1134 reduce(lambda x, y: x*y, range(2,21), 1L),
1135 2432902008176640000L
1136 )
1137 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1138 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1139 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1140 self.assertRaises(TypeError, reduce)
1141 self.assertRaises(TypeError, reduce, 42, 42)
1142 self.assertRaises(TypeError, reduce, 42, 42, 42)
1143 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1144 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1145 self.assertRaises(TypeError, reduce, 42, (42, 42))
1146
1147 class BadSeq:
1148 def __getitem__(self, index):
1149 raise ValueError
1150 self.assertRaises(ValueError, reduce, 42, BadSeq())
1151
1152 def test_reload(self):
1153 import marshal
1154 reload(marshal)
1155 import string
1156 reload(string)
1157 ## import sys
1158 ## self.assertRaises(ImportError, reload, sys)
1159
1160 def test_repr(self):
1161 self.assertEqual(repr(''), '\'\'')
1162 self.assertEqual(repr(0), '0')
1163 self.assertEqual(repr(0L), '0L')
1164 self.assertEqual(repr(()), '()')
1165 self.assertEqual(repr([]), '[]')
1166 self.assertEqual(repr({}), '{}')
1167 a = []
1168 a.append(a)
1169 self.assertEqual(repr(a), '[[...]]')
1170 a = {}
1171 a[0] = a
1172 self.assertEqual(repr(a), '{0: {...}}')
1173
1174 def test_round(self):
1175 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001176 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001177 self.assertEqual(round(1.0), 1.0)
1178 self.assertEqual(round(10.0), 10.0)
1179 self.assertEqual(round(1000000000.0), 1000000000.0)
1180 self.assertEqual(round(1e20), 1e20)
1181
1182 self.assertEqual(round(-1.0), -1.0)
1183 self.assertEqual(round(-10.0), -10.0)
1184 self.assertEqual(round(-1000000000.0), -1000000000.0)
1185 self.assertEqual(round(-1e20), -1e20)
1186
1187 self.assertEqual(round(0.1), 0.0)
1188 self.assertEqual(round(1.1), 1.0)
1189 self.assertEqual(round(10.1), 10.0)
1190 self.assertEqual(round(1000000000.1), 1000000000.0)
1191
1192 self.assertEqual(round(-1.1), -1.0)
1193 self.assertEqual(round(-10.1), -10.0)
1194 self.assertEqual(round(-1000000000.1), -1000000000.0)
1195
1196 self.assertEqual(round(0.9), 1.0)
1197 self.assertEqual(round(9.9), 10.0)
1198 self.assertEqual(round(999999999.9), 1000000000.0)
1199
1200 self.assertEqual(round(-0.9), -1.0)
1201 self.assertEqual(round(-9.9), -10.0)
1202 self.assertEqual(round(-999999999.9), -1000000000.0)
1203
1204 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001205 self.assertEqual(type(round(-8.0, -1)), float)
1206
1207 self.assertEqual(type(round(-8.0, 0)), float)
1208 self.assertEqual(type(round(-8.0, 1)), float)
1209
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001210 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001211 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001212 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001213 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001214 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001215
1216 # Check behavior on ints
1217 self.assertEqual(round(0), 0)
1218 self.assertEqual(round(8), 8)
1219 self.assertEqual(round(-8), -8)
1220 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1221 self.assertEqual(type(round(-8, -1)), float)
1222 self.assertEqual(type(round(-8, 0)), float)
1223 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001224
Georg Brandlccadf842006-03-31 18:54:53 +00001225 # test new kwargs
1226 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1227
Walter Dörwald919497e2003-01-19 16:23:59 +00001228 self.assertRaises(TypeError, round)
1229
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001230 # test generic rounding delegation for reals
1231 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001232 def __float__(self):
1233 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001234
1235 class TestNoRound(object):
1236 pass
1237
1238 self.assertEqual(round(TestRound()), 23)
1239
1240 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001241 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001242
1243 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001244 t.__float__ = lambda *args: args
1245 self.assertRaises(TypeError, round, t)
1246 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001247
Walter Dörwald919497e2003-01-19 16:23:59 +00001248 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001249 setattr(sys, 'spam', 1)
1250 self.assertEqual(sys.spam, 1)
1251 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1252 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001253
Alex Martellia70b1912003-04-22 08:12:33 +00001254 def test_sum(self):
1255 self.assertEqual(sum([]), 0)
1256 self.assertEqual(sum(range(2,8)), 27)
1257 self.assertEqual(sum(iter(range(2,8))), 27)
1258 self.assertEqual(sum(Squares(10)), 285)
1259 self.assertEqual(sum(iter(Squares(10))), 285)
1260 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1261
1262 self.assertRaises(TypeError, sum)
1263 self.assertRaises(TypeError, sum, 42)
1264 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1265 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1266 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1267 self.assertRaises(TypeError, sum, [{2:3}])
1268 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1269
1270 class BadSeq:
1271 def __getitem__(self, index):
1272 raise ValueError
1273 self.assertRaises(ValueError, sum, BadSeq())
1274
Walter Dörwald919497e2003-01-19 16:23:59 +00001275 def test_type(self):
1276 self.assertEqual(type(''), type('123'))
1277 self.assertNotEqual(type(''), type(()))
1278
1279 def test_unichr(self):
1280 if have_unicode:
1281 self.assertEqual(unichr(32), unicode(' '))
1282 self.assertEqual(unichr(65), unicode('A'))
1283 self.assertEqual(unichr(97), unicode('a'))
1284 self.assertEqual(
1285 unichr(sys.maxunicode),
1286 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1287 )
1288 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1289 self.assertRaises(TypeError, unichr)
1290
Guido van Rossumfee7b932005-01-16 00:21:28 +00001291 # We don't want self in vars(), so these are static methods
1292
1293 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001294 def get_vars_f0():
1295 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001296
Guido van Rossumfee7b932005-01-16 00:21:28 +00001297 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001298 def get_vars_f2():
1299 BuiltinTest.get_vars_f0()
1300 a = 1
1301 b = 2
1302 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001303
1304 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001305 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001306 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001307 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001308 self.assertEqual(self.get_vars_f0(), {})
1309 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1310 self.assertRaises(TypeError, vars, 42, 42)
1311 self.assertRaises(TypeError, vars, 42)
1312
1313 def test_zip(self):
1314 a = (1, 2, 3)
1315 b = (4, 5, 6)
1316 t = [(1, 4), (2, 5), (3, 6)]
1317 self.assertEqual(zip(a, b), t)
1318 b = [4, 5, 6]
1319 self.assertEqual(zip(a, b), t)
1320 b = (4, 5, 6, 7)
1321 self.assertEqual(zip(a, b), t)
1322 class I:
1323 def __getitem__(self, i):
1324 if i < 0 or i > 2: raise IndexError
1325 return i + 4
1326 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001327 self.assertEqual(zip(), [])
1328 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001329 self.assertRaises(TypeError, zip, None)
1330 class G:
1331 pass
1332 self.assertRaises(TypeError, zip, a, G())
1333
1334 # Make sure zip doesn't try to allocate a billion elements for the
1335 # result list when one of its arguments doesn't say how long it is.
1336 # A MemoryError is the most likely failure mode.
1337 class SequenceWithoutALength:
1338 def __getitem__(self, i):
1339 if i == 5:
1340 raise IndexError
1341 else:
1342 return i
1343 self.assertEqual(
1344 zip(SequenceWithoutALength(), xrange(2**30)),
1345 list(enumerate(range(5)))
1346 )
1347
1348 class BadSeq:
1349 def __getitem__(self, i):
1350 if i == 5:
1351 raise ValueError
1352 else:
1353 return i
1354 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1355
Eric Smitha9f7d622008-02-17 19:46:49 +00001356 def test_format(self):
1357 # Test the basic machinery of the format() builtin. Don't test
1358 # the specifics of the various formatters
1359 self.assertEqual(format(3, ''), '3')
1360
1361 # Returns some classes to use for various tests. There's
1362 # an old-style version, and a new-style version
1363 def classes_new():
1364 class A(object):
1365 def __init__(self, x):
1366 self.x = x
1367 def __format__(self, format_spec):
1368 return str(self.x) + format_spec
1369 class DerivedFromA(A):
1370 pass
1371
1372 class Simple(object): pass
1373 class DerivedFromSimple(Simple):
1374 def __init__(self, x):
1375 self.x = x
1376 def __format__(self, format_spec):
1377 return str(self.x) + format_spec
1378 class DerivedFromSimple2(DerivedFromSimple): pass
1379 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1380
1381 # In 3.0, classes_classic has the same meaning as classes_new
1382 def classes_classic():
1383 class A:
1384 def __init__(self, x):
1385 self.x = x
1386 def __format__(self, format_spec):
1387 return str(self.x) + format_spec
1388 class DerivedFromA(A):
1389 pass
1390
1391 class Simple: pass
1392 class DerivedFromSimple(Simple):
1393 def __init__(self, x):
1394 self.x = x
1395 def __format__(self, format_spec):
1396 return str(self.x) + format_spec
1397 class DerivedFromSimple2(DerivedFromSimple): pass
1398 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1399
1400 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1401 self.assertEqual(format(A(3), 'spec'), '3spec')
1402 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1403 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1404 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1405 '10abcdef')
1406
1407 class_test(*classes_new())
1408 class_test(*classes_classic())
1409
1410 def empty_format_spec(value):
1411 # test that:
1412 # format(x, '') == str(x)
1413 # format(x) == str(x)
1414 self.assertEqual(format(value, ""), str(value))
1415 self.assertEqual(format(value), str(value))
1416
1417 # for builtin types, format(x, "") == str(x)
1418 empty_format_spec(17**13)
1419 empty_format_spec(1.0)
1420 empty_format_spec(3.1415e104)
1421 empty_format_spec(-3.1415e104)
1422 empty_format_spec(3.1415e-104)
1423 empty_format_spec(-3.1415e-104)
1424 empty_format_spec(object)
1425 empty_format_spec(None)
1426
1427 # TypeError because self.__format__ returns the wrong type
1428 class BadFormatResult:
1429 def __format__(self, format_spec):
1430 return 1.0
1431 self.assertRaises(TypeError, format, BadFormatResult(), "")
1432
1433 # TypeError because format_spec is not unicode or str
1434 self.assertRaises(TypeError, format, object(), 4)
1435 self.assertRaises(TypeError, format, object(), object())
1436
1437 # tests for object.__format__ really belong elsewhere, but
1438 # there's no good place to put them
1439 x = object().__format__('')
1440 self.assert_(x.startswith('<object object at'))
1441
1442 # first argument to object.__format__ must be string
1443 self.assertRaises(TypeError, object().__format__, 3)
1444 self.assertRaises(TypeError, object().__format__, object())
1445 self.assertRaises(TypeError, object().__format__, None)
1446
1447 # make sure we can take a subclass of str as a format spec
1448 class DerivedFromStr(str): pass
1449 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1450
Eric Smithfb0742f2008-02-22 17:43:17 +00001451 def test_bin(self):
1452 self.assertEqual(bin(0), '0b0')
1453 self.assertEqual(bin(1), '0b1')
1454 self.assertEqual(bin(-1), '-0b1')
1455 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1456 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1457 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1458 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1459
Eric Smithce584d42008-02-21 20:17:08 +00001460class TestSorted(unittest.TestCase):
1461
1462 def test_basic(self):
1463 data = range(100)
1464 copy = data[:]
1465 random.shuffle(copy)
1466 self.assertEqual(data, sorted(copy))
1467 self.assertNotEqual(data, copy)
1468
1469 data.reverse()
1470 random.shuffle(copy)
1471 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1472 self.assertNotEqual(data, copy)
1473 random.shuffle(copy)
1474 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1475 self.assertNotEqual(data, copy)
1476 random.shuffle(copy)
1477 self.assertEqual(data, sorted(copy, reverse=1))
1478 self.assertNotEqual(data, copy)
1479
1480 def test_inputtypes(self):
1481 s = 'abracadabra'
1482 types = [list, tuple]
1483 if have_unicode:
1484 types.insert(0, unicode)
1485 for T in types:
1486 self.assertEqual(sorted(s), sorted(T(s)))
1487
1488 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1489 types = [set, frozenset, list, tuple, dict.fromkeys]
1490 if have_unicode:
1491 types.insert(0, unicode)
1492 for T in types:
1493 self.assertEqual(sorted(s), sorted(T(s)))
1494
1495 def test_baddecorator(self):
1496 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1497 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1498
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001499def test_main(verbose=None):
1500 test_classes = (BuiltinTest, TestSorted)
1501
1502 run_unittest(*test_classes)
1503
1504 # verify reference counting
1505 if verbose and hasattr(sys, "gettotalrefcount"):
1506 import gc
1507 counts = [None] * 5
1508 for i in xrange(len(counts)):
1509 run_unittest(*test_classes)
1510 gc.collect()
1511 counts[i] = sys.gettotalrefcount()
1512 print counts
1513
Walter Dörwald919497e2003-01-19 16:23:59 +00001514
1515if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001516 test_main(verbose=True)