blob: c5a1cc3fb214a33890d0c11551fb63878587b36f [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
Raymond Hettinger214b1c32004-07-02 06:41:07 +00008import sys, warnings, cStringIO, random, 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
56L = [
57 ('0', 0),
58 ('1', 1),
59 ('9', 9),
60 ('10', 10),
61 ('99', 99),
62 ('100', 100),
63 ('314', 314),
64 (' 314', 314),
65 ('314 ', 314),
66 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000067 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000068 (' 1x', ValueError),
69 (' 1 ', 1),
70 (' 1\02 ', ValueError),
71 ('', ValueError),
72 (' ', ValueError),
73 (' \t\t ', ValueError)
74]
75if have_unicode:
76 L += [
77 (unicode('0'), 0),
78 (unicode('1'), 1),
79 (unicode('9'), 9),
80 (unicode('10'), 10),
81 (unicode('99'), 99),
82 (unicode('100'), 100),
83 (unicode('314'), 314),
84 (unicode(' 314'), 314),
85 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
86 (unicode(' \t\t 314 \t\t '), 314),
87 (unicode(' 1x'), ValueError),
88 (unicode(' 1 '), 1),
89 (unicode(' 1\02 '), ValueError),
90 (unicode(''), ValueError),
91 (unicode(' '), ValueError),
92 (unicode(' \t\t '), ValueError),
93 (unichr(0x200), ValueError),
94]
95
Raymond Hettinger96229b12005-03-11 06:49:40 +000096class TestFailingBool:
97 def __nonzero__(self):
98 raise RuntimeError
99
100class TestFailingIter:
101 def __iter__(self):
102 raise RuntimeError
103
Walter Dörwald919497e2003-01-19 16:23:59 +0000104class BuiltinTest(unittest.TestCase):
105
106 def test_import(self):
107 __import__('sys')
108 __import__('time')
109 __import__('string')
Georg Brandl5240d742007-03-13 20:46:32 +0000110 __import__(name='sys')
111 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000112 self.assertRaises(ImportError, __import__, 'spamspam')
113 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +0000114 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +0000115 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000116
117 def test_abs(self):
118 # int
119 self.assertEqual(abs(0), 0)
120 self.assertEqual(abs(1234), 1234)
121 self.assertEqual(abs(-1234), 1234)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000122 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000123 # float
124 self.assertEqual(abs(0.0), 0.0)
125 self.assertEqual(abs(3.14), 3.14)
126 self.assertEqual(abs(-3.14), 3.14)
127 # long
128 self.assertEqual(abs(0L), 0L)
129 self.assertEqual(abs(1234L), 1234L)
130 self.assertEqual(abs(-1234L), 1234L)
131 # str
132 self.assertRaises(TypeError, abs, 'a')
133
Raymond Hettinger96229b12005-03-11 06:49:40 +0000134 def test_all(self):
135 self.assertEqual(all([2, 4, 6]), True)
136 self.assertEqual(all([2, None, 6]), False)
137 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
138 self.assertRaises(RuntimeError, all, TestFailingIter())
139 self.assertRaises(TypeError, all, 10) # Non-iterable
140 self.assertRaises(TypeError, all) # No args
141 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
142 self.assertEqual(all([]), True) # Empty iterator
143 S = [50, 60]
144 self.assertEqual(all(x > 42 for x in S), True)
145 S = [50, 40, 60]
146 self.assertEqual(all(x > 42 for x in S), False)
147
148 def test_any(self):
149 self.assertEqual(any([None, None, None]), False)
150 self.assertEqual(any([None, 4, None]), True)
151 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
152 self.assertRaises(RuntimeError, all, TestFailingIter())
153 self.assertRaises(TypeError, any, 10) # Non-iterable
154 self.assertRaises(TypeError, any) # No args
155 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
156 self.assertEqual(any([]), False) # Empty iterator
157 S = [40, 60, 30]
158 self.assertEqual(any(x > 42 for x in S), True)
159 S = [10, 20, 30]
160 self.assertEqual(any(x > 42 for x in S), False)
161
Armin Rigo7ccbca92006-10-04 12:17:45 +0000162 def test_neg(self):
163 x = -sys.maxint-1
164 self.assert_(isinstance(x, int))
165 self.assertEqual(-x, sys.maxint+1)
166
Walter Dörwald919497e2003-01-19 16:23:59 +0000167 def test_apply(self):
168 def f0(*args):
169 self.assertEqual(args, ())
170 def f1(a1):
171 self.assertEqual(a1, 1)
172 def f2(a1, a2):
173 self.assertEqual(a1, 1)
174 self.assertEqual(a2, 2)
175 def f3(a1, a2, a3):
176 self.assertEqual(a1, 1)
177 self.assertEqual(a2, 2)
178 self.assertEqual(a3, 3)
179 apply(f0, ())
180 apply(f1, (1,))
181 apply(f2, (1, 2))
182 apply(f3, (1, 2, 3))
183
184 # A PyCFunction that takes only positional parameters should allow an
185 # empty keyword dictionary to pass without a complaint, but raise a
186 # TypeError if the dictionary is non-empty.
187 apply(id, (1,), {})
188 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
189 self.assertRaises(TypeError, apply)
190 self.assertRaises(TypeError, apply, id, 42)
191 self.assertRaises(TypeError, apply, id, (42,), 42)
192
193 def test_callable(self):
194 self.assert_(callable(len))
195 def f(): pass
196 self.assert_(callable(f))
197 class C:
198 def meth(self): pass
199 self.assert_(callable(C))
200 x = C()
201 self.assert_(callable(x.meth))
202 self.assert_(not callable(x))
203 class D(C):
204 def __call__(self): pass
205 y = D()
206 self.assert_(callable(y))
207 y()
208
209 def test_chr(self):
210 self.assertEqual(chr(32), ' ')
211 self.assertEqual(chr(65), 'A')
212 self.assertEqual(chr(97), 'a')
213 self.assertEqual(chr(0xff), '\xff')
214 self.assertRaises(ValueError, chr, 256)
215 self.assertRaises(TypeError, chr)
216
217 def test_cmp(self):
218 self.assertEqual(cmp(-1, 1), -1)
219 self.assertEqual(cmp(1, -1), 1)
220 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000221 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000222 a = []; a.append(a)
223 b = []; b.append(b)
224 from UserList import UserList
225 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000226 self.assertRaises(RuntimeError, cmp, a, b)
227 self.assertRaises(RuntimeError, cmp, b, c)
228 self.assertRaises(RuntimeError, cmp, c, a)
229 self.assertRaises(RuntimeError, cmp, a, c)
230 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000231 a.pop(); b.pop(); c.pop()
232 self.assertRaises(TypeError, cmp)
233
234 def test_coerce(self):
235 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
236 self.assertEqual(coerce(1, 1L), (1L, 1L))
237 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
238 self.assertRaises(TypeError, coerce)
239 class BadNumber:
240 def __coerce__(self, other):
241 raise ValueError
242 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000243 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000244
245 def test_compile(self):
246 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000247 bom = '\xef\xbb\xbf'
248 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000249 compile(source='pass', filename='?', mode='exec')
250 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
251 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000252 self.assertRaises(TypeError, compile)
253 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
254 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000255 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000256 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
257 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000258 if have_unicode:
259 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000260 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
261 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000262
Georg Brandl5240d742007-03-13 20:46:32 +0000263
Walter Dörwald919497e2003-01-19 16:23:59 +0000264 def test_delattr(self):
265 import sys
266 sys.spam = 1
267 delattr(sys, 'spam')
268 self.assertRaises(TypeError, delattr)
269
270 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000271 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000272 self.assertRaises(TypeError, dir, 42, 42)
273
Georg Brandl871f1bc2007-03-12 13:17:36 +0000274 # dir() - local scope
275 local_var = 1
276 self.assert_('local_var' in dir())
277
278 # dir(module)
279 import sys
280 self.assert_('exit' in dir(sys))
281
282 # dir(module_with_invalid__dict__)
283 import types
284 class Foo(types.ModuleType):
285 __dict__ = 8
286 f = Foo("foo")
287 self.assertRaises(TypeError, dir, f)
288
289 # dir(type)
290 self.assert_("strip" in dir(str))
291 self.assert_("__mro__" not in dir(str))
292
293 # dir(obj)
294 class Foo(object):
295 def __init__(self):
296 self.x = 7
297 self.y = 8
298 self.z = 9
299 f = Foo()
300 self.assert_("y" in dir(f))
301
302 # dir(obj_no__dict__)
303 class Foo(object):
304 __slots__ = []
305 f = Foo()
306 self.assert_("__repr__" in dir(f))
307
308 # dir(obj_no__class__with__dict__)
309 # (an ugly trick to cause getattr(f, "__class__") to fail)
310 class Foo(object):
311 __slots__ = ["__class__", "__dict__"]
312 def __init__(self):
313 self.bar = "wow"
314 f = Foo()
315 self.assert_("__repr__" not in dir(f))
316 self.assert_("bar" in dir(f))
317
318 # dir(obj_using __dir__)
319 class Foo(object):
320 def __dir__(self):
321 return ["kan", "ga", "roo"]
322 f = Foo()
323 self.assert_(dir(f) == ["ga", "kan", "roo"])
324
325 # dir(obj__dir__not_list)
326 class Foo(object):
327 def __dir__(self):
328 return 7
329 f = Foo()
330 self.assertRaises(TypeError, dir, f)
331
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 def test_divmod(self):
333 self.assertEqual(divmod(12, 7), (1, 5))
334 self.assertEqual(divmod(-12, 7), (-2, 2))
335 self.assertEqual(divmod(12, -7), (-2, -2))
336 self.assertEqual(divmod(-12, -7), (1, -5))
337
338 self.assertEqual(divmod(12L, 7L), (1L, 5L))
339 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
340 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
341 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
342
343 self.assertEqual(divmod(12, 7L), (1, 5L))
344 self.assertEqual(divmod(-12, 7L), (-2, 2L))
345 self.assertEqual(divmod(12L, -7), (-2L, -2))
346 self.assertEqual(divmod(-12L, -7), (1L, -5))
347
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000348 self.assertEqual(divmod(-sys.maxint-1, -1),
349 (sys.maxint+1, 0))
350
Walter Dörwald919497e2003-01-19 16:23:59 +0000351 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
352 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
353 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
354 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
355
356 self.assertRaises(TypeError, divmod)
357
358 def test_eval(self):
359 self.assertEqual(eval('1+1'), 2)
360 self.assertEqual(eval(' 1+1\n'), 2)
361 globals = {'a': 1, 'b': 2}
362 locals = {'b': 200, 'c': 300}
363 self.assertEqual(eval('a', globals) , 1)
364 self.assertEqual(eval('a', globals, locals), 1)
365 self.assertEqual(eval('b', globals, locals), 200)
366 self.assertEqual(eval('c', globals, locals), 300)
367 if have_unicode:
368 self.assertEqual(eval(unicode('1+1')), 2)
369 self.assertEqual(eval(unicode(' 1+1\n')), 2)
370 globals = {'a': 1, 'b': 2}
371 locals = {'b': 200, 'c': 300}
372 if have_unicode:
373 self.assertEqual(eval(unicode('a'), globals), 1)
374 self.assertEqual(eval(unicode('a'), globals, locals), 1)
375 self.assertEqual(eval(unicode('b'), globals, locals), 200)
376 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000377 bom = '\xef\xbb\xbf'
378 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000379 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
380 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000381 self.assertRaises(TypeError, eval)
382 self.assertRaises(TypeError, eval, ())
383
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000384 def test_general_eval(self):
385 # Tests that general mappings can be used for the locals argument
386
387 class M:
388 "Test mapping interface versus possible calls from eval()."
389 def __getitem__(self, key):
390 if key == 'a':
391 return 12
392 raise KeyError
393 def keys(self):
394 return list('xyz')
395
396 m = M()
397 g = globals()
398 self.assertEqual(eval('a', g, m), 12)
399 self.assertRaises(NameError, eval, 'b', g, m)
400 self.assertEqual(eval('dir()', g, m), list('xyz'))
401 self.assertEqual(eval('globals()', g, m), g)
402 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000403 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000404 class A:
405 "Non-mapping"
406 pass
407 m = A()
408 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000409
410 # Verify that dict subclasses work as well
411 class D(dict):
412 def __getitem__(self, key):
413 if key == 'a':
414 return 12
415 return dict.__getitem__(self, key)
416 def keys(self):
417 return list('xyz')
418
419 d = D()
420 self.assertEqual(eval('a', g, d), 12)
421 self.assertRaises(NameError, eval, 'b', g, d)
422 self.assertEqual(eval('dir()', g, d), list('xyz'))
423 self.assertEqual(eval('globals()', g, d), g)
424 self.assertEqual(eval('locals()', g, d), d)
425
426 # Verify locals stores (used by list comps)
427 eval('[locals() for i in (2,3)]', g, d)
428 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
429
430 class SpreadSheet:
431 "Sample application showing nested, calculated lookups."
432 _cells = {}
433 def __setitem__(self, key, formula):
434 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000435 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000436 return eval(self._cells[key], globals(), self)
437
438 ss = SpreadSheet()
439 ss['a1'] = '5'
440 ss['a2'] = 'a1*6'
441 ss['a3'] = 'a2*7'
442 self.assertEqual(ss['a3'], 210)
443
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000444 # Verify that dir() catches a non-list returned by eval
445 # SF bug #1004669
446 class C:
447 def __getitem__(self, item):
448 raise KeyError(item)
449 def keys(self):
450 return 'a'
451 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
452
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 # Done outside of the method test_z to get the correct scope
454 z = 0
455 f = open(TESTFN, 'w')
456 f.write('z = z+1\n')
457 f.write('z = z*2\n')
458 f.close()
459 execfile(TESTFN)
460
461 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000462 global numruns
463 if numruns:
464 return
465 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000466
Walter Dörwald919497e2003-01-19 16:23:59 +0000467 globals = {'a': 1, 'b': 2}
468 locals = {'b': 200, 'c': 300}
469
470 self.assertEqual(self.__class__.z, 2)
471 globals['z'] = 0
472 execfile(TESTFN, globals)
473 self.assertEqual(globals['z'], 2)
474 locals['z'] = 0
475 execfile(TESTFN, globals, locals)
476 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000477
478 class M:
479 "Test mapping interface versus possible calls from execfile()."
480 def __init__(self):
481 self.z = 10
482 def __getitem__(self, key):
483 if key == 'z':
484 return self.z
485 raise KeyError
486 def __setitem__(self, key, value):
487 if key == 'z':
488 self.z = value
489 return
490 raise KeyError
491
492 locals = M()
493 locals['z'] = 0
494 execfile(TESTFN, globals, locals)
495 self.assertEqual(locals['z'], 2)
496
Walter Dörwald919497e2003-01-19 16:23:59 +0000497 unlink(TESTFN)
498 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000499 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000500 import os
501 self.assertRaises(IOError, execfile, os.curdir)
502 self.assertRaises(IOError, execfile, "I_dont_exist")
503
504 def test_filter(self):
505 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
506 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
507 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
508 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
509 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
510 def identity(item):
511 return 1
512 filter(identity, Squares(5))
513 self.assertRaises(TypeError, filter)
514 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000515 def __getitem__(self, index):
516 if index<4:
517 return 42
518 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000519 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
520 def badfunc():
521 pass
522 self.assertRaises(TypeError, filter, badfunc, range(5))
523
Walter Dörwaldbf517072003-01-27 15:57:14 +0000524 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000525 self.assertEqual(filter(None, (1, 2)), (1, 2))
526 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
527 self.assertRaises(TypeError, filter, 42, (1, 2))
528
Walter Dörwaldbf517072003-01-27 15:57:14 +0000529 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000530 self.assertEqual(filter(None, "12"), "12")
531 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
532 self.assertRaises(TypeError, filter, 42, "12")
533 class badstr(str):
534 def __getitem__(self, index):
535 raise ValueError
536 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000537
Walter Dörwald903f1e02003-02-04 16:28:00 +0000538 class badstr2(str):
539 def __getitem__(self, index):
540 return 42
541 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
542
543 class weirdstr(str):
544 def __getitem__(self, index):
545 return weirdstr(2*str.__getitem__(self, index))
546 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
547
Walter Dörwald5e61e242003-02-04 17:04:01 +0000548 class shiftstr(str):
549 def __getitem__(self, index):
550 return chr(ord(str.__getitem__(self, index))+1)
551 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
552
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000553 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000554 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000555 self.assertEqual(filter(None, unicode("12")), unicode("12"))
556 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
557 self.assertRaises(TypeError, filter, 42, unicode("12"))
558 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000559
Walter Dörwald903f1e02003-02-04 16:28:00 +0000560 class badunicode(unicode):
561 def __getitem__(self, index):
562 return 42
563 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
564
565 class weirdunicode(unicode):
566 def __getitem__(self, index):
567 return weirdunicode(2*unicode.__getitem__(self, index))
568 self.assertEqual(
569 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
570
Walter Dörwald5e61e242003-02-04 17:04:01 +0000571 class shiftunicode(unicode):
572 def __getitem__(self, index):
573 return unichr(ord(unicode.__getitem__(self, index))+1)
574 self.assertEqual(
575 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
576 unicode("345")
577 )
578
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000579 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000580 # test that filter() never returns tuple, str or unicode subclasses
581 # and that the result always goes through __getitem__
582 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000583 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000584 def __getitem__(self, index):
585 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000586 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000587 def __getitem__(self, index):
588 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000589 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000590 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000591 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000592 }
593 if have_unicode:
594 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000595 def __getitem__(self, index):
596 return 2*unicode.__getitem__(self, index)
597 inputs[unicode2] = {
598 unicode(): unicode(),
599 unicode("123"): unicode("112233")
600 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000601
Walter Dörwald1918f772003-02-10 13:19:13 +0000602 for (cls, inps) in inputs.iteritems():
603 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000604 # make sure the output goes through __getitem__
605 # even if func is None
606 self.assertEqual(
607 filter(funcs[0], cls(inp)),
608 filter(funcs[1], cls(inp))
609 )
610 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000611 outp = filter(func, cls(inp))
612 self.assertEqual(outp, exp)
613 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000614
Walter Dörwald919497e2003-01-19 16:23:59 +0000615 def test_float(self):
616 self.assertEqual(float(3.14), 3.14)
617 self.assertEqual(float(314), 314.0)
618 self.assertEqual(float(314L), 314.0)
619 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000620 self.assertRaises(ValueError, float, " 0x3.1 ")
621 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 if have_unicode:
623 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
624 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000625 # Implementation limitation in PyFloat_FromString()
626 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000627
Georg Brandlde9b6242006-04-30 11:13:56 +0000628 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000629 def test_float_with_comma(self):
630 # set locale to something that doesn't use '.' for the decimal point
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000631 # float must not accept the locale specific decimal point but
632 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000633 import locale
634 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000635 return
636
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000637 self.assertEqual(float(" 3.14 "), 3.14)
638 self.assertEqual(float("+3.14 "), 3.14)
639 self.assertEqual(float("-3.14 "), -3.14)
640 self.assertEqual(float(".14 "), .14)
641 self.assertEqual(float("3. "), 3.0)
642 self.assertEqual(float("3.e3 "), 3000.0)
643 self.assertEqual(float("3.2e3 "), 3200.0)
644 self.assertEqual(float("2.5e-1 "), 0.25)
645 self.assertEqual(float("5e-1"), 0.5)
646 self.assertRaises(ValueError, float, " 3,14 ")
647 self.assertRaises(ValueError, float, " +3,14 ")
648 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000649 self.assertRaises(ValueError, float, " 0x3.1 ")
650 self.assertRaises(ValueError, float, " -0x3.p-1 ")
651 self.assertEqual(float(" 25.e-1 "), 2.5)
652 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000653
Brett Cannonc3647ac2005-04-26 03:45:26 +0000654 def test_floatconversion(self):
655 # Make sure that calls to __float__() work properly
656 class Foo0:
657 def __float__(self):
658 return 42.
659
660 class Foo1(object):
661 def __float__(self):
662 return 42.
663
664 class Foo2(float):
665 def __float__(self):
666 return 42.
667
668 class Foo3(float):
669 def __new__(cls, value=0.):
670 return float.__new__(cls, 2*value)
671
672 def __float__(self):
673 return self
674
675 class Foo4(float):
676 def __float__(self):
677 return 42
678
679 self.assertAlmostEqual(float(Foo0()), 42.)
680 self.assertAlmostEqual(float(Foo1()), 42.)
681 self.assertAlmostEqual(float(Foo2()), 42.)
682 self.assertAlmostEqual(float(Foo3(21)), 42.)
683 self.assertRaises(TypeError, float, Foo4(42))
684
Walter Dörwald919497e2003-01-19 16:23:59 +0000685 def test_getattr(self):
686 import sys
687 self.assert_(getattr(sys, 'stdout') is sys.stdout)
688 self.assertRaises(TypeError, getattr, sys, 1)
689 self.assertRaises(TypeError, getattr, sys, 1, "foo")
690 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000691 if have_unicode:
692 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000693
694 def test_hasattr(self):
695 import sys
696 self.assert_(hasattr(sys, 'stdout'))
697 self.assertRaises(TypeError, hasattr, sys, 1)
698 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000699 if have_unicode:
700 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000701
702 def test_hash(self):
703 hash(None)
704 self.assertEqual(hash(1), hash(1L))
705 self.assertEqual(hash(1), hash(1.0))
706 hash('spam')
707 if have_unicode:
708 self.assertEqual(hash('spam'), hash(unicode('spam')))
709 hash((0,1,2,3))
710 def f(): pass
711 self.assertRaises(TypeError, hash, [])
712 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000713 # Bug 1536021: Allow hash to return long objects
714 class X:
715 def __hash__(self):
716 return 2**100
717 self.assertEquals(type(hash(X())), int)
718 class Y(object):
719 def __hash__(self):
720 return 2**100
721 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000722 class Z(long):
723 def __hash__(self):
724 return self
725 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000726
727 def test_hex(self):
728 self.assertEqual(hex(16), '0x10')
729 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000730 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000731 self.assertEqual(hex(-16L), '-0x10L')
732 self.assertRaises(TypeError, hex, {})
733
734 def test_id(self):
735 id(None)
736 id(1)
737 id(1L)
738 id(1.0)
739 id('spam')
740 id((0,1,2,3))
741 id([0,1,2,3])
742 id({'spam': 1, 'eggs': 2, 'ham': 3})
743
744 # Test input() later, together with raw_input
745
746 def test_int(self):
747 self.assertEqual(int(314), 314)
748 self.assertEqual(int(3.14), 3)
749 self.assertEqual(int(314L), 314)
750 # Check that conversion from float truncates towards zero
751 self.assertEqual(int(-3.14), -3)
752 self.assertEqual(int(3.9), 3)
753 self.assertEqual(int(-3.9), -3)
754 self.assertEqual(int(3.5), 3)
755 self.assertEqual(int(-3.5), -3)
756 # Different base:
757 self.assertEqual(int("10",16), 16L)
758 if have_unicode:
759 self.assertEqual(int(unicode("10"),16), 16L)
760 # Test conversion from strings and various anomalies
761 for s, v in L:
762 for sign in "", "+", "-":
763 for prefix in "", " ", "\t", " \t\t ":
764 ss = prefix + sign + s
765 vv = v
766 if sign == "-" and v is not ValueError:
767 vv = -v
768 try:
769 self.assertEqual(int(ss), vv)
770 except v:
771 pass
772
Walter Dörwald70a6b492004-02-12 17:35:32 +0000773 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000774 x = int(s)
775 self.assertEqual(x+1, -sys.maxint)
776 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000777 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000778 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000779
780 # should return long
781 x = int(1e100)
782 self.assert_(isinstance(x, long))
783 x = int(-1e100)
784 self.assert_(isinstance(x, long))
785
786
787 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
788 # Worked by accident in Windows release build, but failed in debug build.
789 # Failed in all Linux builds.
790 x = -1-sys.maxint
791 self.assertEqual(x >> 1, x//2)
792
793 self.assertRaises(ValueError, int, '123\0')
794 self.assertRaises(ValueError, int, '53', 40)
795
Georg Brandl2c1375c2006-10-12 11:27:59 +0000796 # SF bug 1545497: embedded NULs were not detected with
797 # explicit base
798 self.assertRaises(ValueError, int, '123\0', 10)
799 self.assertRaises(ValueError, int, '123\x00 245', 20)
800
Walter Dörwald919497e2003-01-19 16:23:59 +0000801 x = int('1' * 600)
802 self.assert_(isinstance(x, long))
803
804 if have_unicode:
805 x = int(unichr(0x661) * 600)
806 self.assert_(isinstance(x, long))
807
808 self.assertRaises(TypeError, int, 1, 12)
809
810 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000811 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000812
Tim Petersb713ec22006-05-23 18:45:30 +0000813 # SF bug 1334662: int(string, base) wrong answers
814 # Various representations of 2**32 evaluated to 0
815 # rather than 2**32 in previous versions
816
817 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
818 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
819 self.assertEqual(int('10000000000000000', 4), 4294967296L)
820 self.assertEqual(int('32244002423141', 5), 4294967296L)
821 self.assertEqual(int('1550104015504', 6), 4294967296L)
822 self.assertEqual(int('211301422354', 7), 4294967296L)
823 self.assertEqual(int('40000000000', 8), 4294967296L)
824 self.assertEqual(int('12068657454', 9), 4294967296L)
825 self.assertEqual(int('4294967296', 10), 4294967296L)
826 self.assertEqual(int('1904440554', 11), 4294967296L)
827 self.assertEqual(int('9ba461594', 12), 4294967296L)
828 self.assertEqual(int('535a79889', 13), 4294967296L)
829 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
830 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
831 self.assertEqual(int('100000000', 16), 4294967296L)
832 self.assertEqual(int('a7ffda91', 17), 4294967296L)
833 self.assertEqual(int('704he7g4', 18), 4294967296L)
834 self.assertEqual(int('4f5aff66', 19), 4294967296L)
835 self.assertEqual(int('3723ai4g', 20), 4294967296L)
836 self.assertEqual(int('281d55i4', 21), 4294967296L)
837 self.assertEqual(int('1fj8b184', 22), 4294967296L)
838 self.assertEqual(int('1606k7ic', 23), 4294967296L)
839 self.assertEqual(int('mb994ag', 24), 4294967296L)
840 self.assertEqual(int('hek2mgl', 25), 4294967296L)
841 self.assertEqual(int('dnchbnm', 26), 4294967296L)
842 self.assertEqual(int('b28jpdm', 27), 4294967296L)
843 self.assertEqual(int('8pfgih4', 28), 4294967296L)
844 self.assertEqual(int('76beigg', 29), 4294967296L)
845 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
846 self.assertEqual(int('4q0jto4', 31), 4294967296L)
847 self.assertEqual(int('4000000', 32), 4294967296L)
848 self.assertEqual(int('3aokq94', 33), 4294967296L)
849 self.assertEqual(int('2qhxjli', 34), 4294967296L)
850 self.assertEqual(int('2br45qb', 35), 4294967296L)
851 self.assertEqual(int('1z141z4', 36), 4294967296L)
852
853 # SF bug 1334662: int(string, base) wrong answers
854 # Checks for proper evaluation of 2**32 + 1
855 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
856 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
857 self.assertEqual(int('10000000000000001', 4), 4294967297L)
858 self.assertEqual(int('32244002423142', 5), 4294967297L)
859 self.assertEqual(int('1550104015505', 6), 4294967297L)
860 self.assertEqual(int('211301422355', 7), 4294967297L)
861 self.assertEqual(int('40000000001', 8), 4294967297L)
862 self.assertEqual(int('12068657455', 9), 4294967297L)
863 self.assertEqual(int('4294967297', 10), 4294967297L)
864 self.assertEqual(int('1904440555', 11), 4294967297L)
865 self.assertEqual(int('9ba461595', 12), 4294967297L)
866 self.assertEqual(int('535a7988a', 13), 4294967297L)
867 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
868 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
869 self.assertEqual(int('100000001', 16), 4294967297L)
870 self.assertEqual(int('a7ffda92', 17), 4294967297L)
871 self.assertEqual(int('704he7g5', 18), 4294967297L)
872 self.assertEqual(int('4f5aff67', 19), 4294967297L)
873 self.assertEqual(int('3723ai4h', 20), 4294967297L)
874 self.assertEqual(int('281d55i5', 21), 4294967297L)
875 self.assertEqual(int('1fj8b185', 22), 4294967297L)
876 self.assertEqual(int('1606k7id', 23), 4294967297L)
877 self.assertEqual(int('mb994ah', 24), 4294967297L)
878 self.assertEqual(int('hek2mgm', 25), 4294967297L)
879 self.assertEqual(int('dnchbnn', 26), 4294967297L)
880 self.assertEqual(int('b28jpdn', 27), 4294967297L)
881 self.assertEqual(int('8pfgih5', 28), 4294967297L)
882 self.assertEqual(int('76beigh', 29), 4294967297L)
883 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
884 self.assertEqual(int('4q0jto5', 31), 4294967297L)
885 self.assertEqual(int('4000001', 32), 4294967297L)
886 self.assertEqual(int('3aokq95', 33), 4294967297L)
887 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
888 self.assertEqual(int('2br45qc', 35), 4294967297L)
889 self.assertEqual(int('1z141z5', 36), 4294967297L)
890
Brett Cannonc3647ac2005-04-26 03:45:26 +0000891 def test_intconversion(self):
892 # Test __int__()
893 class Foo0:
894 def __int__(self):
895 return 42
896
897 class Foo1(object):
898 def __int__(self):
899 return 42
900
901 class Foo2(int):
902 def __int__(self):
903 return 42
904
905 class Foo3(int):
906 def __int__(self):
907 return self
908
909 class Foo4(int):
910 def __int__(self):
911 return 42L
912
913 class Foo5(int):
914 def __int__(self):
915 return 42.
916
917 self.assertEqual(int(Foo0()), 42)
918 self.assertEqual(int(Foo1()), 42)
919 self.assertEqual(int(Foo2()), 42)
920 self.assertEqual(int(Foo3()), 0)
921 self.assertEqual(int(Foo4()), 42L)
922 self.assertRaises(TypeError, int, Foo5())
923
Walter Dörwald919497e2003-01-19 16:23:59 +0000924 def test_intern(self):
925 self.assertRaises(TypeError, intern)
926 s = "never interned before"
927 self.assert_(intern(s) is s)
928 s2 = s.swapcase().swapcase()
929 self.assert_(intern(s2) is s)
930
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000931 # Subclasses of string can't be interned, because they
932 # provide too much opportunity for insane things to happen.
933 # We don't want them in the interned dict and if they aren't
934 # actually interned, we don't want to create the appearance
935 # that they are by allowing intern() to succeeed.
936 class S(str):
937 def __hash__(self):
938 return 123
939
940 self.assertRaises(TypeError, intern, S("abc"))
941
942 # It's still safe to pass these strings to routines that
943 # call intern internally, e.g. PyObject_SetAttr().
944 s = S("abc")
945 setattr(s, s, s)
946 self.assertEqual(getattr(s, s), s)
947
Walter Dörwald919497e2003-01-19 16:23:59 +0000948 def test_iter(self):
949 self.assertRaises(TypeError, iter)
950 self.assertRaises(TypeError, iter, 42, 42)
951 lists = [("1", "2"), ["1", "2"], "12"]
952 if have_unicode:
953 lists.append(unicode("12"))
954 for l in lists:
955 i = iter(l)
956 self.assertEqual(i.next(), '1')
957 self.assertEqual(i.next(), '2')
958 self.assertRaises(StopIteration, i.next)
959
960 def test_isinstance(self):
961 class C:
962 pass
963 class D(C):
964 pass
965 class E:
966 pass
967 c = C()
968 d = D()
969 e = E()
970 self.assert_(isinstance(c, C))
971 self.assert_(isinstance(d, C))
972 self.assert_(not isinstance(e, C))
973 self.assert_(not isinstance(c, D))
974 self.assert_(not isinstance('foo', E))
975 self.assertRaises(TypeError, isinstance, E, 'foo')
976 self.assertRaises(TypeError, isinstance)
977
978 def test_issubclass(self):
979 class C:
980 pass
981 class D(C):
982 pass
983 class E:
984 pass
985 c = C()
986 d = D()
987 e = E()
988 self.assert_(issubclass(D, C))
989 self.assert_(issubclass(C, C))
990 self.assert_(not issubclass(C, D))
991 self.assertRaises(TypeError, issubclass, 'foo', E)
992 self.assertRaises(TypeError, issubclass, E, 'foo')
993 self.assertRaises(TypeError, issubclass)
994
995 def test_len(self):
996 self.assertEqual(len('123'), 3)
997 self.assertEqual(len(()), 0)
998 self.assertEqual(len((1, 2, 3, 4)), 4)
999 self.assertEqual(len([1, 2, 3, 4]), 4)
1000 self.assertEqual(len({}), 0)
1001 self.assertEqual(len({'a':1, 'b': 2}), 2)
1002 class BadSeq:
1003 def __len__(self):
1004 raise ValueError
1005 self.assertRaises(ValueError, len, BadSeq())
1006
1007 def test_list(self):
1008 self.assertEqual(list([]), [])
1009 l0_3 = [0, 1, 2, 3]
1010 l0_3_bis = list(l0_3)
1011 self.assertEqual(l0_3, l0_3_bis)
1012 self.assert_(l0_3 is not l0_3_bis)
1013 self.assertEqual(list(()), [])
1014 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1015 self.assertEqual(list(''), [])
1016 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1017
1018 if sys.maxint == 0x7fffffff:
1019 # This test can currently only work on 32-bit machines.
1020 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1021 # XXX re-enabled.
1022 # Verify clearing of bug #556025.
1023 # This assumes that the max data size (sys.maxint) == max
1024 # address size this also assumes that the address size is at
1025 # least 4 bytes with 8 byte addresses, the bug is not well
1026 # tested
1027 #
1028 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1029 # earlier due to a newlib bug. See the following mailing list
1030 # thread for the details:
1031
1032 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1033 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1034
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001035 # This code used to segfault in Py2.4a3
1036 x = []
1037 x.extend(-y for y in x)
1038 self.assertEqual(x, [])
1039
Walter Dörwald919497e2003-01-19 16:23:59 +00001040 def test_long(self):
1041 self.assertEqual(long(314), 314L)
1042 self.assertEqual(long(3.14), 3L)
1043 self.assertEqual(long(314L), 314L)
1044 # Check that conversion from float truncates towards zero
1045 self.assertEqual(long(-3.14), -3L)
1046 self.assertEqual(long(3.9), 3L)
1047 self.assertEqual(long(-3.9), -3L)
1048 self.assertEqual(long(3.5), 3L)
1049 self.assertEqual(long(-3.5), -3L)
1050 self.assertEqual(long("-3"), -3L)
1051 if have_unicode:
1052 self.assertEqual(long(unicode("-3")), -3L)
1053 # Different base:
1054 self.assertEqual(long("10",16), 16L)
1055 if have_unicode:
1056 self.assertEqual(long(unicode("10"),16), 16L)
1057 # Check conversions from string (same test set as for int(), and then some)
1058 LL = [
1059 ('1' + '0'*20, 10L**20),
1060 ('1' + '0'*100, 10L**100)
1061 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001062 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 if have_unicode:
1064 L2 += [
1065 (unicode('1') + unicode('0')*20, 10L**20),
1066 (unicode('1') + unicode('0')*100, 10L**100),
1067 ]
1068 for s, v in L2 + LL:
1069 for sign in "", "+", "-":
1070 for prefix in "", " ", "\t", " \t\t ":
1071 ss = prefix + sign + s
1072 vv = v
1073 if sign == "-" and v is not ValueError:
1074 vv = -v
1075 try:
1076 self.assertEqual(long(ss), long(vv))
1077 except v:
1078 pass
1079
1080 self.assertRaises(ValueError, long, '123\0')
1081 self.assertRaises(ValueError, long, '53', 40)
1082 self.assertRaises(TypeError, long, 1, 12)
1083
Georg Brandl00cd8182007-03-06 18:41:12 +00001084 # SF patch #1638879: embedded NULs were not detected with
1085 # explicit base
1086 self.assertRaises(ValueError, long, '123\0', 10)
1087 self.assertRaises(ValueError, long, '123\x00 245', 20)
1088
Tim Peters696cf432006-05-24 21:10:40 +00001089 self.assertEqual(long('100000000000000000000000000000000', 2),
1090 4294967296)
1091 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1092 self.assertEqual(long('10000000000000000', 4), 4294967296)
1093 self.assertEqual(long('32244002423141', 5), 4294967296)
1094 self.assertEqual(long('1550104015504', 6), 4294967296)
1095 self.assertEqual(long('211301422354', 7), 4294967296)
1096 self.assertEqual(long('40000000000', 8), 4294967296)
1097 self.assertEqual(long('12068657454', 9), 4294967296)
1098 self.assertEqual(long('4294967296', 10), 4294967296)
1099 self.assertEqual(long('1904440554', 11), 4294967296)
1100 self.assertEqual(long('9ba461594', 12), 4294967296)
1101 self.assertEqual(long('535a79889', 13), 4294967296)
1102 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1103 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1104 self.assertEqual(long('100000000', 16), 4294967296)
1105 self.assertEqual(long('a7ffda91', 17), 4294967296)
1106 self.assertEqual(long('704he7g4', 18), 4294967296)
1107 self.assertEqual(long('4f5aff66', 19), 4294967296)
1108 self.assertEqual(long('3723ai4g', 20), 4294967296)
1109 self.assertEqual(long('281d55i4', 21), 4294967296)
1110 self.assertEqual(long('1fj8b184', 22), 4294967296)
1111 self.assertEqual(long('1606k7ic', 23), 4294967296)
1112 self.assertEqual(long('mb994ag', 24), 4294967296)
1113 self.assertEqual(long('hek2mgl', 25), 4294967296)
1114 self.assertEqual(long('dnchbnm', 26), 4294967296)
1115 self.assertEqual(long('b28jpdm', 27), 4294967296)
1116 self.assertEqual(long('8pfgih4', 28), 4294967296)
1117 self.assertEqual(long('76beigg', 29), 4294967296)
1118 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1119 self.assertEqual(long('4q0jto4', 31), 4294967296)
1120 self.assertEqual(long('4000000', 32), 4294967296)
1121 self.assertEqual(long('3aokq94', 33), 4294967296)
1122 self.assertEqual(long('2qhxjli', 34), 4294967296)
1123 self.assertEqual(long('2br45qb', 35), 4294967296)
1124 self.assertEqual(long('1z141z4', 36), 4294967296)
1125
1126 self.assertEqual(long('100000000000000000000000000000001', 2),
1127 4294967297)
1128 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1129 self.assertEqual(long('10000000000000001', 4), 4294967297)
1130 self.assertEqual(long('32244002423142', 5), 4294967297)
1131 self.assertEqual(long('1550104015505', 6), 4294967297)
1132 self.assertEqual(long('211301422355', 7), 4294967297)
1133 self.assertEqual(long('40000000001', 8), 4294967297)
1134 self.assertEqual(long('12068657455', 9), 4294967297)
1135 self.assertEqual(long('4294967297', 10), 4294967297)
1136 self.assertEqual(long('1904440555', 11), 4294967297)
1137 self.assertEqual(long('9ba461595', 12), 4294967297)
1138 self.assertEqual(long('535a7988a', 13), 4294967297)
1139 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1140 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1141 self.assertEqual(long('100000001', 16), 4294967297)
1142 self.assertEqual(long('a7ffda92', 17), 4294967297)
1143 self.assertEqual(long('704he7g5', 18), 4294967297)
1144 self.assertEqual(long('4f5aff67', 19), 4294967297)
1145 self.assertEqual(long('3723ai4h', 20), 4294967297)
1146 self.assertEqual(long('281d55i5', 21), 4294967297)
1147 self.assertEqual(long('1fj8b185', 22), 4294967297)
1148 self.assertEqual(long('1606k7id', 23), 4294967297)
1149 self.assertEqual(long('mb994ah', 24), 4294967297)
1150 self.assertEqual(long('hek2mgm', 25), 4294967297)
1151 self.assertEqual(long('dnchbnn', 26), 4294967297)
1152 self.assertEqual(long('b28jpdn', 27), 4294967297)
1153 self.assertEqual(long('8pfgih5', 28), 4294967297)
1154 self.assertEqual(long('76beigh', 29), 4294967297)
1155 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1156 self.assertEqual(long('4q0jto5', 31), 4294967297)
1157 self.assertEqual(long('4000001', 32), 4294967297)
1158 self.assertEqual(long('3aokq95', 33), 4294967297)
1159 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1160 self.assertEqual(long('2br45qc', 35), 4294967297)
1161 self.assertEqual(long('1z141z5', 36), 4294967297)
1162
1163
Brett Cannonc3647ac2005-04-26 03:45:26 +00001164 def test_longconversion(self):
1165 # Test __long__()
1166 class Foo0:
1167 def __long__(self):
1168 return 42L
1169
1170 class Foo1(object):
1171 def __long__(self):
1172 return 42L
1173
1174 class Foo2(long):
1175 def __long__(self):
1176 return 42L
1177
1178 class Foo3(long):
1179 def __long__(self):
1180 return self
1181
1182 class Foo4(long):
1183 def __long__(self):
1184 return 42
1185
1186 class Foo5(long):
1187 def __long__(self):
1188 return 42.
1189
1190 self.assertEqual(long(Foo0()), 42L)
1191 self.assertEqual(long(Foo1()), 42L)
1192 self.assertEqual(long(Foo2()), 42L)
1193 self.assertEqual(long(Foo3()), 0)
1194 self.assertEqual(long(Foo4()), 42)
1195 self.assertRaises(TypeError, long, Foo5())
1196
Walter Dörwald919497e2003-01-19 16:23:59 +00001197 def test_map(self):
1198 self.assertEqual(
1199 map(None, 'hello world'),
1200 ['h','e','l','l','o',' ','w','o','r','l','d']
1201 )
1202 self.assertEqual(
1203 map(None, 'abcd', 'efg'),
1204 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1205 )
1206 self.assertEqual(
1207 map(None, range(10)),
1208 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1209 )
1210 self.assertEqual(
1211 map(lambda x: x*x, range(1,4)),
1212 [1, 4, 9]
1213 )
1214 try:
1215 from math import sqrt
1216 except ImportError:
1217 def sqrt(x):
1218 return pow(x, 0.5)
1219 self.assertEqual(
1220 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1221 [[4.0, 2.0], [9.0, 3.0]]
1222 )
1223 self.assertEqual(
1224 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1225 [10, 4, 6]
1226 )
1227
1228 def plus(*v):
1229 accu = 0
1230 for i in v: accu = accu + i
1231 return accu
1232 self.assertEqual(
1233 map(plus, [1, 3, 7]),
1234 [1, 3, 7]
1235 )
1236 self.assertEqual(
1237 map(plus, [1, 3, 7], [4, 9, 2]),
1238 [1+4, 3+9, 7+2]
1239 )
1240 self.assertEqual(
1241 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1242 [1+4+1, 3+9+1, 7+2+0]
1243 )
1244 self.assertEqual(
1245 map(None, Squares(10)),
1246 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1247 )
1248 self.assertEqual(
1249 map(int, Squares(10)),
1250 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1251 )
1252 self.assertEqual(
1253 map(None, Squares(3), Squares(2)),
1254 [(0,0), (1,1), (4,None)]
1255 )
1256 self.assertEqual(
1257 map(max, Squares(3), Squares(2)),
1258 [0, 1, 4]
1259 )
1260 self.assertRaises(TypeError, map)
1261 self.assertRaises(TypeError, map, lambda x: x, 42)
1262 self.assertEqual(map(None, [42]), [42])
1263 class BadSeq:
1264 def __getitem__(self, index):
1265 raise ValueError
1266 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001267 def badfunc(x):
1268 raise RuntimeError
1269 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001270
1271 def test_max(self):
1272 self.assertEqual(max('123123'), '3')
1273 self.assertEqual(max(1, 2, 3), 3)
1274 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1275 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1276
1277 self.assertEqual(max(1, 2L, 3.0), 3.0)
1278 self.assertEqual(max(1L, 2.0, 3), 3)
1279 self.assertEqual(max(1.0, 2, 3L), 3L)
1280
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001281 for stmt in (
1282 "max(key=int)", # no args
1283 "max(1, key=int)", # single arg not iterable
1284 "max(1, 2, keystone=int)", # wrong keyword
1285 "max(1, 2, key=int, abc=int)", # two many keywords
1286 "max(1, 2, key=1)", # keyfunc is not callable
1287 ):
Tim Peters7f061872004-12-07 21:17:46 +00001288 try:
1289 exec(stmt) in globals()
1290 except TypeError:
1291 pass
1292 else:
1293 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001294
1295 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1296 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1297 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1298
1299 data = [random.randrange(200) for i in range(100)]
1300 keys = dict((elem, random.randrange(50)) for elem in data)
1301 f = keys.__getitem__
1302 self.assertEqual(max(data, key=f),
1303 sorted(reversed(data), key=f)[-1])
1304
Walter Dörwald919497e2003-01-19 16:23:59 +00001305 def test_min(self):
1306 self.assertEqual(min('123123'), '1')
1307 self.assertEqual(min(1, 2, 3), 1)
1308 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1309 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1310
1311 self.assertEqual(min(1, 2L, 3.0), 1)
1312 self.assertEqual(min(1L, 2.0, 3), 1L)
1313 self.assertEqual(min(1.0, 2, 3L), 1.0)
1314
1315 self.assertRaises(TypeError, min)
1316 self.assertRaises(TypeError, min, 42)
1317 self.assertRaises(ValueError, min, ())
1318 class BadSeq:
1319 def __getitem__(self, index):
1320 raise ValueError
1321 self.assertRaises(ValueError, min, BadSeq())
1322 class BadNumber:
1323 def __cmp__(self, other):
1324 raise ValueError
1325 self.assertRaises(ValueError, min, (42, BadNumber()))
1326
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001327 for stmt in (
1328 "min(key=int)", # no args
1329 "min(1, key=int)", # single arg not iterable
1330 "min(1, 2, keystone=int)", # wrong keyword
1331 "min(1, 2, key=int, abc=int)", # two many keywords
1332 "min(1, 2, key=1)", # keyfunc is not callable
1333 ):
Tim Peters7f061872004-12-07 21:17:46 +00001334 try:
1335 exec(stmt) in globals()
1336 except TypeError:
1337 pass
1338 else:
1339 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001340
1341 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1342 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1343 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1344
1345 data = [random.randrange(200) for i in range(100)]
1346 keys = dict((elem, random.randrange(50)) for elem in data)
1347 f = keys.__getitem__
1348 self.assertEqual(min(data, key=f),
1349 sorted(data, key=f)[0])
1350
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 def test_oct(self):
1352 self.assertEqual(oct(100), '0144')
1353 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001354 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001355 self.assertEqual(oct(-100L), '-0144L')
1356 self.assertRaises(TypeError, oct, ())
1357
1358 def write_testfile(self):
1359 # NB the first 4 lines are also used to test input and raw_input, below
1360 fp = open(TESTFN, 'w')
1361 try:
1362 fp.write('1+1\n')
1363 fp.write('1+1\n')
1364 fp.write('The quick brown fox jumps over the lazy dog')
1365 fp.write('.\n')
1366 fp.write('Dear John\n')
1367 fp.write('XXX'*100)
1368 fp.write('YYY'*100)
1369 finally:
1370 fp.close()
1371
1372 def test_open(self):
1373 self.write_testfile()
1374 fp = open(TESTFN, 'r')
1375 try:
1376 self.assertEqual(fp.readline(4), '1+1\n')
1377 self.assertEqual(fp.readline(4), '1+1\n')
1378 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1379 self.assertEqual(fp.readline(4), 'Dear')
1380 self.assertEqual(fp.readline(100), ' John\n')
1381 self.assertEqual(fp.read(300), 'XXX'*100)
1382 self.assertEqual(fp.read(1000), 'YYY'*100)
1383 finally:
1384 fp.close()
1385 unlink(TESTFN)
1386
1387 def test_ord(self):
1388 self.assertEqual(ord(' '), 32)
1389 self.assertEqual(ord('A'), 65)
1390 self.assertEqual(ord('a'), 97)
1391 if have_unicode:
1392 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1393 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001394 if have_unicode:
1395 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001396
1397 def test_pow(self):
1398 self.assertEqual(pow(0,0), 1)
1399 self.assertEqual(pow(0,1), 0)
1400 self.assertEqual(pow(1,0), 1)
1401 self.assertEqual(pow(1,1), 1)
1402
1403 self.assertEqual(pow(2,0), 1)
1404 self.assertEqual(pow(2,10), 1024)
1405 self.assertEqual(pow(2,20), 1024*1024)
1406 self.assertEqual(pow(2,30), 1024*1024*1024)
1407
1408 self.assertEqual(pow(-2,0), 1)
1409 self.assertEqual(pow(-2,1), -2)
1410 self.assertEqual(pow(-2,2), 4)
1411 self.assertEqual(pow(-2,3), -8)
1412
1413 self.assertEqual(pow(0L,0), 1)
1414 self.assertEqual(pow(0L,1), 0)
1415 self.assertEqual(pow(1L,0), 1)
1416 self.assertEqual(pow(1L,1), 1)
1417
1418 self.assertEqual(pow(2L,0), 1)
1419 self.assertEqual(pow(2L,10), 1024)
1420 self.assertEqual(pow(2L,20), 1024*1024)
1421 self.assertEqual(pow(2L,30), 1024*1024*1024)
1422
1423 self.assertEqual(pow(-2L,0), 1)
1424 self.assertEqual(pow(-2L,1), -2)
1425 self.assertEqual(pow(-2L,2), 4)
1426 self.assertEqual(pow(-2L,3), -8)
1427
1428 self.assertAlmostEqual(pow(0.,0), 1.)
1429 self.assertAlmostEqual(pow(0.,1), 0.)
1430 self.assertAlmostEqual(pow(1.,0), 1.)
1431 self.assertAlmostEqual(pow(1.,1), 1.)
1432
1433 self.assertAlmostEqual(pow(2.,0), 1.)
1434 self.assertAlmostEqual(pow(2.,10), 1024.)
1435 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1436 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1437
1438 self.assertAlmostEqual(pow(-2.,0), 1.)
1439 self.assertAlmostEqual(pow(-2.,1), -2.)
1440 self.assertAlmostEqual(pow(-2.,2), 4.)
1441 self.assertAlmostEqual(pow(-2.,3), -8.)
1442
1443 for x in 2, 2L, 2.0:
1444 for y in 10, 10L, 10.0:
1445 for z in 1000, 1000L, 1000.0:
1446 if isinstance(x, float) or \
1447 isinstance(y, float) or \
1448 isinstance(z, float):
1449 self.assertRaises(TypeError, pow, x, y, z)
1450 else:
1451 self.assertAlmostEqual(pow(x, y, z), 24.0)
1452
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001453 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1454 self.assertAlmostEqual(pow(-1, 1./3), 0.5 + 0.8660254037844386j)
1455
Walter Dörwald919497e2003-01-19 16:23:59 +00001456 self.assertRaises(TypeError, pow, -1, -2, 3)
1457 self.assertRaises(ValueError, pow, 1, 2, 0)
1458 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1459 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Walter Dörwald919497e2003-01-19 16:23:59 +00001460
1461 self.assertRaises(TypeError, pow)
1462
1463 def test_range(self):
1464 self.assertEqual(range(3), [0, 1, 2])
1465 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1466 self.assertEqual(range(0), [])
1467 self.assertEqual(range(-3), [])
1468 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1469 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1470
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001471 # Now test range() with longs
1472 self.assertEqual(range(-2**100), [])
1473 self.assertEqual(range(0, -2**100), [])
1474 self.assertEqual(range(0, 2**100, -1), [])
1475 self.assertEqual(range(0, 2**100, -1), [])
1476
1477 a = long(10 * sys.maxint)
1478 b = long(100 * sys.maxint)
1479 c = long(50 * sys.maxint)
1480
1481 self.assertEqual(range(a, a+2), [a, a+1])
1482 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1483 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1484
1485 seq = range(a, b, c)
1486 self.assert_(a in seq)
1487 self.assert_(b not in seq)
1488 self.assertEqual(len(seq), 2)
1489
1490 seq = range(b, a, -c)
1491 self.assert_(b in seq)
1492 self.assert_(a not in seq)
1493 self.assertEqual(len(seq), 2)
1494
1495 seq = range(-a, -b, -c)
1496 self.assert_(-a in seq)
1497 self.assert_(-b not in seq)
1498 self.assertEqual(len(seq), 2)
1499
Walter Dörwald919497e2003-01-19 16:23:59 +00001500 self.assertRaises(TypeError, range)
1501 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1502 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001503 self.assertRaises(ValueError, range, a, a + 1, long(0))
1504
1505 class badzero(int):
1506 def __cmp__(self, other):
1507 raise RuntimeError
1508 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001509
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001510 # Reject floats when it would require PyLongs to represent.
1511 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001512 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001513
Walter Dörwald357981e2003-04-15 18:59:28 +00001514 self.assertRaises(TypeError, range, 0, "spam")
1515 self.assertRaises(TypeError, range, 0, 42, "spam")
1516
1517 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1518 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1519
Walter Dörwald919497e2003-01-19 16:23:59 +00001520 def test_input_and_raw_input(self):
1521 self.write_testfile()
1522 fp = open(TESTFN, 'r')
1523 savestdin = sys.stdin
1524 savestdout = sys.stdout # Eats the echo
1525 try:
1526 sys.stdin = fp
1527 sys.stdout = BitBucket()
1528 self.assertEqual(input(), 2)
1529 self.assertEqual(input('testing\n'), 2)
1530 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1531 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001532
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001533 # SF 1535165: don't segfault on closed stdin
1534 # sys.stdout must be a regular file for triggering
1535 sys.stdout = savestdout
1536 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001537 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001538
1539 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001540 sys.stdin = cStringIO.StringIO("NULL\0")
1541 self.assertRaises(TypeError, input, 42, 42)
1542 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1543 self.assertEqual(input(), 'whitespace')
1544 sys.stdin = cStringIO.StringIO()
1545 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001546
1547 # SF 876178: make sure input() respect future options.
1548 sys.stdin = cStringIO.StringIO('1/2')
1549 sys.stdout = cStringIO.StringIO()
1550 exec compile('print input()', 'test_builtin_tmp', 'exec')
1551 sys.stdin.seek(0, 0)
1552 exec compile('from __future__ import division;print input()',
1553 'test_builtin_tmp', 'exec')
1554 sys.stdin.seek(0, 0)
1555 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001556 # The result we expect depends on whether new division semantics
1557 # are already in effect.
1558 if 1/2 == 0:
1559 # This test was compiled with old semantics.
1560 expected = ['0', '0.5', '0']
1561 else:
1562 # This test was compiled with new semantics (e.g., -Qnew
1563 # was given on the command line.
1564 expected = ['0.5', '0.5', '0.5']
1565 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001566
Walter Dörwald919497e2003-01-19 16:23:59 +00001567 del sys.stdout
1568 self.assertRaises(RuntimeError, input, 'prompt')
1569 del sys.stdin
1570 self.assertRaises(RuntimeError, input, 'prompt')
1571 finally:
1572 sys.stdin = savestdin
1573 sys.stdout = savestdout
1574 fp.close()
1575 unlink(TESTFN)
1576
1577 def test_reduce(self):
1578 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1579 self.assertEqual(
1580 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1581 ['a','c','d','w']
1582 )
1583 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1584 self.assertEqual(
1585 reduce(lambda x, y: x*y, range(2,21), 1L),
1586 2432902008176640000L
1587 )
1588 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1589 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1590 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1591 self.assertRaises(TypeError, reduce)
1592 self.assertRaises(TypeError, reduce, 42, 42)
1593 self.assertRaises(TypeError, reduce, 42, 42, 42)
1594 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1595 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1596 self.assertRaises(TypeError, reduce, 42, (42, 42))
1597
1598 class BadSeq:
1599 def __getitem__(self, index):
1600 raise ValueError
1601 self.assertRaises(ValueError, reduce, 42, BadSeq())
1602
1603 def test_reload(self):
1604 import marshal
1605 reload(marshal)
1606 import string
1607 reload(string)
1608 ## import sys
1609 ## self.assertRaises(ImportError, reload, sys)
1610
1611 def test_repr(self):
1612 self.assertEqual(repr(''), '\'\'')
1613 self.assertEqual(repr(0), '0')
1614 self.assertEqual(repr(0L), '0L')
1615 self.assertEqual(repr(()), '()')
1616 self.assertEqual(repr([]), '[]')
1617 self.assertEqual(repr({}), '{}')
1618 a = []
1619 a.append(a)
1620 self.assertEqual(repr(a), '[[...]]')
1621 a = {}
1622 a[0] = a
1623 self.assertEqual(repr(a), '{0: {...}}')
1624
1625 def test_round(self):
1626 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001627 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001628 self.assertEqual(round(1.0), 1.0)
1629 self.assertEqual(round(10.0), 10.0)
1630 self.assertEqual(round(1000000000.0), 1000000000.0)
1631 self.assertEqual(round(1e20), 1e20)
1632
1633 self.assertEqual(round(-1.0), -1.0)
1634 self.assertEqual(round(-10.0), -10.0)
1635 self.assertEqual(round(-1000000000.0), -1000000000.0)
1636 self.assertEqual(round(-1e20), -1e20)
1637
1638 self.assertEqual(round(0.1), 0.0)
1639 self.assertEqual(round(1.1), 1.0)
1640 self.assertEqual(round(10.1), 10.0)
1641 self.assertEqual(round(1000000000.1), 1000000000.0)
1642
1643 self.assertEqual(round(-1.1), -1.0)
1644 self.assertEqual(round(-10.1), -10.0)
1645 self.assertEqual(round(-1000000000.1), -1000000000.0)
1646
1647 self.assertEqual(round(0.9), 1.0)
1648 self.assertEqual(round(9.9), 10.0)
1649 self.assertEqual(round(999999999.9), 1000000000.0)
1650
1651 self.assertEqual(round(-0.9), -1.0)
1652 self.assertEqual(round(-9.9), -10.0)
1653 self.assertEqual(round(-999999999.9), -1000000000.0)
1654
1655 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001656 self.assertEqual(type(round(-8.0, -1)), float)
1657
1658 self.assertEqual(type(round(-8.0, 0)), float)
1659 self.assertEqual(type(round(-8.0, 1)), float)
1660
1661 # Check even / odd rounding behaviour
1662 self.assertEqual(round(5.5), 6)
1663 self.assertEqual(round(6.5), 6)
1664 self.assertEqual(round(-5.5), -6)
1665 self.assertEqual(round(-6.5), -6)
1666
1667 # Check behavior on ints
1668 self.assertEqual(round(0), 0)
1669 self.assertEqual(round(8), 8)
1670 self.assertEqual(round(-8), -8)
1671 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1672 self.assertEqual(type(round(-8, -1)), float)
1673 self.assertEqual(type(round(-8, 0)), float)
1674 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001675
Georg Brandlccadf842006-03-31 18:54:53 +00001676 # test new kwargs
1677 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1678
Walter Dörwald919497e2003-01-19 16:23:59 +00001679 self.assertRaises(TypeError, round)
1680
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001681 # test generic rounding delegation for reals
1682 class TestRound(object):
1683 def __round__(self):
1684 return 23
1685
1686 class TestNoRound(object):
1687 pass
1688
1689 self.assertEqual(round(TestRound()), 23)
1690
1691 self.assertRaises(TypeError, round, 1, 2, 3)
1692 # XXX: This is not ideal, but see the comment in builtin_round().
1693 self.assertRaises(AttributeError, round, TestNoRound())
1694
1695 t = TestNoRound()
1696 t.__round__ = lambda *args: args
1697 self.assertEquals((), round(t))
1698 self.assertEquals((0,), round(t, 0))
1699
Walter Dörwald919497e2003-01-19 16:23:59 +00001700 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001701 setattr(sys, 'spam', 1)
1702 self.assertEqual(sys.spam, 1)
1703 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1704 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001705
1706 def test_str(self):
1707 self.assertEqual(str(''), '')
1708 self.assertEqual(str(0), '0')
1709 self.assertEqual(str(0L), '0')
1710 self.assertEqual(str(()), '()')
1711 self.assertEqual(str([]), '[]')
1712 self.assertEqual(str({}), '{}')
1713 a = []
1714 a.append(a)
1715 self.assertEqual(str(a), '[[...]]')
1716 a = {}
1717 a[0] = a
1718 self.assertEqual(str(a), '{0: {...}}')
1719
Alex Martellia70b1912003-04-22 08:12:33 +00001720 def test_sum(self):
1721 self.assertEqual(sum([]), 0)
1722 self.assertEqual(sum(range(2,8)), 27)
1723 self.assertEqual(sum(iter(range(2,8))), 27)
1724 self.assertEqual(sum(Squares(10)), 285)
1725 self.assertEqual(sum(iter(Squares(10))), 285)
1726 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1727
1728 self.assertRaises(TypeError, sum)
1729 self.assertRaises(TypeError, sum, 42)
1730 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1731 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1732 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1733 self.assertRaises(TypeError, sum, [{2:3}])
1734 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1735
1736 class BadSeq:
1737 def __getitem__(self, index):
1738 raise ValueError
1739 self.assertRaises(ValueError, sum, BadSeq())
1740
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001741 def test_trunc(self):
1742
1743 self.assertEqual(trunc(1), 1)
1744 self.assertEqual(trunc(-1), -1)
1745 self.assertEqual(type(trunc(1)), int)
1746 self.assertEqual(type(trunc(1.5)), int)
1747 self.assertEqual(trunc(1.5), 1)
1748 self.assertEqual(trunc(-1.5), -1)
1749 self.assertEqual(trunc(1.999999), 1)
1750 self.assertEqual(trunc(-1.999999), -1)
1751 self.assertEqual(trunc(-0.999999), -0)
1752 self.assertEqual(trunc(-100.999), -100)
1753
1754 class TestTrunc(object):
1755 def __trunc__(self):
1756 return 23
1757
1758 class TestNoTrunc(object):
1759 pass
1760
1761 self.assertEqual(trunc(TestTrunc()), 23)
1762
1763 self.assertRaises(TypeError, trunc)
1764 self.assertRaises(TypeError, trunc, 1, 2)
1765 # XXX: This is not ideal, but see the comment in builtin_trunc().
1766 self.assertRaises(AttributeError, trunc, TestNoTrunc())
1767
1768 t = TestNoTrunc()
1769 t.__trunc__ = lambda *args: args
1770 self.assertEquals((), trunc(t))
1771 self.assertRaises(TypeError, trunc, t, 0)
1772
Walter Dörwald919497e2003-01-19 16:23:59 +00001773 def test_tuple(self):
1774 self.assertEqual(tuple(()), ())
1775 t0_3 = (0, 1, 2, 3)
1776 t0_3_bis = tuple(t0_3)
1777 self.assert_(t0_3 is t0_3_bis)
1778 self.assertEqual(tuple([]), ())
1779 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1780 self.assertEqual(tuple(''), ())
1781 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1782
1783 def test_type(self):
1784 self.assertEqual(type(''), type('123'))
1785 self.assertNotEqual(type(''), type(()))
1786
1787 def test_unichr(self):
1788 if have_unicode:
1789 self.assertEqual(unichr(32), unicode(' '))
1790 self.assertEqual(unichr(65), unicode('A'))
1791 self.assertEqual(unichr(97), unicode('a'))
1792 self.assertEqual(
1793 unichr(sys.maxunicode),
1794 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1795 )
1796 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1797 self.assertRaises(TypeError, unichr)
1798
Guido van Rossumfee7b932005-01-16 00:21:28 +00001799 # We don't want self in vars(), so these are static methods
1800
1801 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001802 def get_vars_f0():
1803 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001804
Guido van Rossumfee7b932005-01-16 00:21:28 +00001805 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001806 def get_vars_f2():
1807 BuiltinTest.get_vars_f0()
1808 a = 1
1809 b = 2
1810 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001811
1812 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001813 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001814 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001815 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001816 self.assertEqual(self.get_vars_f0(), {})
1817 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1818 self.assertRaises(TypeError, vars, 42, 42)
1819 self.assertRaises(TypeError, vars, 42)
1820
1821 def test_zip(self):
1822 a = (1, 2, 3)
1823 b = (4, 5, 6)
1824 t = [(1, 4), (2, 5), (3, 6)]
1825 self.assertEqual(zip(a, b), t)
1826 b = [4, 5, 6]
1827 self.assertEqual(zip(a, b), t)
1828 b = (4, 5, 6, 7)
1829 self.assertEqual(zip(a, b), t)
1830 class I:
1831 def __getitem__(self, i):
1832 if i < 0 or i > 2: raise IndexError
1833 return i + 4
1834 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001835 self.assertEqual(zip(), [])
1836 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001837 self.assertRaises(TypeError, zip, None)
1838 class G:
1839 pass
1840 self.assertRaises(TypeError, zip, a, G())
1841
1842 # Make sure zip doesn't try to allocate a billion elements for the
1843 # result list when one of its arguments doesn't say how long it is.
1844 # A MemoryError is the most likely failure mode.
1845 class SequenceWithoutALength:
1846 def __getitem__(self, i):
1847 if i == 5:
1848 raise IndexError
1849 else:
1850 return i
1851 self.assertEqual(
1852 zip(SequenceWithoutALength(), xrange(2**30)),
1853 list(enumerate(range(5)))
1854 )
1855
1856 class BadSeq:
1857 def __getitem__(self, i):
1858 if i == 5:
1859 raise ValueError
1860 else:
1861 return i
1862 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1863
Raymond Hettinger64958a12003-12-17 20:43:33 +00001864class TestSorted(unittest.TestCase):
1865
1866 def test_basic(self):
1867 data = range(100)
1868 copy = data[:]
1869 random.shuffle(copy)
1870 self.assertEqual(data, sorted(copy))
1871 self.assertNotEqual(data, copy)
1872
1873 data.reverse()
1874 random.shuffle(copy)
1875 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1876 self.assertNotEqual(data, copy)
1877 random.shuffle(copy)
1878 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1879 self.assertNotEqual(data, copy)
1880 random.shuffle(copy)
1881 self.assertEqual(data, sorted(copy, reverse=1))
1882 self.assertNotEqual(data, copy)
1883
1884 def test_inputtypes(self):
1885 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001886 types = [list, tuple]
1887 if have_unicode:
1888 types.insert(0, unicode)
1889 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001890 self.assertEqual(sorted(s), sorted(T(s)))
1891
1892 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001893 types = [set, frozenset, list, tuple, dict.fromkeys]
1894 if have_unicode:
1895 types.insert(0, unicode)
1896 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001897 self.assertEqual(sorted(s), sorted(T(s)))
1898
1899 def test_baddecorator(self):
1900 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1901 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1902
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001903def test_main(verbose=None):
1904 test_classes = (BuiltinTest, TestSorted)
1905
1906 run_unittest(*test_classes)
1907
1908 # verify reference counting
1909 if verbose and hasattr(sys, "gettotalrefcount"):
1910 import gc
1911 counts = [None] * 5
1912 for i in xrange(len(counts)):
1913 run_unittest(*test_classes)
1914 gc.collect()
1915 counts[i] = sys.gettotalrefcount()
1916 print counts
1917
Walter Dörwald919497e2003-01-19 16:23:59 +00001918
1919if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001920 test_main(verbose=True)