blob: f7b7c0ce74d20712ee0376f25eeb84d3c919150b [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 ")
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
Walter Dörwald919497e2003-01-19 16:23:59 +0000691 def test_getattr(self):
692 import sys
693 self.assert_(getattr(sys, 'stdout') is sys.stdout)
694 self.assertRaises(TypeError, getattr, sys, 1)
695 self.assertRaises(TypeError, getattr, sys, 1, "foo")
696 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000697 if have_unicode:
698 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000699
700 def test_hasattr(self):
701 import sys
702 self.assert_(hasattr(sys, 'stdout'))
703 self.assertRaises(TypeError, hasattr, sys, 1)
704 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000705 if have_unicode:
706 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000707
708 def test_hash(self):
709 hash(None)
710 self.assertEqual(hash(1), hash(1L))
711 self.assertEqual(hash(1), hash(1.0))
712 hash('spam')
713 if have_unicode:
714 self.assertEqual(hash('spam'), hash(unicode('spam')))
715 hash((0,1,2,3))
716 def f(): pass
717 self.assertRaises(TypeError, hash, [])
718 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000719 # Bug 1536021: Allow hash to return long objects
720 class X:
721 def __hash__(self):
722 return 2**100
723 self.assertEquals(type(hash(X())), int)
724 class Y(object):
725 def __hash__(self):
726 return 2**100
727 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000728 class Z(long):
729 def __hash__(self):
730 return self
731 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000732
733 def test_hex(self):
734 self.assertEqual(hex(16), '0x10')
735 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000736 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000737 self.assertEqual(hex(-16L), '-0x10L')
738 self.assertRaises(TypeError, hex, {})
739
740 def test_id(self):
741 id(None)
742 id(1)
743 id(1L)
744 id(1.0)
745 id('spam')
746 id((0,1,2,3))
747 id([0,1,2,3])
748 id({'spam': 1, 'eggs': 2, 'ham': 3})
749
750 # Test input() later, together with raw_input
751
752 def test_int(self):
753 self.assertEqual(int(314), 314)
754 self.assertEqual(int(3.14), 3)
755 self.assertEqual(int(314L), 314)
756 # Check that conversion from float truncates towards zero
757 self.assertEqual(int(-3.14), -3)
758 self.assertEqual(int(3.9), 3)
759 self.assertEqual(int(-3.9), -3)
760 self.assertEqual(int(3.5), 3)
761 self.assertEqual(int(-3.5), -3)
762 # Different base:
763 self.assertEqual(int("10",16), 16L)
764 if have_unicode:
765 self.assertEqual(int(unicode("10"),16), 16L)
766 # Test conversion from strings and various anomalies
767 for s, v in L:
768 for sign in "", "+", "-":
769 for prefix in "", " ", "\t", " \t\t ":
770 ss = prefix + sign + s
771 vv = v
772 if sign == "-" and v is not ValueError:
773 vv = -v
774 try:
775 self.assertEqual(int(ss), vv)
776 except v:
777 pass
778
Walter Dörwald70a6b492004-02-12 17:35:32 +0000779 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000780 x = int(s)
781 self.assertEqual(x+1, -sys.maxint)
782 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000783 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000784 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000785
786 # should return long
787 x = int(1e100)
788 self.assert_(isinstance(x, long))
789 x = int(-1e100)
790 self.assert_(isinstance(x, long))
791
792
793 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
794 # Worked by accident in Windows release build, but failed in debug build.
795 # Failed in all Linux builds.
796 x = -1-sys.maxint
797 self.assertEqual(x >> 1, x//2)
798
799 self.assertRaises(ValueError, int, '123\0')
800 self.assertRaises(ValueError, int, '53', 40)
801
Georg Brandl2c1375c2006-10-12 11:27:59 +0000802 # SF bug 1545497: embedded NULs were not detected with
803 # explicit base
804 self.assertRaises(ValueError, int, '123\0', 10)
805 self.assertRaises(ValueError, int, '123\x00 245', 20)
806
Walter Dörwald919497e2003-01-19 16:23:59 +0000807 x = int('1' * 600)
808 self.assert_(isinstance(x, long))
809
810 if have_unicode:
811 x = int(unichr(0x661) * 600)
812 self.assert_(isinstance(x, long))
813
814 self.assertRaises(TypeError, int, 1, 12)
815
816 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000817 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000818
Georg Brandl14404b62008-01-19 19:27:05 +0000819 # Bug 1679: "0x" is not a valid hex literal
820 self.assertRaises(ValueError, int, "0x", 16)
821 self.assertRaises(ValueError, int, "0x", 0)
822
823
Tim Petersb713ec22006-05-23 18:45:30 +0000824 # SF bug 1334662: int(string, base) wrong answers
825 # Various representations of 2**32 evaluated to 0
826 # rather than 2**32 in previous versions
827
828 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
829 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
830 self.assertEqual(int('10000000000000000', 4), 4294967296L)
831 self.assertEqual(int('32244002423141', 5), 4294967296L)
832 self.assertEqual(int('1550104015504', 6), 4294967296L)
833 self.assertEqual(int('211301422354', 7), 4294967296L)
834 self.assertEqual(int('40000000000', 8), 4294967296L)
835 self.assertEqual(int('12068657454', 9), 4294967296L)
836 self.assertEqual(int('4294967296', 10), 4294967296L)
837 self.assertEqual(int('1904440554', 11), 4294967296L)
838 self.assertEqual(int('9ba461594', 12), 4294967296L)
839 self.assertEqual(int('535a79889', 13), 4294967296L)
840 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
841 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
842 self.assertEqual(int('100000000', 16), 4294967296L)
843 self.assertEqual(int('a7ffda91', 17), 4294967296L)
844 self.assertEqual(int('704he7g4', 18), 4294967296L)
845 self.assertEqual(int('4f5aff66', 19), 4294967296L)
846 self.assertEqual(int('3723ai4g', 20), 4294967296L)
847 self.assertEqual(int('281d55i4', 21), 4294967296L)
848 self.assertEqual(int('1fj8b184', 22), 4294967296L)
849 self.assertEqual(int('1606k7ic', 23), 4294967296L)
850 self.assertEqual(int('mb994ag', 24), 4294967296L)
851 self.assertEqual(int('hek2mgl', 25), 4294967296L)
852 self.assertEqual(int('dnchbnm', 26), 4294967296L)
853 self.assertEqual(int('b28jpdm', 27), 4294967296L)
854 self.assertEqual(int('8pfgih4', 28), 4294967296L)
855 self.assertEqual(int('76beigg', 29), 4294967296L)
856 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
857 self.assertEqual(int('4q0jto4', 31), 4294967296L)
858 self.assertEqual(int('4000000', 32), 4294967296L)
859 self.assertEqual(int('3aokq94', 33), 4294967296L)
860 self.assertEqual(int('2qhxjli', 34), 4294967296L)
861 self.assertEqual(int('2br45qb', 35), 4294967296L)
862 self.assertEqual(int('1z141z4', 36), 4294967296L)
863
864 # SF bug 1334662: int(string, base) wrong answers
865 # Checks for proper evaluation of 2**32 + 1
866 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
867 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
868 self.assertEqual(int('10000000000000001', 4), 4294967297L)
869 self.assertEqual(int('32244002423142', 5), 4294967297L)
870 self.assertEqual(int('1550104015505', 6), 4294967297L)
871 self.assertEqual(int('211301422355', 7), 4294967297L)
872 self.assertEqual(int('40000000001', 8), 4294967297L)
873 self.assertEqual(int('12068657455', 9), 4294967297L)
874 self.assertEqual(int('4294967297', 10), 4294967297L)
875 self.assertEqual(int('1904440555', 11), 4294967297L)
876 self.assertEqual(int('9ba461595', 12), 4294967297L)
877 self.assertEqual(int('535a7988a', 13), 4294967297L)
878 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
879 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
880 self.assertEqual(int('100000001', 16), 4294967297L)
881 self.assertEqual(int('a7ffda92', 17), 4294967297L)
882 self.assertEqual(int('704he7g5', 18), 4294967297L)
883 self.assertEqual(int('4f5aff67', 19), 4294967297L)
884 self.assertEqual(int('3723ai4h', 20), 4294967297L)
885 self.assertEqual(int('281d55i5', 21), 4294967297L)
886 self.assertEqual(int('1fj8b185', 22), 4294967297L)
887 self.assertEqual(int('1606k7id', 23), 4294967297L)
888 self.assertEqual(int('mb994ah', 24), 4294967297L)
889 self.assertEqual(int('hek2mgm', 25), 4294967297L)
890 self.assertEqual(int('dnchbnn', 26), 4294967297L)
891 self.assertEqual(int('b28jpdn', 27), 4294967297L)
892 self.assertEqual(int('8pfgih5', 28), 4294967297L)
893 self.assertEqual(int('76beigh', 29), 4294967297L)
894 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
895 self.assertEqual(int('4q0jto5', 31), 4294967297L)
896 self.assertEqual(int('4000001', 32), 4294967297L)
897 self.assertEqual(int('3aokq95', 33), 4294967297L)
898 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
899 self.assertEqual(int('2br45qc', 35), 4294967297L)
900 self.assertEqual(int('1z141z5', 36), 4294967297L)
901
Brett Cannonc3647ac2005-04-26 03:45:26 +0000902 def test_intconversion(self):
903 # Test __int__()
904 class Foo0:
905 def __int__(self):
906 return 42
907
908 class Foo1(object):
909 def __int__(self):
910 return 42
911
912 class Foo2(int):
913 def __int__(self):
914 return 42
915
916 class Foo3(int):
917 def __int__(self):
918 return self
919
920 class Foo4(int):
921 def __int__(self):
922 return 42L
923
924 class Foo5(int):
925 def __int__(self):
926 return 42.
927
928 self.assertEqual(int(Foo0()), 42)
929 self.assertEqual(int(Foo1()), 42)
930 self.assertEqual(int(Foo2()), 42)
931 self.assertEqual(int(Foo3()), 0)
932 self.assertEqual(int(Foo4()), 42L)
933 self.assertRaises(TypeError, int, Foo5())
934
Walter Dörwald919497e2003-01-19 16:23:59 +0000935 def test_intern(self):
936 self.assertRaises(TypeError, intern)
937 s = "never interned before"
938 self.assert_(intern(s) is s)
939 s2 = s.swapcase().swapcase()
940 self.assert_(intern(s2) is s)
941
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000942 # Subclasses of string can't be interned, because they
943 # provide too much opportunity for insane things to happen.
944 # We don't want them in the interned dict and if they aren't
945 # actually interned, we don't want to create the appearance
946 # that they are by allowing intern() to succeeed.
947 class S(str):
948 def __hash__(self):
949 return 123
950
951 self.assertRaises(TypeError, intern, S("abc"))
952
953 # It's still safe to pass these strings to routines that
954 # call intern internally, e.g. PyObject_SetAttr().
955 s = S("abc")
956 setattr(s, s, s)
957 self.assertEqual(getattr(s, s), s)
958
Walter Dörwald919497e2003-01-19 16:23:59 +0000959 def test_iter(self):
960 self.assertRaises(TypeError, iter)
961 self.assertRaises(TypeError, iter, 42, 42)
962 lists = [("1", "2"), ["1", "2"], "12"]
963 if have_unicode:
964 lists.append(unicode("12"))
965 for l in lists:
966 i = iter(l)
967 self.assertEqual(i.next(), '1')
968 self.assertEqual(i.next(), '2')
969 self.assertRaises(StopIteration, i.next)
970
971 def test_isinstance(self):
972 class C:
973 pass
974 class D(C):
975 pass
976 class E:
977 pass
978 c = C()
979 d = D()
980 e = E()
981 self.assert_(isinstance(c, C))
982 self.assert_(isinstance(d, C))
983 self.assert_(not isinstance(e, C))
984 self.assert_(not isinstance(c, D))
985 self.assert_(not isinstance('foo', E))
986 self.assertRaises(TypeError, isinstance, E, 'foo')
987 self.assertRaises(TypeError, isinstance)
988
989 def test_issubclass(self):
990 class C:
991 pass
992 class D(C):
993 pass
994 class E:
995 pass
996 c = C()
997 d = D()
998 e = E()
999 self.assert_(issubclass(D, C))
1000 self.assert_(issubclass(C, C))
1001 self.assert_(not issubclass(C, D))
1002 self.assertRaises(TypeError, issubclass, 'foo', E)
1003 self.assertRaises(TypeError, issubclass, E, 'foo')
1004 self.assertRaises(TypeError, issubclass)
1005
1006 def test_len(self):
1007 self.assertEqual(len('123'), 3)
1008 self.assertEqual(len(()), 0)
1009 self.assertEqual(len((1, 2, 3, 4)), 4)
1010 self.assertEqual(len([1, 2, 3, 4]), 4)
1011 self.assertEqual(len({}), 0)
1012 self.assertEqual(len({'a':1, 'b': 2}), 2)
1013 class BadSeq:
1014 def __len__(self):
1015 raise ValueError
1016 self.assertRaises(ValueError, len, BadSeq())
1017
1018 def test_list(self):
1019 self.assertEqual(list([]), [])
1020 l0_3 = [0, 1, 2, 3]
1021 l0_3_bis = list(l0_3)
1022 self.assertEqual(l0_3, l0_3_bis)
1023 self.assert_(l0_3 is not l0_3_bis)
1024 self.assertEqual(list(()), [])
1025 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1026 self.assertEqual(list(''), [])
1027 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1028
1029 if sys.maxint == 0x7fffffff:
1030 # This test can currently only work on 32-bit machines.
1031 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1032 # XXX re-enabled.
1033 # Verify clearing of bug #556025.
1034 # This assumes that the max data size (sys.maxint) == max
1035 # address size this also assumes that the address size is at
1036 # least 4 bytes with 8 byte addresses, the bug is not well
1037 # tested
1038 #
1039 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1040 # earlier due to a newlib bug. See the following mailing list
1041 # thread for the details:
1042
1043 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1044 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1045
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001046 # This code used to segfault in Py2.4a3
1047 x = []
1048 x.extend(-y for y in x)
1049 self.assertEqual(x, [])
1050
Walter Dörwald919497e2003-01-19 16:23:59 +00001051 def test_long(self):
1052 self.assertEqual(long(314), 314L)
1053 self.assertEqual(long(3.14), 3L)
1054 self.assertEqual(long(314L), 314L)
1055 # Check that conversion from float truncates towards zero
1056 self.assertEqual(long(-3.14), -3L)
1057 self.assertEqual(long(3.9), 3L)
1058 self.assertEqual(long(-3.9), -3L)
1059 self.assertEqual(long(3.5), 3L)
1060 self.assertEqual(long(-3.5), -3L)
1061 self.assertEqual(long("-3"), -3L)
1062 if have_unicode:
1063 self.assertEqual(long(unicode("-3")), -3L)
1064 # Different base:
1065 self.assertEqual(long("10",16), 16L)
1066 if have_unicode:
1067 self.assertEqual(long(unicode("10"),16), 16L)
1068 # Check conversions from string (same test set as for int(), and then some)
1069 LL = [
1070 ('1' + '0'*20, 10L**20),
1071 ('1' + '0'*100, 10L**100)
1072 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001073 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001074 if have_unicode:
1075 L2 += [
1076 (unicode('1') + unicode('0')*20, 10L**20),
1077 (unicode('1') + unicode('0')*100, 10L**100),
1078 ]
1079 for s, v in L2 + LL:
1080 for sign in "", "+", "-":
1081 for prefix in "", " ", "\t", " \t\t ":
1082 ss = prefix + sign + s
1083 vv = v
1084 if sign == "-" and v is not ValueError:
1085 vv = -v
1086 try:
1087 self.assertEqual(long(ss), long(vv))
1088 except v:
1089 pass
1090
1091 self.assertRaises(ValueError, long, '123\0')
1092 self.assertRaises(ValueError, long, '53', 40)
1093 self.assertRaises(TypeError, long, 1, 12)
1094
Georg Brandl00cd8182007-03-06 18:41:12 +00001095 # SF patch #1638879: embedded NULs were not detected with
1096 # explicit base
1097 self.assertRaises(ValueError, long, '123\0', 10)
1098 self.assertRaises(ValueError, long, '123\x00 245', 20)
1099
Tim Peters696cf432006-05-24 21:10:40 +00001100 self.assertEqual(long('100000000000000000000000000000000', 2),
1101 4294967296)
1102 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1103 self.assertEqual(long('10000000000000000', 4), 4294967296)
1104 self.assertEqual(long('32244002423141', 5), 4294967296)
1105 self.assertEqual(long('1550104015504', 6), 4294967296)
1106 self.assertEqual(long('211301422354', 7), 4294967296)
1107 self.assertEqual(long('40000000000', 8), 4294967296)
1108 self.assertEqual(long('12068657454', 9), 4294967296)
1109 self.assertEqual(long('4294967296', 10), 4294967296)
1110 self.assertEqual(long('1904440554', 11), 4294967296)
1111 self.assertEqual(long('9ba461594', 12), 4294967296)
1112 self.assertEqual(long('535a79889', 13), 4294967296)
1113 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1114 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1115 self.assertEqual(long('100000000', 16), 4294967296)
1116 self.assertEqual(long('a7ffda91', 17), 4294967296)
1117 self.assertEqual(long('704he7g4', 18), 4294967296)
1118 self.assertEqual(long('4f5aff66', 19), 4294967296)
1119 self.assertEqual(long('3723ai4g', 20), 4294967296)
1120 self.assertEqual(long('281d55i4', 21), 4294967296)
1121 self.assertEqual(long('1fj8b184', 22), 4294967296)
1122 self.assertEqual(long('1606k7ic', 23), 4294967296)
1123 self.assertEqual(long('mb994ag', 24), 4294967296)
1124 self.assertEqual(long('hek2mgl', 25), 4294967296)
1125 self.assertEqual(long('dnchbnm', 26), 4294967296)
1126 self.assertEqual(long('b28jpdm', 27), 4294967296)
1127 self.assertEqual(long('8pfgih4', 28), 4294967296)
1128 self.assertEqual(long('76beigg', 29), 4294967296)
1129 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1130 self.assertEqual(long('4q0jto4', 31), 4294967296)
1131 self.assertEqual(long('4000000', 32), 4294967296)
1132 self.assertEqual(long('3aokq94', 33), 4294967296)
1133 self.assertEqual(long('2qhxjli', 34), 4294967296)
1134 self.assertEqual(long('2br45qb', 35), 4294967296)
1135 self.assertEqual(long('1z141z4', 36), 4294967296)
1136
1137 self.assertEqual(long('100000000000000000000000000000001', 2),
1138 4294967297)
1139 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1140 self.assertEqual(long('10000000000000001', 4), 4294967297)
1141 self.assertEqual(long('32244002423142', 5), 4294967297)
1142 self.assertEqual(long('1550104015505', 6), 4294967297)
1143 self.assertEqual(long('211301422355', 7), 4294967297)
1144 self.assertEqual(long('40000000001', 8), 4294967297)
1145 self.assertEqual(long('12068657455', 9), 4294967297)
1146 self.assertEqual(long('4294967297', 10), 4294967297)
1147 self.assertEqual(long('1904440555', 11), 4294967297)
1148 self.assertEqual(long('9ba461595', 12), 4294967297)
1149 self.assertEqual(long('535a7988a', 13), 4294967297)
1150 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1151 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1152 self.assertEqual(long('100000001', 16), 4294967297)
1153 self.assertEqual(long('a7ffda92', 17), 4294967297)
1154 self.assertEqual(long('704he7g5', 18), 4294967297)
1155 self.assertEqual(long('4f5aff67', 19), 4294967297)
1156 self.assertEqual(long('3723ai4h', 20), 4294967297)
1157 self.assertEqual(long('281d55i5', 21), 4294967297)
1158 self.assertEqual(long('1fj8b185', 22), 4294967297)
1159 self.assertEqual(long('1606k7id', 23), 4294967297)
1160 self.assertEqual(long('mb994ah', 24), 4294967297)
1161 self.assertEqual(long('hek2mgm', 25), 4294967297)
1162 self.assertEqual(long('dnchbnn', 26), 4294967297)
1163 self.assertEqual(long('b28jpdn', 27), 4294967297)
1164 self.assertEqual(long('8pfgih5', 28), 4294967297)
1165 self.assertEqual(long('76beigh', 29), 4294967297)
1166 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1167 self.assertEqual(long('4q0jto5', 31), 4294967297)
1168 self.assertEqual(long('4000001', 32), 4294967297)
1169 self.assertEqual(long('3aokq95', 33), 4294967297)
1170 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1171 self.assertEqual(long('2br45qc', 35), 4294967297)
1172 self.assertEqual(long('1z141z5', 36), 4294967297)
1173
1174
Brett Cannonc3647ac2005-04-26 03:45:26 +00001175 def test_longconversion(self):
1176 # Test __long__()
1177 class Foo0:
1178 def __long__(self):
1179 return 42L
1180
1181 class Foo1(object):
1182 def __long__(self):
1183 return 42L
1184
1185 class Foo2(long):
1186 def __long__(self):
1187 return 42L
1188
1189 class Foo3(long):
1190 def __long__(self):
1191 return self
1192
1193 class Foo4(long):
1194 def __long__(self):
1195 return 42
1196
1197 class Foo5(long):
1198 def __long__(self):
1199 return 42.
1200
1201 self.assertEqual(long(Foo0()), 42L)
1202 self.assertEqual(long(Foo1()), 42L)
1203 self.assertEqual(long(Foo2()), 42L)
1204 self.assertEqual(long(Foo3()), 0)
1205 self.assertEqual(long(Foo4()), 42)
1206 self.assertRaises(TypeError, long, Foo5())
1207
Walter Dörwald919497e2003-01-19 16:23:59 +00001208 def test_map(self):
1209 self.assertEqual(
1210 map(None, 'hello world'),
1211 ['h','e','l','l','o',' ','w','o','r','l','d']
1212 )
1213 self.assertEqual(
1214 map(None, 'abcd', 'efg'),
1215 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1216 )
1217 self.assertEqual(
1218 map(None, range(10)),
1219 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1220 )
1221 self.assertEqual(
1222 map(lambda x: x*x, range(1,4)),
1223 [1, 4, 9]
1224 )
1225 try:
1226 from math import sqrt
1227 except ImportError:
1228 def sqrt(x):
1229 return pow(x, 0.5)
1230 self.assertEqual(
1231 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1232 [[4.0, 2.0], [9.0, 3.0]]
1233 )
1234 self.assertEqual(
1235 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1236 [10, 4, 6]
1237 )
1238
1239 def plus(*v):
1240 accu = 0
1241 for i in v: accu = accu + i
1242 return accu
1243 self.assertEqual(
1244 map(plus, [1, 3, 7]),
1245 [1, 3, 7]
1246 )
1247 self.assertEqual(
1248 map(plus, [1, 3, 7], [4, 9, 2]),
1249 [1+4, 3+9, 7+2]
1250 )
1251 self.assertEqual(
1252 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1253 [1+4+1, 3+9+1, 7+2+0]
1254 )
1255 self.assertEqual(
1256 map(None, Squares(10)),
1257 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1258 )
1259 self.assertEqual(
1260 map(int, Squares(10)),
1261 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1262 )
1263 self.assertEqual(
1264 map(None, Squares(3), Squares(2)),
1265 [(0,0), (1,1), (4,None)]
1266 )
1267 self.assertEqual(
1268 map(max, Squares(3), Squares(2)),
1269 [0, 1, 4]
1270 )
1271 self.assertRaises(TypeError, map)
1272 self.assertRaises(TypeError, map, lambda x: x, 42)
1273 self.assertEqual(map(None, [42]), [42])
1274 class BadSeq:
1275 def __getitem__(self, index):
1276 raise ValueError
1277 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001278 def badfunc(x):
1279 raise RuntimeError
1280 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001281
1282 def test_max(self):
1283 self.assertEqual(max('123123'), '3')
1284 self.assertEqual(max(1, 2, 3), 3)
1285 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1286 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1287
1288 self.assertEqual(max(1, 2L, 3.0), 3.0)
1289 self.assertEqual(max(1L, 2.0, 3), 3)
1290 self.assertEqual(max(1.0, 2, 3L), 3L)
1291
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001292 for stmt in (
1293 "max(key=int)", # no args
1294 "max(1, key=int)", # single arg not iterable
1295 "max(1, 2, keystone=int)", # wrong keyword
1296 "max(1, 2, key=int, abc=int)", # two many keywords
1297 "max(1, 2, key=1)", # keyfunc is not callable
1298 ):
Tim Peters7f061872004-12-07 21:17:46 +00001299 try:
1300 exec(stmt) in globals()
1301 except TypeError:
1302 pass
1303 else:
1304 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001305
1306 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1307 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1308 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1309
1310 data = [random.randrange(200) for i in range(100)]
1311 keys = dict((elem, random.randrange(50)) for elem in data)
1312 f = keys.__getitem__
1313 self.assertEqual(max(data, key=f),
1314 sorted(reversed(data), key=f)[-1])
1315
Walter Dörwald919497e2003-01-19 16:23:59 +00001316 def test_min(self):
1317 self.assertEqual(min('123123'), '1')
1318 self.assertEqual(min(1, 2, 3), 1)
1319 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1320 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1321
1322 self.assertEqual(min(1, 2L, 3.0), 1)
1323 self.assertEqual(min(1L, 2.0, 3), 1L)
1324 self.assertEqual(min(1.0, 2, 3L), 1.0)
1325
1326 self.assertRaises(TypeError, min)
1327 self.assertRaises(TypeError, min, 42)
1328 self.assertRaises(ValueError, min, ())
1329 class BadSeq:
1330 def __getitem__(self, index):
1331 raise ValueError
1332 self.assertRaises(ValueError, min, BadSeq())
1333 class BadNumber:
1334 def __cmp__(self, other):
1335 raise ValueError
1336 self.assertRaises(ValueError, min, (42, BadNumber()))
1337
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001338 for stmt in (
1339 "min(key=int)", # no args
1340 "min(1, key=int)", # single arg not iterable
1341 "min(1, 2, keystone=int)", # wrong keyword
1342 "min(1, 2, key=int, abc=int)", # two many keywords
1343 "min(1, 2, key=1)", # keyfunc is not callable
1344 ):
Tim Peters7f061872004-12-07 21:17:46 +00001345 try:
1346 exec(stmt) in globals()
1347 except TypeError:
1348 pass
1349 else:
1350 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001351
1352 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1353 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1354 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1355
1356 data = [random.randrange(200) for i in range(100)]
1357 keys = dict((elem, random.randrange(50)) for elem in data)
1358 f = keys.__getitem__
1359 self.assertEqual(min(data, key=f),
1360 sorted(data, key=f)[0])
1361
Walter Dörwald919497e2003-01-19 16:23:59 +00001362 def test_oct(self):
1363 self.assertEqual(oct(100), '0144')
1364 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001365 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001366 self.assertEqual(oct(-100L), '-0144L')
1367 self.assertRaises(TypeError, oct, ())
1368
1369 def write_testfile(self):
1370 # NB the first 4 lines are also used to test input and raw_input, below
1371 fp = open(TESTFN, 'w')
1372 try:
1373 fp.write('1+1\n')
1374 fp.write('1+1\n')
1375 fp.write('The quick brown fox jumps over the lazy dog')
1376 fp.write('.\n')
1377 fp.write('Dear John\n')
1378 fp.write('XXX'*100)
1379 fp.write('YYY'*100)
1380 finally:
1381 fp.close()
1382
1383 def test_open(self):
1384 self.write_testfile()
1385 fp = open(TESTFN, 'r')
1386 try:
1387 self.assertEqual(fp.readline(4), '1+1\n')
1388 self.assertEqual(fp.readline(4), '1+1\n')
1389 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1390 self.assertEqual(fp.readline(4), 'Dear')
1391 self.assertEqual(fp.readline(100), ' John\n')
1392 self.assertEqual(fp.read(300), 'XXX'*100)
1393 self.assertEqual(fp.read(1000), 'YYY'*100)
1394 finally:
1395 fp.close()
1396 unlink(TESTFN)
1397
1398 def test_ord(self):
1399 self.assertEqual(ord(' '), 32)
1400 self.assertEqual(ord('A'), 65)
1401 self.assertEqual(ord('a'), 97)
1402 if have_unicode:
1403 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1404 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001405 if have_unicode:
1406 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001407
1408 def test_pow(self):
1409 self.assertEqual(pow(0,0), 1)
1410 self.assertEqual(pow(0,1), 0)
1411 self.assertEqual(pow(1,0), 1)
1412 self.assertEqual(pow(1,1), 1)
1413
1414 self.assertEqual(pow(2,0), 1)
1415 self.assertEqual(pow(2,10), 1024)
1416 self.assertEqual(pow(2,20), 1024*1024)
1417 self.assertEqual(pow(2,30), 1024*1024*1024)
1418
1419 self.assertEqual(pow(-2,0), 1)
1420 self.assertEqual(pow(-2,1), -2)
1421 self.assertEqual(pow(-2,2), 4)
1422 self.assertEqual(pow(-2,3), -8)
1423
1424 self.assertEqual(pow(0L,0), 1)
1425 self.assertEqual(pow(0L,1), 0)
1426 self.assertEqual(pow(1L,0), 1)
1427 self.assertEqual(pow(1L,1), 1)
1428
1429 self.assertEqual(pow(2L,0), 1)
1430 self.assertEqual(pow(2L,10), 1024)
1431 self.assertEqual(pow(2L,20), 1024*1024)
1432 self.assertEqual(pow(2L,30), 1024*1024*1024)
1433
1434 self.assertEqual(pow(-2L,0), 1)
1435 self.assertEqual(pow(-2L,1), -2)
1436 self.assertEqual(pow(-2L,2), 4)
1437 self.assertEqual(pow(-2L,3), -8)
1438
1439 self.assertAlmostEqual(pow(0.,0), 1.)
1440 self.assertAlmostEqual(pow(0.,1), 0.)
1441 self.assertAlmostEqual(pow(1.,0), 1.)
1442 self.assertAlmostEqual(pow(1.,1), 1.)
1443
1444 self.assertAlmostEqual(pow(2.,0), 1.)
1445 self.assertAlmostEqual(pow(2.,10), 1024.)
1446 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1447 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1448
1449 self.assertAlmostEqual(pow(-2.,0), 1.)
1450 self.assertAlmostEqual(pow(-2.,1), -2.)
1451 self.assertAlmostEqual(pow(-2.,2), 4.)
1452 self.assertAlmostEqual(pow(-2.,3), -8.)
1453
1454 for x in 2, 2L, 2.0:
1455 for y in 10, 10L, 10.0:
1456 for z in 1000, 1000L, 1000.0:
1457 if isinstance(x, float) or \
1458 isinstance(y, float) or \
1459 isinstance(z, float):
1460 self.assertRaises(TypeError, pow, x, y, z)
1461 else:
1462 self.assertAlmostEqual(pow(x, y, z), 24.0)
1463
1464 self.assertRaises(TypeError, pow, -1, -2, 3)
1465 self.assertRaises(ValueError, pow, 1, 2, 0)
1466 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1467 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001468 # Will return complex in 3.0:
1469 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001470
1471 self.assertRaises(TypeError, pow)
1472
1473 def test_range(self):
1474 self.assertEqual(range(3), [0, 1, 2])
1475 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1476 self.assertEqual(range(0), [])
1477 self.assertEqual(range(-3), [])
1478 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1479 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1480
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001481 # Now test range() with longs
1482 self.assertEqual(range(-2**100), [])
1483 self.assertEqual(range(0, -2**100), [])
1484 self.assertEqual(range(0, 2**100, -1), [])
1485 self.assertEqual(range(0, 2**100, -1), [])
1486
1487 a = long(10 * sys.maxint)
1488 b = long(100 * sys.maxint)
1489 c = long(50 * sys.maxint)
1490
1491 self.assertEqual(range(a, a+2), [a, a+1])
1492 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1493 self.assertEqual(range(a+4, a, -2), [a+4, a+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
1500 seq = range(b, a, -c)
1501 self.assert_(b in seq)
1502 self.assert_(a not in seq)
1503 self.assertEqual(len(seq), 2)
1504
1505 seq = range(-a, -b, -c)
1506 self.assert_(-a in seq)
1507 self.assert_(-b not in seq)
1508 self.assertEqual(len(seq), 2)
1509
Walter Dörwald919497e2003-01-19 16:23:59 +00001510 self.assertRaises(TypeError, range)
1511 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1512 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001513 self.assertRaises(ValueError, range, a, a + 1, long(0))
1514
1515 class badzero(int):
1516 def __cmp__(self, other):
1517 raise RuntimeError
1518 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001519
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001520 # Reject floats when it would require PyLongs to represent.
1521 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001522 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001523
Walter Dörwald357981e2003-04-15 18:59:28 +00001524 self.assertRaises(TypeError, range, 0, "spam")
1525 self.assertRaises(TypeError, range, 0, 42, "spam")
1526
1527 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1528 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1529
Walter Dörwald919497e2003-01-19 16:23:59 +00001530 def test_input_and_raw_input(self):
1531 self.write_testfile()
1532 fp = open(TESTFN, 'r')
1533 savestdin = sys.stdin
1534 savestdout = sys.stdout # Eats the echo
1535 try:
1536 sys.stdin = fp
1537 sys.stdout = BitBucket()
1538 self.assertEqual(input(), 2)
1539 self.assertEqual(input('testing\n'), 2)
1540 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1541 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001542
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001543 # SF 1535165: don't segfault on closed stdin
1544 # sys.stdout must be a regular file for triggering
1545 sys.stdout = savestdout
1546 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001547 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001548
1549 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001550 sys.stdin = cStringIO.StringIO("NULL\0")
1551 self.assertRaises(TypeError, input, 42, 42)
1552 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1553 self.assertEqual(input(), 'whitespace')
1554 sys.stdin = cStringIO.StringIO()
1555 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001556
1557 # SF 876178: make sure input() respect future options.
1558 sys.stdin = cStringIO.StringIO('1/2')
1559 sys.stdout = cStringIO.StringIO()
1560 exec compile('print input()', 'test_builtin_tmp', 'exec')
1561 sys.stdin.seek(0, 0)
1562 exec compile('from __future__ import division;print input()',
1563 'test_builtin_tmp', 'exec')
1564 sys.stdin.seek(0, 0)
1565 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001566 # The result we expect depends on whether new division semantics
1567 # are already in effect.
1568 if 1/2 == 0:
1569 # This test was compiled with old semantics.
1570 expected = ['0', '0.5', '0']
1571 else:
1572 # This test was compiled with new semantics (e.g., -Qnew
1573 # was given on the command line.
1574 expected = ['0.5', '0.5', '0.5']
1575 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001576
Walter Dörwald919497e2003-01-19 16:23:59 +00001577 del sys.stdout
1578 self.assertRaises(RuntimeError, input, 'prompt')
1579 del sys.stdin
1580 self.assertRaises(RuntimeError, input, 'prompt')
1581 finally:
1582 sys.stdin = savestdin
1583 sys.stdout = savestdout
1584 fp.close()
1585 unlink(TESTFN)
1586
1587 def test_reduce(self):
1588 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1589 self.assertEqual(
1590 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1591 ['a','c','d','w']
1592 )
1593 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1594 self.assertEqual(
1595 reduce(lambda x, y: x*y, range(2,21), 1L),
1596 2432902008176640000L
1597 )
1598 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1599 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1600 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1601 self.assertRaises(TypeError, reduce)
1602 self.assertRaises(TypeError, reduce, 42, 42)
1603 self.assertRaises(TypeError, reduce, 42, 42, 42)
1604 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1605 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1606 self.assertRaises(TypeError, reduce, 42, (42, 42))
1607
1608 class BadSeq:
1609 def __getitem__(self, index):
1610 raise ValueError
1611 self.assertRaises(ValueError, reduce, 42, BadSeq())
1612
1613 def test_reload(self):
1614 import marshal
1615 reload(marshal)
1616 import string
1617 reload(string)
1618 ## import sys
1619 ## self.assertRaises(ImportError, reload, sys)
1620
1621 def test_repr(self):
1622 self.assertEqual(repr(''), '\'\'')
1623 self.assertEqual(repr(0), '0')
1624 self.assertEqual(repr(0L), '0L')
1625 self.assertEqual(repr(()), '()')
1626 self.assertEqual(repr([]), '[]')
1627 self.assertEqual(repr({}), '{}')
1628 a = []
1629 a.append(a)
1630 self.assertEqual(repr(a), '[[...]]')
1631 a = {}
1632 a[0] = a
1633 self.assertEqual(repr(a), '{0: {...}}')
1634
1635 def test_round(self):
1636 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001637 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001638 self.assertEqual(round(1.0), 1.0)
1639 self.assertEqual(round(10.0), 10.0)
1640 self.assertEqual(round(1000000000.0), 1000000000.0)
1641 self.assertEqual(round(1e20), 1e20)
1642
1643 self.assertEqual(round(-1.0), -1.0)
1644 self.assertEqual(round(-10.0), -10.0)
1645 self.assertEqual(round(-1000000000.0), -1000000000.0)
1646 self.assertEqual(round(-1e20), -1e20)
1647
1648 self.assertEqual(round(0.1), 0.0)
1649 self.assertEqual(round(1.1), 1.0)
1650 self.assertEqual(round(10.1), 10.0)
1651 self.assertEqual(round(1000000000.1), 1000000000.0)
1652
1653 self.assertEqual(round(-1.1), -1.0)
1654 self.assertEqual(round(-10.1), -10.0)
1655 self.assertEqual(round(-1000000000.1), -1000000000.0)
1656
1657 self.assertEqual(round(0.9), 1.0)
1658 self.assertEqual(round(9.9), 10.0)
1659 self.assertEqual(round(999999999.9), 1000000000.0)
1660
1661 self.assertEqual(round(-0.9), -1.0)
1662 self.assertEqual(round(-9.9), -10.0)
1663 self.assertEqual(round(-999999999.9), -1000000000.0)
1664
1665 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001666 self.assertEqual(type(round(-8.0, -1)), float)
1667
1668 self.assertEqual(type(round(-8.0, 0)), float)
1669 self.assertEqual(type(round(-8.0, 1)), float)
1670
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001671 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001672 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001673 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001674 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001675 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001676
1677 # Check behavior on ints
1678 self.assertEqual(round(0), 0)
1679 self.assertEqual(round(8), 8)
1680 self.assertEqual(round(-8), -8)
1681 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1682 self.assertEqual(type(round(-8, -1)), float)
1683 self.assertEqual(type(round(-8, 0)), float)
1684 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001685
Georg Brandlccadf842006-03-31 18:54:53 +00001686 # test new kwargs
1687 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1688
Walter Dörwald919497e2003-01-19 16:23:59 +00001689 self.assertRaises(TypeError, round)
1690
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001691 # test generic rounding delegation for reals
1692 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001693 def __float__(self):
1694 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001695
1696 class TestNoRound(object):
1697 pass
1698
1699 self.assertEqual(round(TestRound()), 23)
1700
1701 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001702 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001703
1704 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001705 t.__float__ = lambda *args: args
1706 self.assertRaises(TypeError, round, t)
1707 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001708
Walter Dörwald919497e2003-01-19 16:23:59 +00001709 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001710 setattr(sys, 'spam', 1)
1711 self.assertEqual(sys.spam, 1)
1712 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1713 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001714
1715 def test_str(self):
1716 self.assertEqual(str(''), '')
1717 self.assertEqual(str(0), '0')
1718 self.assertEqual(str(0L), '0')
1719 self.assertEqual(str(()), '()')
1720 self.assertEqual(str([]), '[]')
1721 self.assertEqual(str({}), '{}')
1722 a = []
1723 a.append(a)
1724 self.assertEqual(str(a), '[[...]]')
1725 a = {}
1726 a[0] = a
1727 self.assertEqual(str(a), '{0: {...}}')
1728
Alex Martellia70b1912003-04-22 08:12:33 +00001729 def test_sum(self):
1730 self.assertEqual(sum([]), 0)
1731 self.assertEqual(sum(range(2,8)), 27)
1732 self.assertEqual(sum(iter(range(2,8))), 27)
1733 self.assertEqual(sum(Squares(10)), 285)
1734 self.assertEqual(sum(iter(Squares(10))), 285)
1735 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1736
1737 self.assertRaises(TypeError, sum)
1738 self.assertRaises(TypeError, sum, 42)
1739 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1740 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1741 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1742 self.assertRaises(TypeError, sum, [{2:3}])
1743 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1744
1745 class BadSeq:
1746 def __getitem__(self, index):
1747 raise ValueError
1748 self.assertRaises(ValueError, sum, BadSeq())
1749
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001750 def test_trunc(self):
1751
1752 self.assertEqual(trunc(1), 1)
1753 self.assertEqual(trunc(-1), -1)
1754 self.assertEqual(type(trunc(1)), int)
1755 self.assertEqual(type(trunc(1.5)), int)
1756 self.assertEqual(trunc(1.5), 1)
1757 self.assertEqual(trunc(-1.5), -1)
1758 self.assertEqual(trunc(1.999999), 1)
1759 self.assertEqual(trunc(-1.999999), -1)
1760 self.assertEqual(trunc(-0.999999), -0)
1761 self.assertEqual(trunc(-100.999), -100)
1762
1763 class TestTrunc(object):
1764 def __trunc__(self):
1765 return 23
1766
1767 class TestNoTrunc(object):
1768 pass
1769
1770 self.assertEqual(trunc(TestTrunc()), 23)
1771
1772 self.assertRaises(TypeError, trunc)
1773 self.assertRaises(TypeError, trunc, 1, 2)
1774 # XXX: This is not ideal, but see the comment in builtin_trunc().
1775 self.assertRaises(AttributeError, trunc, TestNoTrunc())
1776
1777 t = TestNoTrunc()
1778 t.__trunc__ = lambda *args: args
1779 self.assertEquals((), trunc(t))
1780 self.assertRaises(TypeError, trunc, t, 0)
1781
Walter Dörwald919497e2003-01-19 16:23:59 +00001782 def test_tuple(self):
1783 self.assertEqual(tuple(()), ())
1784 t0_3 = (0, 1, 2, 3)
1785 t0_3_bis = tuple(t0_3)
1786 self.assert_(t0_3 is t0_3_bis)
1787 self.assertEqual(tuple([]), ())
1788 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1789 self.assertEqual(tuple(''), ())
1790 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1791
1792 def test_type(self):
1793 self.assertEqual(type(''), type('123'))
1794 self.assertNotEqual(type(''), type(()))
1795
1796 def test_unichr(self):
1797 if have_unicode:
1798 self.assertEqual(unichr(32), unicode(' '))
1799 self.assertEqual(unichr(65), unicode('A'))
1800 self.assertEqual(unichr(97), unicode('a'))
1801 self.assertEqual(
1802 unichr(sys.maxunicode),
1803 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1804 )
1805 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1806 self.assertRaises(TypeError, unichr)
1807
Guido van Rossumfee7b932005-01-16 00:21:28 +00001808 # We don't want self in vars(), so these are static methods
1809
1810 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001811 def get_vars_f0():
1812 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001813
Guido van Rossumfee7b932005-01-16 00:21:28 +00001814 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001815 def get_vars_f2():
1816 BuiltinTest.get_vars_f0()
1817 a = 1
1818 b = 2
1819 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001820
1821 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001822 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001823 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001824 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001825 self.assertEqual(self.get_vars_f0(), {})
1826 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1827 self.assertRaises(TypeError, vars, 42, 42)
1828 self.assertRaises(TypeError, vars, 42)
1829
1830 def test_zip(self):
1831 a = (1, 2, 3)
1832 b = (4, 5, 6)
1833 t = [(1, 4), (2, 5), (3, 6)]
1834 self.assertEqual(zip(a, b), t)
1835 b = [4, 5, 6]
1836 self.assertEqual(zip(a, b), t)
1837 b = (4, 5, 6, 7)
1838 self.assertEqual(zip(a, b), t)
1839 class I:
1840 def __getitem__(self, i):
1841 if i < 0 or i > 2: raise IndexError
1842 return i + 4
1843 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001844 self.assertEqual(zip(), [])
1845 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001846 self.assertRaises(TypeError, zip, None)
1847 class G:
1848 pass
1849 self.assertRaises(TypeError, zip, a, G())
1850
1851 # Make sure zip doesn't try to allocate a billion elements for the
1852 # result list when one of its arguments doesn't say how long it is.
1853 # A MemoryError is the most likely failure mode.
1854 class SequenceWithoutALength:
1855 def __getitem__(self, i):
1856 if i == 5:
1857 raise IndexError
1858 else:
1859 return i
1860 self.assertEqual(
1861 zip(SequenceWithoutALength(), xrange(2**30)),
1862 list(enumerate(range(5)))
1863 )
1864
1865 class BadSeq:
1866 def __getitem__(self, i):
1867 if i == 5:
1868 raise ValueError
1869 else:
1870 return i
1871 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1872
Raymond Hettinger64958a12003-12-17 20:43:33 +00001873class TestSorted(unittest.TestCase):
1874
1875 def test_basic(self):
1876 data = range(100)
1877 copy = data[:]
1878 random.shuffle(copy)
1879 self.assertEqual(data, sorted(copy))
1880 self.assertNotEqual(data, copy)
1881
1882 data.reverse()
1883 random.shuffle(copy)
1884 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1885 self.assertNotEqual(data, copy)
1886 random.shuffle(copy)
1887 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1888 self.assertNotEqual(data, copy)
1889 random.shuffle(copy)
1890 self.assertEqual(data, sorted(copy, reverse=1))
1891 self.assertNotEqual(data, copy)
1892
1893 def test_inputtypes(self):
1894 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001895 types = [list, tuple]
1896 if have_unicode:
1897 types.insert(0, unicode)
1898 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001899 self.assertEqual(sorted(s), sorted(T(s)))
1900
1901 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001902 types = [set, frozenset, list, tuple, dict.fromkeys]
1903 if have_unicode:
1904 types.insert(0, unicode)
1905 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001906 self.assertEqual(sorted(s), sorted(T(s)))
1907
1908 def test_baddecorator(self):
1909 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1910 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1911
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001912def test_main(verbose=None):
1913 test_classes = (BuiltinTest, TestSorted)
1914
1915 run_unittest(*test_classes)
1916
1917 # verify reference counting
1918 if verbose and hasattr(sys, "gettotalrefcount"):
1919 import gc
1920 counts = [None] * 5
1921 for i in xrange(len(counts)):
1922 run_unittest(*test_classes)
1923 gc.collect()
1924 counts[i] = sys.gettotalrefcount()
1925 print counts
1926
Walter Dörwald919497e2003-01-19 16:23:59 +00001927
1928if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001929 test_main(verbose=True)