blob: a1e2a1239b7b2e164cb788d261d424a6c04776a3 [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
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +00008import sys, warnings, cStringIO, random, rational, 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 ")
Guido van Rossum3b835492008-01-05 00:59:59 +0000622 self.assertRaises(ValueError, float, " +0x3.p-1 ")
623 self.assertRaises(ValueError, float, "++3.14")
624 self.assertRaises(ValueError, float, "+-3.14")
625 self.assertRaises(ValueError, float, "-+3.14")
626 self.assertRaises(ValueError, float, "--3.14")
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 if have_unicode:
628 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
629 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000630 # Implementation limitation in PyFloat_FromString()
631 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000632
Georg Brandlde9b6242006-04-30 11:13:56 +0000633 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000634 def test_float_with_comma(self):
635 # set locale to something that doesn't use '.' for the decimal point
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000636 # float must not accept the locale specific decimal point but
637 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000638 import locale
639 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000640 return
641
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000642 self.assertEqual(float(" 3.14 "), 3.14)
643 self.assertEqual(float("+3.14 "), 3.14)
644 self.assertEqual(float("-3.14 "), -3.14)
645 self.assertEqual(float(".14 "), .14)
646 self.assertEqual(float("3. "), 3.0)
647 self.assertEqual(float("3.e3 "), 3000.0)
648 self.assertEqual(float("3.2e3 "), 3200.0)
649 self.assertEqual(float("2.5e-1 "), 0.25)
650 self.assertEqual(float("5e-1"), 0.5)
651 self.assertRaises(ValueError, float, " 3,14 ")
652 self.assertRaises(ValueError, float, " +3,14 ")
653 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000654 self.assertRaises(ValueError, float, " 0x3.1 ")
655 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Guido van Rossum3b835492008-01-05 00:59:59 +0000656 self.assertRaises(ValueError, float, " +0x3.p-1 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000657 self.assertEqual(float(" 25.e-1 "), 2.5)
658 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000659
Brett Cannonc3647ac2005-04-26 03:45:26 +0000660 def test_floatconversion(self):
661 # Make sure that calls to __float__() work properly
662 class Foo0:
663 def __float__(self):
664 return 42.
665
666 class Foo1(object):
667 def __float__(self):
668 return 42.
669
670 class Foo2(float):
671 def __float__(self):
672 return 42.
673
674 class Foo3(float):
675 def __new__(cls, value=0.):
676 return float.__new__(cls, 2*value)
677
678 def __float__(self):
679 return self
680
681 class Foo4(float):
682 def __float__(self):
683 return 42
684
685 self.assertAlmostEqual(float(Foo0()), 42.)
686 self.assertAlmostEqual(float(Foo1()), 42.)
687 self.assertAlmostEqual(float(Foo2()), 42.)
688 self.assertAlmostEqual(float(Foo3(21)), 42.)
689 self.assertRaises(TypeError, float, Foo4(42))
690
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +0000691 def test_floatasratio(self):
692 R = rational.Rational
693 self.assertEqual(R(0, 1),
694 R(*float(0.0).as_integer_ratio()))
695 self.assertEqual(R(5, 2),
696 R(*float(2.5).as_integer_ratio()))
697 self.assertEqual(R(1, 2),
698 R(*float(0.5).as_integer_ratio()))
699 self.assertEqual(R(4728779608739021, 2251799813685248),
700 R(*float(2.1).as_integer_ratio()))
701 self.assertEqual(R(-4728779608739021, 2251799813685248),
702 R(*float(-2.1).as_integer_ratio()))
703 self.assertEqual(R(-2100, 1),
704 R(*float(-2100.0).as_integer_ratio()))
705
706 self.assertRaises(OverflowError, float('inf').as_integer_ratio)
707 self.assertRaises(OverflowError, float('-inf').as_integer_ratio)
708 self.assertRaises(ValueError, float('nan').as_integer_ratio)
709
Walter Dörwald919497e2003-01-19 16:23:59 +0000710 def test_getattr(self):
711 import sys
712 self.assert_(getattr(sys, 'stdout') is sys.stdout)
713 self.assertRaises(TypeError, getattr, sys, 1)
714 self.assertRaises(TypeError, getattr, sys, 1, "foo")
715 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000716 if have_unicode:
717 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000718
719 def test_hasattr(self):
720 import sys
721 self.assert_(hasattr(sys, 'stdout'))
722 self.assertRaises(TypeError, hasattr, sys, 1)
723 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000724 if have_unicode:
725 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000726
727 def test_hash(self):
728 hash(None)
729 self.assertEqual(hash(1), hash(1L))
730 self.assertEqual(hash(1), hash(1.0))
731 hash('spam')
732 if have_unicode:
733 self.assertEqual(hash('spam'), hash(unicode('spam')))
734 hash((0,1,2,3))
735 def f(): pass
736 self.assertRaises(TypeError, hash, [])
737 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000738 # Bug 1536021: Allow hash to return long objects
739 class X:
740 def __hash__(self):
741 return 2**100
742 self.assertEquals(type(hash(X())), int)
743 class Y(object):
744 def __hash__(self):
745 return 2**100
746 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000747 class Z(long):
748 def __hash__(self):
749 return self
750 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000751
752 def test_hex(self):
753 self.assertEqual(hex(16), '0x10')
754 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000755 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000756 self.assertEqual(hex(-16L), '-0x10L')
757 self.assertRaises(TypeError, hex, {})
758
759 def test_id(self):
760 id(None)
761 id(1)
762 id(1L)
763 id(1.0)
764 id('spam')
765 id((0,1,2,3))
766 id([0,1,2,3])
767 id({'spam': 1, 'eggs': 2, 'ham': 3})
768
769 # Test input() later, together with raw_input
770
771 def test_int(self):
772 self.assertEqual(int(314), 314)
773 self.assertEqual(int(3.14), 3)
774 self.assertEqual(int(314L), 314)
775 # Check that conversion from float truncates towards zero
776 self.assertEqual(int(-3.14), -3)
777 self.assertEqual(int(3.9), 3)
778 self.assertEqual(int(-3.9), -3)
779 self.assertEqual(int(3.5), 3)
780 self.assertEqual(int(-3.5), -3)
781 # Different base:
782 self.assertEqual(int("10",16), 16L)
783 if have_unicode:
784 self.assertEqual(int(unicode("10"),16), 16L)
785 # Test conversion from strings and various anomalies
786 for s, v in L:
787 for sign in "", "+", "-":
788 for prefix in "", " ", "\t", " \t\t ":
789 ss = prefix + sign + s
790 vv = v
791 if sign == "-" and v is not ValueError:
792 vv = -v
793 try:
794 self.assertEqual(int(ss), vv)
795 except v:
796 pass
797
Walter Dörwald70a6b492004-02-12 17:35:32 +0000798 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000799 x = int(s)
800 self.assertEqual(x+1, -sys.maxint)
801 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000802 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000803 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000804
805 # should return long
806 x = int(1e100)
807 self.assert_(isinstance(x, long))
808 x = int(-1e100)
809 self.assert_(isinstance(x, long))
810
811
812 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
813 # Worked by accident in Windows release build, but failed in debug build.
814 # Failed in all Linux builds.
815 x = -1-sys.maxint
816 self.assertEqual(x >> 1, x//2)
817
818 self.assertRaises(ValueError, int, '123\0')
819 self.assertRaises(ValueError, int, '53', 40)
820
Georg Brandl2c1375c2006-10-12 11:27:59 +0000821 # SF bug 1545497: embedded NULs were not detected with
822 # explicit base
823 self.assertRaises(ValueError, int, '123\0', 10)
824 self.assertRaises(ValueError, int, '123\x00 245', 20)
825
Walter Dörwald919497e2003-01-19 16:23:59 +0000826 x = int('1' * 600)
827 self.assert_(isinstance(x, long))
828
829 if have_unicode:
830 x = int(unichr(0x661) * 600)
831 self.assert_(isinstance(x, long))
832
833 self.assertRaises(TypeError, int, 1, 12)
834
835 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000836 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000837
Georg Brandl14404b62008-01-19 19:27:05 +0000838 # Bug 1679: "0x" is not a valid hex literal
839 self.assertRaises(ValueError, int, "0x", 16)
840 self.assertRaises(ValueError, int, "0x", 0)
841
842
Tim Petersb713ec22006-05-23 18:45:30 +0000843 # SF bug 1334662: int(string, base) wrong answers
844 # Various representations of 2**32 evaluated to 0
845 # rather than 2**32 in previous versions
846
847 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
848 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
849 self.assertEqual(int('10000000000000000', 4), 4294967296L)
850 self.assertEqual(int('32244002423141', 5), 4294967296L)
851 self.assertEqual(int('1550104015504', 6), 4294967296L)
852 self.assertEqual(int('211301422354', 7), 4294967296L)
853 self.assertEqual(int('40000000000', 8), 4294967296L)
854 self.assertEqual(int('12068657454', 9), 4294967296L)
855 self.assertEqual(int('4294967296', 10), 4294967296L)
856 self.assertEqual(int('1904440554', 11), 4294967296L)
857 self.assertEqual(int('9ba461594', 12), 4294967296L)
858 self.assertEqual(int('535a79889', 13), 4294967296L)
859 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
860 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
861 self.assertEqual(int('100000000', 16), 4294967296L)
862 self.assertEqual(int('a7ffda91', 17), 4294967296L)
863 self.assertEqual(int('704he7g4', 18), 4294967296L)
864 self.assertEqual(int('4f5aff66', 19), 4294967296L)
865 self.assertEqual(int('3723ai4g', 20), 4294967296L)
866 self.assertEqual(int('281d55i4', 21), 4294967296L)
867 self.assertEqual(int('1fj8b184', 22), 4294967296L)
868 self.assertEqual(int('1606k7ic', 23), 4294967296L)
869 self.assertEqual(int('mb994ag', 24), 4294967296L)
870 self.assertEqual(int('hek2mgl', 25), 4294967296L)
871 self.assertEqual(int('dnchbnm', 26), 4294967296L)
872 self.assertEqual(int('b28jpdm', 27), 4294967296L)
873 self.assertEqual(int('8pfgih4', 28), 4294967296L)
874 self.assertEqual(int('76beigg', 29), 4294967296L)
875 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
876 self.assertEqual(int('4q0jto4', 31), 4294967296L)
877 self.assertEqual(int('4000000', 32), 4294967296L)
878 self.assertEqual(int('3aokq94', 33), 4294967296L)
879 self.assertEqual(int('2qhxjli', 34), 4294967296L)
880 self.assertEqual(int('2br45qb', 35), 4294967296L)
881 self.assertEqual(int('1z141z4', 36), 4294967296L)
882
883 # SF bug 1334662: int(string, base) wrong answers
884 # Checks for proper evaluation of 2**32 + 1
885 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
886 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
887 self.assertEqual(int('10000000000000001', 4), 4294967297L)
888 self.assertEqual(int('32244002423142', 5), 4294967297L)
889 self.assertEqual(int('1550104015505', 6), 4294967297L)
890 self.assertEqual(int('211301422355', 7), 4294967297L)
891 self.assertEqual(int('40000000001', 8), 4294967297L)
892 self.assertEqual(int('12068657455', 9), 4294967297L)
893 self.assertEqual(int('4294967297', 10), 4294967297L)
894 self.assertEqual(int('1904440555', 11), 4294967297L)
895 self.assertEqual(int('9ba461595', 12), 4294967297L)
896 self.assertEqual(int('535a7988a', 13), 4294967297L)
897 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
898 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
899 self.assertEqual(int('100000001', 16), 4294967297L)
900 self.assertEqual(int('a7ffda92', 17), 4294967297L)
901 self.assertEqual(int('704he7g5', 18), 4294967297L)
902 self.assertEqual(int('4f5aff67', 19), 4294967297L)
903 self.assertEqual(int('3723ai4h', 20), 4294967297L)
904 self.assertEqual(int('281d55i5', 21), 4294967297L)
905 self.assertEqual(int('1fj8b185', 22), 4294967297L)
906 self.assertEqual(int('1606k7id', 23), 4294967297L)
907 self.assertEqual(int('mb994ah', 24), 4294967297L)
908 self.assertEqual(int('hek2mgm', 25), 4294967297L)
909 self.assertEqual(int('dnchbnn', 26), 4294967297L)
910 self.assertEqual(int('b28jpdn', 27), 4294967297L)
911 self.assertEqual(int('8pfgih5', 28), 4294967297L)
912 self.assertEqual(int('76beigh', 29), 4294967297L)
913 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
914 self.assertEqual(int('4q0jto5', 31), 4294967297L)
915 self.assertEqual(int('4000001', 32), 4294967297L)
916 self.assertEqual(int('3aokq95', 33), 4294967297L)
917 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
918 self.assertEqual(int('2br45qc', 35), 4294967297L)
919 self.assertEqual(int('1z141z5', 36), 4294967297L)
920
Brett Cannonc3647ac2005-04-26 03:45:26 +0000921 def test_intconversion(self):
922 # Test __int__()
923 class Foo0:
924 def __int__(self):
925 return 42
926
927 class Foo1(object):
928 def __int__(self):
929 return 42
930
931 class Foo2(int):
932 def __int__(self):
933 return 42
934
935 class Foo3(int):
936 def __int__(self):
937 return self
938
939 class Foo4(int):
940 def __int__(self):
941 return 42L
942
943 class Foo5(int):
944 def __int__(self):
945 return 42.
946
947 self.assertEqual(int(Foo0()), 42)
948 self.assertEqual(int(Foo1()), 42)
949 self.assertEqual(int(Foo2()), 42)
950 self.assertEqual(int(Foo3()), 0)
951 self.assertEqual(int(Foo4()), 42L)
952 self.assertRaises(TypeError, int, Foo5())
953
Walter Dörwald919497e2003-01-19 16:23:59 +0000954 def test_intern(self):
955 self.assertRaises(TypeError, intern)
956 s = "never interned before"
957 self.assert_(intern(s) is s)
958 s2 = s.swapcase().swapcase()
959 self.assert_(intern(s2) is s)
960
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000961 # Subclasses of string can't be interned, because they
962 # provide too much opportunity for insane things to happen.
963 # We don't want them in the interned dict and if they aren't
964 # actually interned, we don't want to create the appearance
965 # that they are by allowing intern() to succeeed.
966 class S(str):
967 def __hash__(self):
968 return 123
969
970 self.assertRaises(TypeError, intern, S("abc"))
971
972 # It's still safe to pass these strings to routines that
973 # call intern internally, e.g. PyObject_SetAttr().
974 s = S("abc")
975 setattr(s, s, s)
976 self.assertEqual(getattr(s, s), s)
977
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 def test_iter(self):
979 self.assertRaises(TypeError, iter)
980 self.assertRaises(TypeError, iter, 42, 42)
981 lists = [("1", "2"), ["1", "2"], "12"]
982 if have_unicode:
983 lists.append(unicode("12"))
984 for l in lists:
985 i = iter(l)
986 self.assertEqual(i.next(), '1')
987 self.assertEqual(i.next(), '2')
988 self.assertRaises(StopIteration, i.next)
989
990 def test_isinstance(self):
991 class C:
992 pass
993 class D(C):
994 pass
995 class E:
996 pass
997 c = C()
998 d = D()
999 e = E()
1000 self.assert_(isinstance(c, C))
1001 self.assert_(isinstance(d, C))
1002 self.assert_(not isinstance(e, C))
1003 self.assert_(not isinstance(c, D))
1004 self.assert_(not isinstance('foo', E))
1005 self.assertRaises(TypeError, isinstance, E, 'foo')
1006 self.assertRaises(TypeError, isinstance)
1007
1008 def test_issubclass(self):
1009 class C:
1010 pass
1011 class D(C):
1012 pass
1013 class E:
1014 pass
1015 c = C()
1016 d = D()
1017 e = E()
1018 self.assert_(issubclass(D, C))
1019 self.assert_(issubclass(C, C))
1020 self.assert_(not issubclass(C, D))
1021 self.assertRaises(TypeError, issubclass, 'foo', E)
1022 self.assertRaises(TypeError, issubclass, E, 'foo')
1023 self.assertRaises(TypeError, issubclass)
1024
1025 def test_len(self):
1026 self.assertEqual(len('123'), 3)
1027 self.assertEqual(len(()), 0)
1028 self.assertEqual(len((1, 2, 3, 4)), 4)
1029 self.assertEqual(len([1, 2, 3, 4]), 4)
1030 self.assertEqual(len({}), 0)
1031 self.assertEqual(len({'a':1, 'b': 2}), 2)
1032 class BadSeq:
1033 def __len__(self):
1034 raise ValueError
1035 self.assertRaises(ValueError, len, BadSeq())
1036
1037 def test_list(self):
1038 self.assertEqual(list([]), [])
1039 l0_3 = [0, 1, 2, 3]
1040 l0_3_bis = list(l0_3)
1041 self.assertEqual(l0_3, l0_3_bis)
1042 self.assert_(l0_3 is not l0_3_bis)
1043 self.assertEqual(list(()), [])
1044 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1045 self.assertEqual(list(''), [])
1046 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1047
1048 if sys.maxint == 0x7fffffff:
1049 # This test can currently only work on 32-bit machines.
1050 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1051 # XXX re-enabled.
1052 # Verify clearing of bug #556025.
1053 # This assumes that the max data size (sys.maxint) == max
1054 # address size this also assumes that the address size is at
1055 # least 4 bytes with 8 byte addresses, the bug is not well
1056 # tested
1057 #
1058 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1059 # earlier due to a newlib bug. See the following mailing list
1060 # thread for the details:
1061
1062 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1063 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1064
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001065 # This code used to segfault in Py2.4a3
1066 x = []
1067 x.extend(-y for y in x)
1068 self.assertEqual(x, [])
1069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 def test_long(self):
1071 self.assertEqual(long(314), 314L)
1072 self.assertEqual(long(3.14), 3L)
1073 self.assertEqual(long(314L), 314L)
1074 # Check that conversion from float truncates towards zero
1075 self.assertEqual(long(-3.14), -3L)
1076 self.assertEqual(long(3.9), 3L)
1077 self.assertEqual(long(-3.9), -3L)
1078 self.assertEqual(long(3.5), 3L)
1079 self.assertEqual(long(-3.5), -3L)
1080 self.assertEqual(long("-3"), -3L)
1081 if have_unicode:
1082 self.assertEqual(long(unicode("-3")), -3L)
1083 # Different base:
1084 self.assertEqual(long("10",16), 16L)
1085 if have_unicode:
1086 self.assertEqual(long(unicode("10"),16), 16L)
1087 # Check conversions from string (same test set as for int(), and then some)
1088 LL = [
1089 ('1' + '0'*20, 10L**20),
1090 ('1' + '0'*100, 10L**100)
1091 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001092 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001093 if have_unicode:
1094 L2 += [
1095 (unicode('1') + unicode('0')*20, 10L**20),
1096 (unicode('1') + unicode('0')*100, 10L**100),
1097 ]
1098 for s, v in L2 + LL:
1099 for sign in "", "+", "-":
1100 for prefix in "", " ", "\t", " \t\t ":
1101 ss = prefix + sign + s
1102 vv = v
1103 if sign == "-" and v is not ValueError:
1104 vv = -v
1105 try:
1106 self.assertEqual(long(ss), long(vv))
1107 except v:
1108 pass
1109
1110 self.assertRaises(ValueError, long, '123\0')
1111 self.assertRaises(ValueError, long, '53', 40)
1112 self.assertRaises(TypeError, long, 1, 12)
1113
Georg Brandl00cd8182007-03-06 18:41:12 +00001114 # SF patch #1638879: embedded NULs were not detected with
1115 # explicit base
1116 self.assertRaises(ValueError, long, '123\0', 10)
1117 self.assertRaises(ValueError, long, '123\x00 245', 20)
1118
Tim Peters696cf432006-05-24 21:10:40 +00001119 self.assertEqual(long('100000000000000000000000000000000', 2),
1120 4294967296)
1121 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1122 self.assertEqual(long('10000000000000000', 4), 4294967296)
1123 self.assertEqual(long('32244002423141', 5), 4294967296)
1124 self.assertEqual(long('1550104015504', 6), 4294967296)
1125 self.assertEqual(long('211301422354', 7), 4294967296)
1126 self.assertEqual(long('40000000000', 8), 4294967296)
1127 self.assertEqual(long('12068657454', 9), 4294967296)
1128 self.assertEqual(long('4294967296', 10), 4294967296)
1129 self.assertEqual(long('1904440554', 11), 4294967296)
1130 self.assertEqual(long('9ba461594', 12), 4294967296)
1131 self.assertEqual(long('535a79889', 13), 4294967296)
1132 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1133 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1134 self.assertEqual(long('100000000', 16), 4294967296)
1135 self.assertEqual(long('a7ffda91', 17), 4294967296)
1136 self.assertEqual(long('704he7g4', 18), 4294967296)
1137 self.assertEqual(long('4f5aff66', 19), 4294967296)
1138 self.assertEqual(long('3723ai4g', 20), 4294967296)
1139 self.assertEqual(long('281d55i4', 21), 4294967296)
1140 self.assertEqual(long('1fj8b184', 22), 4294967296)
1141 self.assertEqual(long('1606k7ic', 23), 4294967296)
1142 self.assertEqual(long('mb994ag', 24), 4294967296)
1143 self.assertEqual(long('hek2mgl', 25), 4294967296)
1144 self.assertEqual(long('dnchbnm', 26), 4294967296)
1145 self.assertEqual(long('b28jpdm', 27), 4294967296)
1146 self.assertEqual(long('8pfgih4', 28), 4294967296)
1147 self.assertEqual(long('76beigg', 29), 4294967296)
1148 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1149 self.assertEqual(long('4q0jto4', 31), 4294967296)
1150 self.assertEqual(long('4000000', 32), 4294967296)
1151 self.assertEqual(long('3aokq94', 33), 4294967296)
1152 self.assertEqual(long('2qhxjli', 34), 4294967296)
1153 self.assertEqual(long('2br45qb', 35), 4294967296)
1154 self.assertEqual(long('1z141z4', 36), 4294967296)
1155
1156 self.assertEqual(long('100000000000000000000000000000001', 2),
1157 4294967297)
1158 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1159 self.assertEqual(long('10000000000000001', 4), 4294967297)
1160 self.assertEqual(long('32244002423142', 5), 4294967297)
1161 self.assertEqual(long('1550104015505', 6), 4294967297)
1162 self.assertEqual(long('211301422355', 7), 4294967297)
1163 self.assertEqual(long('40000000001', 8), 4294967297)
1164 self.assertEqual(long('12068657455', 9), 4294967297)
1165 self.assertEqual(long('4294967297', 10), 4294967297)
1166 self.assertEqual(long('1904440555', 11), 4294967297)
1167 self.assertEqual(long('9ba461595', 12), 4294967297)
1168 self.assertEqual(long('535a7988a', 13), 4294967297)
1169 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1170 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1171 self.assertEqual(long('100000001', 16), 4294967297)
1172 self.assertEqual(long('a7ffda92', 17), 4294967297)
1173 self.assertEqual(long('704he7g5', 18), 4294967297)
1174 self.assertEqual(long('4f5aff67', 19), 4294967297)
1175 self.assertEqual(long('3723ai4h', 20), 4294967297)
1176 self.assertEqual(long('281d55i5', 21), 4294967297)
1177 self.assertEqual(long('1fj8b185', 22), 4294967297)
1178 self.assertEqual(long('1606k7id', 23), 4294967297)
1179 self.assertEqual(long('mb994ah', 24), 4294967297)
1180 self.assertEqual(long('hek2mgm', 25), 4294967297)
1181 self.assertEqual(long('dnchbnn', 26), 4294967297)
1182 self.assertEqual(long('b28jpdn', 27), 4294967297)
1183 self.assertEqual(long('8pfgih5', 28), 4294967297)
1184 self.assertEqual(long('76beigh', 29), 4294967297)
1185 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1186 self.assertEqual(long('4q0jto5', 31), 4294967297)
1187 self.assertEqual(long('4000001', 32), 4294967297)
1188 self.assertEqual(long('3aokq95', 33), 4294967297)
1189 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1190 self.assertEqual(long('2br45qc', 35), 4294967297)
1191 self.assertEqual(long('1z141z5', 36), 4294967297)
1192
1193
Brett Cannonc3647ac2005-04-26 03:45:26 +00001194 def test_longconversion(self):
1195 # Test __long__()
1196 class Foo0:
1197 def __long__(self):
1198 return 42L
1199
1200 class Foo1(object):
1201 def __long__(self):
1202 return 42L
1203
1204 class Foo2(long):
1205 def __long__(self):
1206 return 42L
1207
1208 class Foo3(long):
1209 def __long__(self):
1210 return self
1211
1212 class Foo4(long):
1213 def __long__(self):
1214 return 42
1215
1216 class Foo5(long):
1217 def __long__(self):
1218 return 42.
1219
1220 self.assertEqual(long(Foo0()), 42L)
1221 self.assertEqual(long(Foo1()), 42L)
1222 self.assertEqual(long(Foo2()), 42L)
1223 self.assertEqual(long(Foo3()), 0)
1224 self.assertEqual(long(Foo4()), 42)
1225 self.assertRaises(TypeError, long, Foo5())
1226
Walter Dörwald919497e2003-01-19 16:23:59 +00001227 def test_map(self):
1228 self.assertEqual(
1229 map(None, 'hello world'),
1230 ['h','e','l','l','o',' ','w','o','r','l','d']
1231 )
1232 self.assertEqual(
1233 map(None, 'abcd', 'efg'),
1234 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1235 )
1236 self.assertEqual(
1237 map(None, range(10)),
1238 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1239 )
1240 self.assertEqual(
1241 map(lambda x: x*x, range(1,4)),
1242 [1, 4, 9]
1243 )
1244 try:
1245 from math import sqrt
1246 except ImportError:
1247 def sqrt(x):
1248 return pow(x, 0.5)
1249 self.assertEqual(
1250 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1251 [[4.0, 2.0], [9.0, 3.0]]
1252 )
1253 self.assertEqual(
1254 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1255 [10, 4, 6]
1256 )
1257
1258 def plus(*v):
1259 accu = 0
1260 for i in v: accu = accu + i
1261 return accu
1262 self.assertEqual(
1263 map(plus, [1, 3, 7]),
1264 [1, 3, 7]
1265 )
1266 self.assertEqual(
1267 map(plus, [1, 3, 7], [4, 9, 2]),
1268 [1+4, 3+9, 7+2]
1269 )
1270 self.assertEqual(
1271 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1272 [1+4+1, 3+9+1, 7+2+0]
1273 )
1274 self.assertEqual(
1275 map(None, Squares(10)),
1276 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1277 )
1278 self.assertEqual(
1279 map(int, Squares(10)),
1280 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1281 )
1282 self.assertEqual(
1283 map(None, Squares(3), Squares(2)),
1284 [(0,0), (1,1), (4,None)]
1285 )
1286 self.assertEqual(
1287 map(max, Squares(3), Squares(2)),
1288 [0, 1, 4]
1289 )
1290 self.assertRaises(TypeError, map)
1291 self.assertRaises(TypeError, map, lambda x: x, 42)
1292 self.assertEqual(map(None, [42]), [42])
1293 class BadSeq:
1294 def __getitem__(self, index):
1295 raise ValueError
1296 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001297 def badfunc(x):
1298 raise RuntimeError
1299 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001300
1301 def test_max(self):
1302 self.assertEqual(max('123123'), '3')
1303 self.assertEqual(max(1, 2, 3), 3)
1304 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1305 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1306
1307 self.assertEqual(max(1, 2L, 3.0), 3.0)
1308 self.assertEqual(max(1L, 2.0, 3), 3)
1309 self.assertEqual(max(1.0, 2, 3L), 3L)
1310
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001311 for stmt in (
1312 "max(key=int)", # no args
1313 "max(1, key=int)", # single arg not iterable
1314 "max(1, 2, keystone=int)", # wrong keyword
1315 "max(1, 2, key=int, abc=int)", # two many keywords
1316 "max(1, 2, key=1)", # keyfunc is not callable
1317 ):
Tim Peters7f061872004-12-07 21:17:46 +00001318 try:
1319 exec(stmt) in globals()
1320 except TypeError:
1321 pass
1322 else:
1323 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001324
1325 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1326 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1327 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1328
1329 data = [random.randrange(200) for i in range(100)]
1330 keys = dict((elem, random.randrange(50)) for elem in data)
1331 f = keys.__getitem__
1332 self.assertEqual(max(data, key=f),
1333 sorted(reversed(data), key=f)[-1])
1334
Walter Dörwald919497e2003-01-19 16:23:59 +00001335 def test_min(self):
1336 self.assertEqual(min('123123'), '1')
1337 self.assertEqual(min(1, 2, 3), 1)
1338 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1339 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1340
1341 self.assertEqual(min(1, 2L, 3.0), 1)
1342 self.assertEqual(min(1L, 2.0, 3), 1L)
1343 self.assertEqual(min(1.0, 2, 3L), 1.0)
1344
1345 self.assertRaises(TypeError, min)
1346 self.assertRaises(TypeError, min, 42)
1347 self.assertRaises(ValueError, min, ())
1348 class BadSeq:
1349 def __getitem__(self, index):
1350 raise ValueError
1351 self.assertRaises(ValueError, min, BadSeq())
1352 class BadNumber:
1353 def __cmp__(self, other):
1354 raise ValueError
1355 self.assertRaises(ValueError, min, (42, BadNumber()))
1356
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001357 for stmt in (
1358 "min(key=int)", # no args
1359 "min(1, key=int)", # single arg not iterable
1360 "min(1, 2, keystone=int)", # wrong keyword
1361 "min(1, 2, key=int, abc=int)", # two many keywords
1362 "min(1, 2, key=1)", # keyfunc is not callable
1363 ):
Tim Peters7f061872004-12-07 21:17:46 +00001364 try:
1365 exec(stmt) in globals()
1366 except TypeError:
1367 pass
1368 else:
1369 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001370
1371 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1372 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1373 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1374
1375 data = [random.randrange(200) for i in range(100)]
1376 keys = dict((elem, random.randrange(50)) for elem in data)
1377 f = keys.__getitem__
1378 self.assertEqual(min(data, key=f),
1379 sorted(data, key=f)[0])
1380
Walter Dörwald919497e2003-01-19 16:23:59 +00001381 def test_oct(self):
1382 self.assertEqual(oct(100), '0144')
1383 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001384 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001385 self.assertEqual(oct(-100L), '-0144L')
1386 self.assertRaises(TypeError, oct, ())
1387
1388 def write_testfile(self):
1389 # NB the first 4 lines are also used to test input and raw_input, below
1390 fp = open(TESTFN, 'w')
1391 try:
1392 fp.write('1+1\n')
1393 fp.write('1+1\n')
1394 fp.write('The quick brown fox jumps over the lazy dog')
1395 fp.write('.\n')
1396 fp.write('Dear John\n')
1397 fp.write('XXX'*100)
1398 fp.write('YYY'*100)
1399 finally:
1400 fp.close()
1401
1402 def test_open(self):
1403 self.write_testfile()
1404 fp = open(TESTFN, 'r')
1405 try:
1406 self.assertEqual(fp.readline(4), '1+1\n')
1407 self.assertEqual(fp.readline(4), '1+1\n')
1408 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1409 self.assertEqual(fp.readline(4), 'Dear')
1410 self.assertEqual(fp.readline(100), ' John\n')
1411 self.assertEqual(fp.read(300), 'XXX'*100)
1412 self.assertEqual(fp.read(1000), 'YYY'*100)
1413 finally:
1414 fp.close()
1415 unlink(TESTFN)
1416
1417 def test_ord(self):
1418 self.assertEqual(ord(' '), 32)
1419 self.assertEqual(ord('A'), 65)
1420 self.assertEqual(ord('a'), 97)
1421 if have_unicode:
1422 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1423 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001424 if have_unicode:
1425 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001426
1427 def test_pow(self):
1428 self.assertEqual(pow(0,0), 1)
1429 self.assertEqual(pow(0,1), 0)
1430 self.assertEqual(pow(1,0), 1)
1431 self.assertEqual(pow(1,1), 1)
1432
1433 self.assertEqual(pow(2,0), 1)
1434 self.assertEqual(pow(2,10), 1024)
1435 self.assertEqual(pow(2,20), 1024*1024)
1436 self.assertEqual(pow(2,30), 1024*1024*1024)
1437
1438 self.assertEqual(pow(-2,0), 1)
1439 self.assertEqual(pow(-2,1), -2)
1440 self.assertEqual(pow(-2,2), 4)
1441 self.assertEqual(pow(-2,3), -8)
1442
1443 self.assertEqual(pow(0L,0), 1)
1444 self.assertEqual(pow(0L,1), 0)
1445 self.assertEqual(pow(1L,0), 1)
1446 self.assertEqual(pow(1L,1), 1)
1447
1448 self.assertEqual(pow(2L,0), 1)
1449 self.assertEqual(pow(2L,10), 1024)
1450 self.assertEqual(pow(2L,20), 1024*1024)
1451 self.assertEqual(pow(2L,30), 1024*1024*1024)
1452
1453 self.assertEqual(pow(-2L,0), 1)
1454 self.assertEqual(pow(-2L,1), -2)
1455 self.assertEqual(pow(-2L,2), 4)
1456 self.assertEqual(pow(-2L,3), -8)
1457
1458 self.assertAlmostEqual(pow(0.,0), 1.)
1459 self.assertAlmostEqual(pow(0.,1), 0.)
1460 self.assertAlmostEqual(pow(1.,0), 1.)
1461 self.assertAlmostEqual(pow(1.,1), 1.)
1462
1463 self.assertAlmostEqual(pow(2.,0), 1.)
1464 self.assertAlmostEqual(pow(2.,10), 1024.)
1465 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1466 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1467
1468 self.assertAlmostEqual(pow(-2.,0), 1.)
1469 self.assertAlmostEqual(pow(-2.,1), -2.)
1470 self.assertAlmostEqual(pow(-2.,2), 4.)
1471 self.assertAlmostEqual(pow(-2.,3), -8.)
1472
1473 for x in 2, 2L, 2.0:
1474 for y in 10, 10L, 10.0:
1475 for z in 1000, 1000L, 1000.0:
1476 if isinstance(x, float) or \
1477 isinstance(y, float) or \
1478 isinstance(z, float):
1479 self.assertRaises(TypeError, pow, x, y, z)
1480 else:
1481 self.assertAlmostEqual(pow(x, y, z), 24.0)
1482
1483 self.assertRaises(TypeError, pow, -1, -2, 3)
1484 self.assertRaises(ValueError, pow, 1, 2, 0)
1485 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1486 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001487 # Will return complex in 3.0:
1488 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001489
1490 self.assertRaises(TypeError, pow)
1491
1492 def test_range(self):
1493 self.assertEqual(range(3), [0, 1, 2])
1494 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1495 self.assertEqual(range(0), [])
1496 self.assertEqual(range(-3), [])
1497 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1498 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1499
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001500 # Now test range() with longs
1501 self.assertEqual(range(-2**100), [])
1502 self.assertEqual(range(0, -2**100), [])
1503 self.assertEqual(range(0, 2**100, -1), [])
1504 self.assertEqual(range(0, 2**100, -1), [])
1505
1506 a = long(10 * sys.maxint)
1507 b = long(100 * sys.maxint)
1508 c = long(50 * sys.maxint)
1509
1510 self.assertEqual(range(a, a+2), [a, a+1])
1511 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1512 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1513
1514 seq = range(a, b, c)
1515 self.assert_(a in seq)
1516 self.assert_(b not in seq)
1517 self.assertEqual(len(seq), 2)
1518
1519 seq = range(b, a, -c)
1520 self.assert_(b in seq)
1521 self.assert_(a not in seq)
1522 self.assertEqual(len(seq), 2)
1523
1524 seq = range(-a, -b, -c)
1525 self.assert_(-a in seq)
1526 self.assert_(-b not in seq)
1527 self.assertEqual(len(seq), 2)
1528
Walter Dörwald919497e2003-01-19 16:23:59 +00001529 self.assertRaises(TypeError, range)
1530 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1531 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001532 self.assertRaises(ValueError, range, a, a + 1, long(0))
1533
1534 class badzero(int):
1535 def __cmp__(self, other):
1536 raise RuntimeError
1537 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001538
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001539 # Reject floats when it would require PyLongs to represent.
1540 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001541 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001542
Walter Dörwald357981e2003-04-15 18:59:28 +00001543 self.assertRaises(TypeError, range, 0, "spam")
1544 self.assertRaises(TypeError, range, 0, 42, "spam")
1545
1546 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1547 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1548
Walter Dörwald919497e2003-01-19 16:23:59 +00001549 def test_input_and_raw_input(self):
1550 self.write_testfile()
1551 fp = open(TESTFN, 'r')
1552 savestdin = sys.stdin
1553 savestdout = sys.stdout # Eats the echo
1554 try:
1555 sys.stdin = fp
1556 sys.stdout = BitBucket()
1557 self.assertEqual(input(), 2)
1558 self.assertEqual(input('testing\n'), 2)
1559 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1560 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001561
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001562 # SF 1535165: don't segfault on closed stdin
1563 # sys.stdout must be a regular file for triggering
1564 sys.stdout = savestdout
1565 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001566 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001567
1568 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001569 sys.stdin = cStringIO.StringIO("NULL\0")
1570 self.assertRaises(TypeError, input, 42, 42)
1571 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1572 self.assertEqual(input(), 'whitespace')
1573 sys.stdin = cStringIO.StringIO()
1574 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001575
1576 # SF 876178: make sure input() respect future options.
1577 sys.stdin = cStringIO.StringIO('1/2')
1578 sys.stdout = cStringIO.StringIO()
1579 exec compile('print input()', 'test_builtin_tmp', 'exec')
1580 sys.stdin.seek(0, 0)
1581 exec compile('from __future__ import division;print input()',
1582 'test_builtin_tmp', 'exec')
1583 sys.stdin.seek(0, 0)
1584 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001585 # The result we expect depends on whether new division semantics
1586 # are already in effect.
1587 if 1/2 == 0:
1588 # This test was compiled with old semantics.
1589 expected = ['0', '0.5', '0']
1590 else:
1591 # This test was compiled with new semantics (e.g., -Qnew
1592 # was given on the command line.
1593 expected = ['0.5', '0.5', '0.5']
1594 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001595
Walter Dörwald919497e2003-01-19 16:23:59 +00001596 del sys.stdout
1597 self.assertRaises(RuntimeError, input, 'prompt')
1598 del sys.stdin
1599 self.assertRaises(RuntimeError, input, 'prompt')
1600 finally:
1601 sys.stdin = savestdin
1602 sys.stdout = savestdout
1603 fp.close()
1604 unlink(TESTFN)
1605
1606 def test_reduce(self):
1607 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1608 self.assertEqual(
1609 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1610 ['a','c','d','w']
1611 )
1612 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1613 self.assertEqual(
1614 reduce(lambda x, y: x*y, range(2,21), 1L),
1615 2432902008176640000L
1616 )
1617 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1618 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1619 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1620 self.assertRaises(TypeError, reduce)
1621 self.assertRaises(TypeError, reduce, 42, 42)
1622 self.assertRaises(TypeError, reduce, 42, 42, 42)
1623 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1624 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1625 self.assertRaises(TypeError, reduce, 42, (42, 42))
1626
1627 class BadSeq:
1628 def __getitem__(self, index):
1629 raise ValueError
1630 self.assertRaises(ValueError, reduce, 42, BadSeq())
1631
1632 def test_reload(self):
1633 import marshal
1634 reload(marshal)
1635 import string
1636 reload(string)
1637 ## import sys
1638 ## self.assertRaises(ImportError, reload, sys)
1639
1640 def test_repr(self):
1641 self.assertEqual(repr(''), '\'\'')
1642 self.assertEqual(repr(0), '0')
1643 self.assertEqual(repr(0L), '0L')
1644 self.assertEqual(repr(()), '()')
1645 self.assertEqual(repr([]), '[]')
1646 self.assertEqual(repr({}), '{}')
1647 a = []
1648 a.append(a)
1649 self.assertEqual(repr(a), '[[...]]')
1650 a = {}
1651 a[0] = a
1652 self.assertEqual(repr(a), '{0: {...}}')
1653
1654 def test_round(self):
1655 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001656 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001657 self.assertEqual(round(1.0), 1.0)
1658 self.assertEqual(round(10.0), 10.0)
1659 self.assertEqual(round(1000000000.0), 1000000000.0)
1660 self.assertEqual(round(1e20), 1e20)
1661
1662 self.assertEqual(round(-1.0), -1.0)
1663 self.assertEqual(round(-10.0), -10.0)
1664 self.assertEqual(round(-1000000000.0), -1000000000.0)
1665 self.assertEqual(round(-1e20), -1e20)
1666
1667 self.assertEqual(round(0.1), 0.0)
1668 self.assertEqual(round(1.1), 1.0)
1669 self.assertEqual(round(10.1), 10.0)
1670 self.assertEqual(round(1000000000.1), 1000000000.0)
1671
1672 self.assertEqual(round(-1.1), -1.0)
1673 self.assertEqual(round(-10.1), -10.0)
1674 self.assertEqual(round(-1000000000.1), -1000000000.0)
1675
1676 self.assertEqual(round(0.9), 1.0)
1677 self.assertEqual(round(9.9), 10.0)
1678 self.assertEqual(round(999999999.9), 1000000000.0)
1679
1680 self.assertEqual(round(-0.9), -1.0)
1681 self.assertEqual(round(-9.9), -10.0)
1682 self.assertEqual(round(-999999999.9), -1000000000.0)
1683
1684 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001685 self.assertEqual(type(round(-8.0, -1)), float)
1686
1687 self.assertEqual(type(round(-8.0, 0)), float)
1688 self.assertEqual(type(round(-8.0, 1)), float)
1689
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001690 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001691 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001692 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001693 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001694 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001695
1696 # Check behavior on ints
1697 self.assertEqual(round(0), 0)
1698 self.assertEqual(round(8), 8)
1699 self.assertEqual(round(-8), -8)
1700 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1701 self.assertEqual(type(round(-8, -1)), float)
1702 self.assertEqual(type(round(-8, 0)), float)
1703 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001704
Georg Brandlccadf842006-03-31 18:54:53 +00001705 # test new kwargs
1706 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1707
Walter Dörwald919497e2003-01-19 16:23:59 +00001708 self.assertRaises(TypeError, round)
1709
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001710 # test generic rounding delegation for reals
1711 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001712 def __float__(self):
1713 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001714
1715 class TestNoRound(object):
1716 pass
1717
1718 self.assertEqual(round(TestRound()), 23)
1719
1720 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001721 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001722
1723 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001724 t.__float__ = lambda *args: args
1725 self.assertRaises(TypeError, round, t)
1726 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001727
Walter Dörwald919497e2003-01-19 16:23:59 +00001728 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001729 setattr(sys, 'spam', 1)
1730 self.assertEqual(sys.spam, 1)
1731 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1732 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001733
1734 def test_str(self):
1735 self.assertEqual(str(''), '')
1736 self.assertEqual(str(0), '0')
1737 self.assertEqual(str(0L), '0')
1738 self.assertEqual(str(()), '()')
1739 self.assertEqual(str([]), '[]')
1740 self.assertEqual(str({}), '{}')
1741 a = []
1742 a.append(a)
1743 self.assertEqual(str(a), '[[...]]')
1744 a = {}
1745 a[0] = a
1746 self.assertEqual(str(a), '{0: {...}}')
1747
Alex Martellia70b1912003-04-22 08:12:33 +00001748 def test_sum(self):
1749 self.assertEqual(sum([]), 0)
1750 self.assertEqual(sum(range(2,8)), 27)
1751 self.assertEqual(sum(iter(range(2,8))), 27)
1752 self.assertEqual(sum(Squares(10)), 285)
1753 self.assertEqual(sum(iter(Squares(10))), 285)
1754 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1755
1756 self.assertRaises(TypeError, sum)
1757 self.assertRaises(TypeError, sum, 42)
1758 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1759 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1760 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1761 self.assertRaises(TypeError, sum, [{2:3}])
1762 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1763
1764 class BadSeq:
1765 def __getitem__(self, index):
1766 raise ValueError
1767 self.assertRaises(ValueError, sum, BadSeq())
1768
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001769 def test_trunc(self):
1770
1771 self.assertEqual(trunc(1), 1)
1772 self.assertEqual(trunc(-1), -1)
1773 self.assertEqual(type(trunc(1)), int)
1774 self.assertEqual(type(trunc(1.5)), int)
1775 self.assertEqual(trunc(1.5), 1)
1776 self.assertEqual(trunc(-1.5), -1)
1777 self.assertEqual(trunc(1.999999), 1)
1778 self.assertEqual(trunc(-1.999999), -1)
1779 self.assertEqual(trunc(-0.999999), -0)
1780 self.assertEqual(trunc(-100.999), -100)
1781
1782 class TestTrunc(object):
1783 def __trunc__(self):
1784 return 23
1785
1786 class TestNoTrunc(object):
1787 pass
1788
1789 self.assertEqual(trunc(TestTrunc()), 23)
1790
1791 self.assertRaises(TypeError, trunc)
1792 self.assertRaises(TypeError, trunc, 1, 2)
1793 # XXX: This is not ideal, but see the comment in builtin_trunc().
1794 self.assertRaises(AttributeError, trunc, TestNoTrunc())
1795
1796 t = TestNoTrunc()
1797 t.__trunc__ = lambda *args: args
1798 self.assertEquals((), trunc(t))
1799 self.assertRaises(TypeError, trunc, t, 0)
1800
Walter Dörwald919497e2003-01-19 16:23:59 +00001801 def test_tuple(self):
1802 self.assertEqual(tuple(()), ())
1803 t0_3 = (0, 1, 2, 3)
1804 t0_3_bis = tuple(t0_3)
1805 self.assert_(t0_3 is t0_3_bis)
1806 self.assertEqual(tuple([]), ())
1807 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1808 self.assertEqual(tuple(''), ())
1809 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1810
1811 def test_type(self):
1812 self.assertEqual(type(''), type('123'))
1813 self.assertNotEqual(type(''), type(()))
1814
1815 def test_unichr(self):
1816 if have_unicode:
1817 self.assertEqual(unichr(32), unicode(' '))
1818 self.assertEqual(unichr(65), unicode('A'))
1819 self.assertEqual(unichr(97), unicode('a'))
1820 self.assertEqual(
1821 unichr(sys.maxunicode),
1822 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1823 )
1824 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1825 self.assertRaises(TypeError, unichr)
1826
Guido van Rossumfee7b932005-01-16 00:21:28 +00001827 # We don't want self in vars(), so these are static methods
1828
1829 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001830 def get_vars_f0():
1831 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001832
Guido van Rossumfee7b932005-01-16 00:21:28 +00001833 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001834 def get_vars_f2():
1835 BuiltinTest.get_vars_f0()
1836 a = 1
1837 b = 2
1838 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001839
1840 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001841 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001842 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001843 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001844 self.assertEqual(self.get_vars_f0(), {})
1845 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1846 self.assertRaises(TypeError, vars, 42, 42)
1847 self.assertRaises(TypeError, vars, 42)
1848
1849 def test_zip(self):
1850 a = (1, 2, 3)
1851 b = (4, 5, 6)
1852 t = [(1, 4), (2, 5), (3, 6)]
1853 self.assertEqual(zip(a, b), t)
1854 b = [4, 5, 6]
1855 self.assertEqual(zip(a, b), t)
1856 b = (4, 5, 6, 7)
1857 self.assertEqual(zip(a, b), t)
1858 class I:
1859 def __getitem__(self, i):
1860 if i < 0 or i > 2: raise IndexError
1861 return i + 4
1862 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001863 self.assertEqual(zip(), [])
1864 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001865 self.assertRaises(TypeError, zip, None)
1866 class G:
1867 pass
1868 self.assertRaises(TypeError, zip, a, G())
1869
1870 # Make sure zip doesn't try to allocate a billion elements for the
1871 # result list when one of its arguments doesn't say how long it is.
1872 # A MemoryError is the most likely failure mode.
1873 class SequenceWithoutALength:
1874 def __getitem__(self, i):
1875 if i == 5:
1876 raise IndexError
1877 else:
1878 return i
1879 self.assertEqual(
1880 zip(SequenceWithoutALength(), xrange(2**30)),
1881 list(enumerate(range(5)))
1882 )
1883
1884 class BadSeq:
1885 def __getitem__(self, i):
1886 if i == 5:
1887 raise ValueError
1888 else:
1889 return i
1890 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1891
Raymond Hettinger64958a12003-12-17 20:43:33 +00001892class TestSorted(unittest.TestCase):
1893
1894 def test_basic(self):
1895 data = range(100)
1896 copy = data[:]
1897 random.shuffle(copy)
1898 self.assertEqual(data, sorted(copy))
1899 self.assertNotEqual(data, copy)
1900
1901 data.reverse()
1902 random.shuffle(copy)
1903 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1904 self.assertNotEqual(data, copy)
1905 random.shuffle(copy)
1906 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1907 self.assertNotEqual(data, copy)
1908 random.shuffle(copy)
1909 self.assertEqual(data, sorted(copy, reverse=1))
1910 self.assertNotEqual(data, copy)
1911
1912 def test_inputtypes(self):
1913 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001914 types = [list, tuple]
1915 if have_unicode:
1916 types.insert(0, unicode)
1917 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001918 self.assertEqual(sorted(s), sorted(T(s)))
1919
1920 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001921 types = [set, frozenset, list, tuple, dict.fromkeys]
1922 if have_unicode:
1923 types.insert(0, unicode)
1924 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001925 self.assertEqual(sorted(s), sorted(T(s)))
1926
1927 def test_baddecorator(self):
1928 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1929 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1930
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001931def test_main(verbose=None):
1932 test_classes = (BuiltinTest, TestSorted)
1933
1934 run_unittest(*test_classes)
1935
1936 # verify reference counting
1937 if verbose and hasattr(sys, "gettotalrefcount"):
1938 import gc
1939 counts = [None] * 5
1940 for i in xrange(len(counts)):
1941 run_unittest(*test_classes)
1942 gc.collect()
1943 counts[i] = sys.gettotalrefcount()
1944 print counts
1945
Walter Dörwald919497e2003-01-19 16:23:59 +00001946
1947if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001948 test_main(verbose=True)