blob: 255fb9696111d2177fefeaa14033b267b259ee33 [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
Tim Petersb713ec22006-05-23 18:45:30 +0000819 # SF bug 1334662: int(string, base) wrong answers
820 # Various representations of 2**32 evaluated to 0
821 # rather than 2**32 in previous versions
822
823 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
824 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
825 self.assertEqual(int('10000000000000000', 4), 4294967296L)
826 self.assertEqual(int('32244002423141', 5), 4294967296L)
827 self.assertEqual(int('1550104015504', 6), 4294967296L)
828 self.assertEqual(int('211301422354', 7), 4294967296L)
829 self.assertEqual(int('40000000000', 8), 4294967296L)
830 self.assertEqual(int('12068657454', 9), 4294967296L)
831 self.assertEqual(int('4294967296', 10), 4294967296L)
832 self.assertEqual(int('1904440554', 11), 4294967296L)
833 self.assertEqual(int('9ba461594', 12), 4294967296L)
834 self.assertEqual(int('535a79889', 13), 4294967296L)
835 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
836 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
837 self.assertEqual(int('100000000', 16), 4294967296L)
838 self.assertEqual(int('a7ffda91', 17), 4294967296L)
839 self.assertEqual(int('704he7g4', 18), 4294967296L)
840 self.assertEqual(int('4f5aff66', 19), 4294967296L)
841 self.assertEqual(int('3723ai4g', 20), 4294967296L)
842 self.assertEqual(int('281d55i4', 21), 4294967296L)
843 self.assertEqual(int('1fj8b184', 22), 4294967296L)
844 self.assertEqual(int('1606k7ic', 23), 4294967296L)
845 self.assertEqual(int('mb994ag', 24), 4294967296L)
846 self.assertEqual(int('hek2mgl', 25), 4294967296L)
847 self.assertEqual(int('dnchbnm', 26), 4294967296L)
848 self.assertEqual(int('b28jpdm', 27), 4294967296L)
849 self.assertEqual(int('8pfgih4', 28), 4294967296L)
850 self.assertEqual(int('76beigg', 29), 4294967296L)
851 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
852 self.assertEqual(int('4q0jto4', 31), 4294967296L)
853 self.assertEqual(int('4000000', 32), 4294967296L)
854 self.assertEqual(int('3aokq94', 33), 4294967296L)
855 self.assertEqual(int('2qhxjli', 34), 4294967296L)
856 self.assertEqual(int('2br45qb', 35), 4294967296L)
857 self.assertEqual(int('1z141z4', 36), 4294967296L)
858
859 # SF bug 1334662: int(string, base) wrong answers
860 # Checks for proper evaluation of 2**32 + 1
861 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
862 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
863 self.assertEqual(int('10000000000000001', 4), 4294967297L)
864 self.assertEqual(int('32244002423142', 5), 4294967297L)
865 self.assertEqual(int('1550104015505', 6), 4294967297L)
866 self.assertEqual(int('211301422355', 7), 4294967297L)
867 self.assertEqual(int('40000000001', 8), 4294967297L)
868 self.assertEqual(int('12068657455', 9), 4294967297L)
869 self.assertEqual(int('4294967297', 10), 4294967297L)
870 self.assertEqual(int('1904440555', 11), 4294967297L)
871 self.assertEqual(int('9ba461595', 12), 4294967297L)
872 self.assertEqual(int('535a7988a', 13), 4294967297L)
873 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
874 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
875 self.assertEqual(int('100000001', 16), 4294967297L)
876 self.assertEqual(int('a7ffda92', 17), 4294967297L)
877 self.assertEqual(int('704he7g5', 18), 4294967297L)
878 self.assertEqual(int('4f5aff67', 19), 4294967297L)
879 self.assertEqual(int('3723ai4h', 20), 4294967297L)
880 self.assertEqual(int('281d55i5', 21), 4294967297L)
881 self.assertEqual(int('1fj8b185', 22), 4294967297L)
882 self.assertEqual(int('1606k7id', 23), 4294967297L)
883 self.assertEqual(int('mb994ah', 24), 4294967297L)
884 self.assertEqual(int('hek2mgm', 25), 4294967297L)
885 self.assertEqual(int('dnchbnn', 26), 4294967297L)
886 self.assertEqual(int('b28jpdn', 27), 4294967297L)
887 self.assertEqual(int('8pfgih5', 28), 4294967297L)
888 self.assertEqual(int('76beigh', 29), 4294967297L)
889 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
890 self.assertEqual(int('4q0jto5', 31), 4294967297L)
891 self.assertEqual(int('4000001', 32), 4294967297L)
892 self.assertEqual(int('3aokq95', 33), 4294967297L)
893 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
894 self.assertEqual(int('2br45qc', 35), 4294967297L)
895 self.assertEqual(int('1z141z5', 36), 4294967297L)
896
Brett Cannonc3647ac2005-04-26 03:45:26 +0000897 def test_intconversion(self):
898 # Test __int__()
899 class Foo0:
900 def __int__(self):
901 return 42
902
903 class Foo1(object):
904 def __int__(self):
905 return 42
906
907 class Foo2(int):
908 def __int__(self):
909 return 42
910
911 class Foo3(int):
912 def __int__(self):
913 return self
914
915 class Foo4(int):
916 def __int__(self):
917 return 42L
918
919 class Foo5(int):
920 def __int__(self):
921 return 42.
922
923 self.assertEqual(int(Foo0()), 42)
924 self.assertEqual(int(Foo1()), 42)
925 self.assertEqual(int(Foo2()), 42)
926 self.assertEqual(int(Foo3()), 0)
927 self.assertEqual(int(Foo4()), 42L)
928 self.assertRaises(TypeError, int, Foo5())
929
Walter Dörwald919497e2003-01-19 16:23:59 +0000930 def test_intern(self):
931 self.assertRaises(TypeError, intern)
932 s = "never interned before"
933 self.assert_(intern(s) is s)
934 s2 = s.swapcase().swapcase()
935 self.assert_(intern(s2) is s)
936
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000937 # Subclasses of string can't be interned, because they
938 # provide too much opportunity for insane things to happen.
939 # We don't want them in the interned dict and if they aren't
940 # actually interned, we don't want to create the appearance
941 # that they are by allowing intern() to succeeed.
942 class S(str):
943 def __hash__(self):
944 return 123
945
946 self.assertRaises(TypeError, intern, S("abc"))
947
948 # It's still safe to pass these strings to routines that
949 # call intern internally, e.g. PyObject_SetAttr().
950 s = S("abc")
951 setattr(s, s, s)
952 self.assertEqual(getattr(s, s), s)
953
Walter Dörwald919497e2003-01-19 16:23:59 +0000954 def test_iter(self):
955 self.assertRaises(TypeError, iter)
956 self.assertRaises(TypeError, iter, 42, 42)
957 lists = [("1", "2"), ["1", "2"], "12"]
958 if have_unicode:
959 lists.append(unicode("12"))
960 for l in lists:
961 i = iter(l)
962 self.assertEqual(i.next(), '1')
963 self.assertEqual(i.next(), '2')
964 self.assertRaises(StopIteration, i.next)
965
966 def test_isinstance(self):
967 class C:
968 pass
969 class D(C):
970 pass
971 class E:
972 pass
973 c = C()
974 d = D()
975 e = E()
976 self.assert_(isinstance(c, C))
977 self.assert_(isinstance(d, C))
978 self.assert_(not isinstance(e, C))
979 self.assert_(not isinstance(c, D))
980 self.assert_(not isinstance('foo', E))
981 self.assertRaises(TypeError, isinstance, E, 'foo')
982 self.assertRaises(TypeError, isinstance)
983
984 def test_issubclass(self):
985 class C:
986 pass
987 class D(C):
988 pass
989 class E:
990 pass
991 c = C()
992 d = D()
993 e = E()
994 self.assert_(issubclass(D, C))
995 self.assert_(issubclass(C, C))
996 self.assert_(not issubclass(C, D))
997 self.assertRaises(TypeError, issubclass, 'foo', E)
998 self.assertRaises(TypeError, issubclass, E, 'foo')
999 self.assertRaises(TypeError, issubclass)
1000
1001 def test_len(self):
1002 self.assertEqual(len('123'), 3)
1003 self.assertEqual(len(()), 0)
1004 self.assertEqual(len((1, 2, 3, 4)), 4)
1005 self.assertEqual(len([1, 2, 3, 4]), 4)
1006 self.assertEqual(len({}), 0)
1007 self.assertEqual(len({'a':1, 'b': 2}), 2)
1008 class BadSeq:
1009 def __len__(self):
1010 raise ValueError
1011 self.assertRaises(ValueError, len, BadSeq())
1012
1013 def test_list(self):
1014 self.assertEqual(list([]), [])
1015 l0_3 = [0, 1, 2, 3]
1016 l0_3_bis = list(l0_3)
1017 self.assertEqual(l0_3, l0_3_bis)
1018 self.assert_(l0_3 is not l0_3_bis)
1019 self.assertEqual(list(()), [])
1020 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1021 self.assertEqual(list(''), [])
1022 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1023
1024 if sys.maxint == 0x7fffffff:
1025 # This test can currently only work on 32-bit machines.
1026 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1027 # XXX re-enabled.
1028 # Verify clearing of bug #556025.
1029 # This assumes that the max data size (sys.maxint) == max
1030 # address size this also assumes that the address size is at
1031 # least 4 bytes with 8 byte addresses, the bug is not well
1032 # tested
1033 #
1034 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1035 # earlier due to a newlib bug. See the following mailing list
1036 # thread for the details:
1037
1038 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1039 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1040
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001041 # This code used to segfault in Py2.4a3
1042 x = []
1043 x.extend(-y for y in x)
1044 self.assertEqual(x, [])
1045
Walter Dörwald919497e2003-01-19 16:23:59 +00001046 def test_long(self):
1047 self.assertEqual(long(314), 314L)
1048 self.assertEqual(long(3.14), 3L)
1049 self.assertEqual(long(314L), 314L)
1050 # Check that conversion from float truncates towards zero
1051 self.assertEqual(long(-3.14), -3L)
1052 self.assertEqual(long(3.9), 3L)
1053 self.assertEqual(long(-3.9), -3L)
1054 self.assertEqual(long(3.5), 3L)
1055 self.assertEqual(long(-3.5), -3L)
1056 self.assertEqual(long("-3"), -3L)
1057 if have_unicode:
1058 self.assertEqual(long(unicode("-3")), -3L)
1059 # Different base:
1060 self.assertEqual(long("10",16), 16L)
1061 if have_unicode:
1062 self.assertEqual(long(unicode("10"),16), 16L)
1063 # Check conversions from string (same test set as for int(), and then some)
1064 LL = [
1065 ('1' + '0'*20, 10L**20),
1066 ('1' + '0'*100, 10L**100)
1067 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001068 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001069 if have_unicode:
1070 L2 += [
1071 (unicode('1') + unicode('0')*20, 10L**20),
1072 (unicode('1') + unicode('0')*100, 10L**100),
1073 ]
1074 for s, v in L2 + LL:
1075 for sign in "", "+", "-":
1076 for prefix in "", " ", "\t", " \t\t ":
1077 ss = prefix + sign + s
1078 vv = v
1079 if sign == "-" and v is not ValueError:
1080 vv = -v
1081 try:
1082 self.assertEqual(long(ss), long(vv))
1083 except v:
1084 pass
1085
1086 self.assertRaises(ValueError, long, '123\0')
1087 self.assertRaises(ValueError, long, '53', 40)
1088 self.assertRaises(TypeError, long, 1, 12)
1089
Georg Brandl00cd8182007-03-06 18:41:12 +00001090 # SF patch #1638879: embedded NULs were not detected with
1091 # explicit base
1092 self.assertRaises(ValueError, long, '123\0', 10)
1093 self.assertRaises(ValueError, long, '123\x00 245', 20)
1094
Tim Peters696cf432006-05-24 21:10:40 +00001095 self.assertEqual(long('100000000000000000000000000000000', 2),
1096 4294967296)
1097 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1098 self.assertEqual(long('10000000000000000', 4), 4294967296)
1099 self.assertEqual(long('32244002423141', 5), 4294967296)
1100 self.assertEqual(long('1550104015504', 6), 4294967296)
1101 self.assertEqual(long('211301422354', 7), 4294967296)
1102 self.assertEqual(long('40000000000', 8), 4294967296)
1103 self.assertEqual(long('12068657454', 9), 4294967296)
1104 self.assertEqual(long('4294967296', 10), 4294967296)
1105 self.assertEqual(long('1904440554', 11), 4294967296)
1106 self.assertEqual(long('9ba461594', 12), 4294967296)
1107 self.assertEqual(long('535a79889', 13), 4294967296)
1108 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1109 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1110 self.assertEqual(long('100000000', 16), 4294967296)
1111 self.assertEqual(long('a7ffda91', 17), 4294967296)
1112 self.assertEqual(long('704he7g4', 18), 4294967296)
1113 self.assertEqual(long('4f5aff66', 19), 4294967296)
1114 self.assertEqual(long('3723ai4g', 20), 4294967296)
1115 self.assertEqual(long('281d55i4', 21), 4294967296)
1116 self.assertEqual(long('1fj8b184', 22), 4294967296)
1117 self.assertEqual(long('1606k7ic', 23), 4294967296)
1118 self.assertEqual(long('mb994ag', 24), 4294967296)
1119 self.assertEqual(long('hek2mgl', 25), 4294967296)
1120 self.assertEqual(long('dnchbnm', 26), 4294967296)
1121 self.assertEqual(long('b28jpdm', 27), 4294967296)
1122 self.assertEqual(long('8pfgih4', 28), 4294967296)
1123 self.assertEqual(long('76beigg', 29), 4294967296)
1124 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1125 self.assertEqual(long('4q0jto4', 31), 4294967296)
1126 self.assertEqual(long('4000000', 32), 4294967296)
1127 self.assertEqual(long('3aokq94', 33), 4294967296)
1128 self.assertEqual(long('2qhxjli', 34), 4294967296)
1129 self.assertEqual(long('2br45qb', 35), 4294967296)
1130 self.assertEqual(long('1z141z4', 36), 4294967296)
1131
1132 self.assertEqual(long('100000000000000000000000000000001', 2),
1133 4294967297)
1134 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1135 self.assertEqual(long('10000000000000001', 4), 4294967297)
1136 self.assertEqual(long('32244002423142', 5), 4294967297)
1137 self.assertEqual(long('1550104015505', 6), 4294967297)
1138 self.assertEqual(long('211301422355', 7), 4294967297)
1139 self.assertEqual(long('40000000001', 8), 4294967297)
1140 self.assertEqual(long('12068657455', 9), 4294967297)
1141 self.assertEqual(long('4294967297', 10), 4294967297)
1142 self.assertEqual(long('1904440555', 11), 4294967297)
1143 self.assertEqual(long('9ba461595', 12), 4294967297)
1144 self.assertEqual(long('535a7988a', 13), 4294967297)
1145 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1146 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1147 self.assertEqual(long('100000001', 16), 4294967297)
1148 self.assertEqual(long('a7ffda92', 17), 4294967297)
1149 self.assertEqual(long('704he7g5', 18), 4294967297)
1150 self.assertEqual(long('4f5aff67', 19), 4294967297)
1151 self.assertEqual(long('3723ai4h', 20), 4294967297)
1152 self.assertEqual(long('281d55i5', 21), 4294967297)
1153 self.assertEqual(long('1fj8b185', 22), 4294967297)
1154 self.assertEqual(long('1606k7id', 23), 4294967297)
1155 self.assertEqual(long('mb994ah', 24), 4294967297)
1156 self.assertEqual(long('hek2mgm', 25), 4294967297)
1157 self.assertEqual(long('dnchbnn', 26), 4294967297)
1158 self.assertEqual(long('b28jpdn', 27), 4294967297)
1159 self.assertEqual(long('8pfgih5', 28), 4294967297)
1160 self.assertEqual(long('76beigh', 29), 4294967297)
1161 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1162 self.assertEqual(long('4q0jto5', 31), 4294967297)
1163 self.assertEqual(long('4000001', 32), 4294967297)
1164 self.assertEqual(long('3aokq95', 33), 4294967297)
1165 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1166 self.assertEqual(long('2br45qc', 35), 4294967297)
1167 self.assertEqual(long('1z141z5', 36), 4294967297)
1168
1169
Brett Cannonc3647ac2005-04-26 03:45:26 +00001170 def test_longconversion(self):
1171 # Test __long__()
1172 class Foo0:
1173 def __long__(self):
1174 return 42L
1175
1176 class Foo1(object):
1177 def __long__(self):
1178 return 42L
1179
1180 class Foo2(long):
1181 def __long__(self):
1182 return 42L
1183
1184 class Foo3(long):
1185 def __long__(self):
1186 return self
1187
1188 class Foo4(long):
1189 def __long__(self):
1190 return 42
1191
1192 class Foo5(long):
1193 def __long__(self):
1194 return 42.
1195
1196 self.assertEqual(long(Foo0()), 42L)
1197 self.assertEqual(long(Foo1()), 42L)
1198 self.assertEqual(long(Foo2()), 42L)
1199 self.assertEqual(long(Foo3()), 0)
1200 self.assertEqual(long(Foo4()), 42)
1201 self.assertRaises(TypeError, long, Foo5())
1202
Walter Dörwald919497e2003-01-19 16:23:59 +00001203 def test_map(self):
1204 self.assertEqual(
1205 map(None, 'hello world'),
1206 ['h','e','l','l','o',' ','w','o','r','l','d']
1207 )
1208 self.assertEqual(
1209 map(None, 'abcd', 'efg'),
1210 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1211 )
1212 self.assertEqual(
1213 map(None, range(10)),
1214 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1215 )
1216 self.assertEqual(
1217 map(lambda x: x*x, range(1,4)),
1218 [1, 4, 9]
1219 )
1220 try:
1221 from math import sqrt
1222 except ImportError:
1223 def sqrt(x):
1224 return pow(x, 0.5)
1225 self.assertEqual(
1226 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1227 [[4.0, 2.0], [9.0, 3.0]]
1228 )
1229 self.assertEqual(
1230 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1231 [10, 4, 6]
1232 )
1233
1234 def plus(*v):
1235 accu = 0
1236 for i in v: accu = accu + i
1237 return accu
1238 self.assertEqual(
1239 map(plus, [1, 3, 7]),
1240 [1, 3, 7]
1241 )
1242 self.assertEqual(
1243 map(plus, [1, 3, 7], [4, 9, 2]),
1244 [1+4, 3+9, 7+2]
1245 )
1246 self.assertEqual(
1247 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1248 [1+4+1, 3+9+1, 7+2+0]
1249 )
1250 self.assertEqual(
1251 map(None, Squares(10)),
1252 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1253 )
1254 self.assertEqual(
1255 map(int, Squares(10)),
1256 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1257 )
1258 self.assertEqual(
1259 map(None, Squares(3), Squares(2)),
1260 [(0,0), (1,1), (4,None)]
1261 )
1262 self.assertEqual(
1263 map(max, Squares(3), Squares(2)),
1264 [0, 1, 4]
1265 )
1266 self.assertRaises(TypeError, map)
1267 self.assertRaises(TypeError, map, lambda x: x, 42)
1268 self.assertEqual(map(None, [42]), [42])
1269 class BadSeq:
1270 def __getitem__(self, index):
1271 raise ValueError
1272 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001273 def badfunc(x):
1274 raise RuntimeError
1275 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001276
1277 def test_max(self):
1278 self.assertEqual(max('123123'), '3')
1279 self.assertEqual(max(1, 2, 3), 3)
1280 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1281 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1282
1283 self.assertEqual(max(1, 2L, 3.0), 3.0)
1284 self.assertEqual(max(1L, 2.0, 3), 3)
1285 self.assertEqual(max(1.0, 2, 3L), 3L)
1286
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001287 for stmt in (
1288 "max(key=int)", # no args
1289 "max(1, key=int)", # single arg not iterable
1290 "max(1, 2, keystone=int)", # wrong keyword
1291 "max(1, 2, key=int, abc=int)", # two many keywords
1292 "max(1, 2, key=1)", # keyfunc is not callable
1293 ):
Tim Peters7f061872004-12-07 21:17:46 +00001294 try:
1295 exec(stmt) in globals()
1296 except TypeError:
1297 pass
1298 else:
1299 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001300
1301 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1302 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1303 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1304
1305 data = [random.randrange(200) for i in range(100)]
1306 keys = dict((elem, random.randrange(50)) for elem in data)
1307 f = keys.__getitem__
1308 self.assertEqual(max(data, key=f),
1309 sorted(reversed(data), key=f)[-1])
1310
Walter Dörwald919497e2003-01-19 16:23:59 +00001311 def test_min(self):
1312 self.assertEqual(min('123123'), '1')
1313 self.assertEqual(min(1, 2, 3), 1)
1314 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1315 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1316
1317 self.assertEqual(min(1, 2L, 3.0), 1)
1318 self.assertEqual(min(1L, 2.0, 3), 1L)
1319 self.assertEqual(min(1.0, 2, 3L), 1.0)
1320
1321 self.assertRaises(TypeError, min)
1322 self.assertRaises(TypeError, min, 42)
1323 self.assertRaises(ValueError, min, ())
1324 class BadSeq:
1325 def __getitem__(self, index):
1326 raise ValueError
1327 self.assertRaises(ValueError, min, BadSeq())
1328 class BadNumber:
1329 def __cmp__(self, other):
1330 raise ValueError
1331 self.assertRaises(ValueError, min, (42, BadNumber()))
1332
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001333 for stmt in (
1334 "min(key=int)", # no args
1335 "min(1, key=int)", # single arg not iterable
1336 "min(1, 2, keystone=int)", # wrong keyword
1337 "min(1, 2, key=int, abc=int)", # two many keywords
1338 "min(1, 2, key=1)", # keyfunc is not callable
1339 ):
Tim Peters7f061872004-12-07 21:17:46 +00001340 try:
1341 exec(stmt) in globals()
1342 except TypeError:
1343 pass
1344 else:
1345 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001346
1347 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1348 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1349 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1350
1351 data = [random.randrange(200) for i in range(100)]
1352 keys = dict((elem, random.randrange(50)) for elem in data)
1353 f = keys.__getitem__
1354 self.assertEqual(min(data, key=f),
1355 sorted(data, key=f)[0])
1356
Walter Dörwald919497e2003-01-19 16:23:59 +00001357 def test_oct(self):
1358 self.assertEqual(oct(100), '0144')
1359 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001360 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001361 self.assertEqual(oct(-100L), '-0144L')
1362 self.assertRaises(TypeError, oct, ())
1363
1364 def write_testfile(self):
1365 # NB the first 4 lines are also used to test input and raw_input, below
1366 fp = open(TESTFN, 'w')
1367 try:
1368 fp.write('1+1\n')
1369 fp.write('1+1\n')
1370 fp.write('The quick brown fox jumps over the lazy dog')
1371 fp.write('.\n')
1372 fp.write('Dear John\n')
1373 fp.write('XXX'*100)
1374 fp.write('YYY'*100)
1375 finally:
1376 fp.close()
1377
1378 def test_open(self):
1379 self.write_testfile()
1380 fp = open(TESTFN, 'r')
1381 try:
1382 self.assertEqual(fp.readline(4), '1+1\n')
1383 self.assertEqual(fp.readline(4), '1+1\n')
1384 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1385 self.assertEqual(fp.readline(4), 'Dear')
1386 self.assertEqual(fp.readline(100), ' John\n')
1387 self.assertEqual(fp.read(300), 'XXX'*100)
1388 self.assertEqual(fp.read(1000), 'YYY'*100)
1389 finally:
1390 fp.close()
1391 unlink(TESTFN)
1392
1393 def test_ord(self):
1394 self.assertEqual(ord(' '), 32)
1395 self.assertEqual(ord('A'), 65)
1396 self.assertEqual(ord('a'), 97)
1397 if have_unicode:
1398 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1399 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001400 if have_unicode:
1401 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001402
1403 def test_pow(self):
1404 self.assertEqual(pow(0,0), 1)
1405 self.assertEqual(pow(0,1), 0)
1406 self.assertEqual(pow(1,0), 1)
1407 self.assertEqual(pow(1,1), 1)
1408
1409 self.assertEqual(pow(2,0), 1)
1410 self.assertEqual(pow(2,10), 1024)
1411 self.assertEqual(pow(2,20), 1024*1024)
1412 self.assertEqual(pow(2,30), 1024*1024*1024)
1413
1414 self.assertEqual(pow(-2,0), 1)
1415 self.assertEqual(pow(-2,1), -2)
1416 self.assertEqual(pow(-2,2), 4)
1417 self.assertEqual(pow(-2,3), -8)
1418
1419 self.assertEqual(pow(0L,0), 1)
1420 self.assertEqual(pow(0L,1), 0)
1421 self.assertEqual(pow(1L,0), 1)
1422 self.assertEqual(pow(1L,1), 1)
1423
1424 self.assertEqual(pow(2L,0), 1)
1425 self.assertEqual(pow(2L,10), 1024)
1426 self.assertEqual(pow(2L,20), 1024*1024)
1427 self.assertEqual(pow(2L,30), 1024*1024*1024)
1428
1429 self.assertEqual(pow(-2L,0), 1)
1430 self.assertEqual(pow(-2L,1), -2)
1431 self.assertEqual(pow(-2L,2), 4)
1432 self.assertEqual(pow(-2L,3), -8)
1433
1434 self.assertAlmostEqual(pow(0.,0), 1.)
1435 self.assertAlmostEqual(pow(0.,1), 0.)
1436 self.assertAlmostEqual(pow(1.,0), 1.)
1437 self.assertAlmostEqual(pow(1.,1), 1.)
1438
1439 self.assertAlmostEqual(pow(2.,0), 1.)
1440 self.assertAlmostEqual(pow(2.,10), 1024.)
1441 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1442 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1443
1444 self.assertAlmostEqual(pow(-2.,0), 1.)
1445 self.assertAlmostEqual(pow(-2.,1), -2.)
1446 self.assertAlmostEqual(pow(-2.,2), 4.)
1447 self.assertAlmostEqual(pow(-2.,3), -8.)
1448
1449 for x in 2, 2L, 2.0:
1450 for y in 10, 10L, 10.0:
1451 for z in 1000, 1000L, 1000.0:
1452 if isinstance(x, float) or \
1453 isinstance(y, float) or \
1454 isinstance(z, float):
1455 self.assertRaises(TypeError, pow, x, y, z)
1456 else:
1457 self.assertAlmostEqual(pow(x, y, z), 24.0)
1458
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001459 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1460 self.assertAlmostEqual(pow(-1, 1./3), 0.5 + 0.8660254037844386j)
1461
Walter Dörwald919497e2003-01-19 16:23:59 +00001462 self.assertRaises(TypeError, pow, -1, -2, 3)
1463 self.assertRaises(ValueError, pow, 1, 2, 0)
1464 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1465 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Walter Dörwald919497e2003-01-19 16:23:59 +00001466
1467 self.assertRaises(TypeError, pow)
1468
1469 def test_range(self):
1470 self.assertEqual(range(3), [0, 1, 2])
1471 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1472 self.assertEqual(range(0), [])
1473 self.assertEqual(range(-3), [])
1474 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1475 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1476
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001477 # Now test range() with longs
1478 self.assertEqual(range(-2**100), [])
1479 self.assertEqual(range(0, -2**100), [])
1480 self.assertEqual(range(0, 2**100, -1), [])
1481 self.assertEqual(range(0, 2**100, -1), [])
1482
1483 a = long(10 * sys.maxint)
1484 b = long(100 * sys.maxint)
1485 c = long(50 * sys.maxint)
1486
1487 self.assertEqual(range(a, a+2), [a, a+1])
1488 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1489 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1490
1491 seq = range(a, b, c)
1492 self.assert_(a in seq)
1493 self.assert_(b not in seq)
1494 self.assertEqual(len(seq), 2)
1495
1496 seq = range(b, a, -c)
1497 self.assert_(b in seq)
1498 self.assert_(a not in seq)
1499 self.assertEqual(len(seq), 2)
1500
1501 seq = range(-a, -b, -c)
1502 self.assert_(-a in seq)
1503 self.assert_(-b not in seq)
1504 self.assertEqual(len(seq), 2)
1505
Walter Dörwald919497e2003-01-19 16:23:59 +00001506 self.assertRaises(TypeError, range)
1507 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1508 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001509 self.assertRaises(ValueError, range, a, a + 1, long(0))
1510
1511 class badzero(int):
1512 def __cmp__(self, other):
1513 raise RuntimeError
1514 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001515
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001516 # Reject floats when it would require PyLongs to represent.
1517 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001518 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001519
Walter Dörwald357981e2003-04-15 18:59:28 +00001520 self.assertRaises(TypeError, range, 0, "spam")
1521 self.assertRaises(TypeError, range, 0, 42, "spam")
1522
1523 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1524 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1525
Walter Dörwald919497e2003-01-19 16:23:59 +00001526 def test_input_and_raw_input(self):
1527 self.write_testfile()
1528 fp = open(TESTFN, 'r')
1529 savestdin = sys.stdin
1530 savestdout = sys.stdout # Eats the echo
1531 try:
1532 sys.stdin = fp
1533 sys.stdout = BitBucket()
1534 self.assertEqual(input(), 2)
1535 self.assertEqual(input('testing\n'), 2)
1536 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1537 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001538
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001539 # SF 1535165: don't segfault on closed stdin
1540 # sys.stdout must be a regular file for triggering
1541 sys.stdout = savestdout
1542 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001543 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001544
1545 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001546 sys.stdin = cStringIO.StringIO("NULL\0")
1547 self.assertRaises(TypeError, input, 42, 42)
1548 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1549 self.assertEqual(input(), 'whitespace')
1550 sys.stdin = cStringIO.StringIO()
1551 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001552
1553 # SF 876178: make sure input() respect future options.
1554 sys.stdin = cStringIO.StringIO('1/2')
1555 sys.stdout = cStringIO.StringIO()
1556 exec compile('print input()', 'test_builtin_tmp', 'exec')
1557 sys.stdin.seek(0, 0)
1558 exec compile('from __future__ import division;print input()',
1559 'test_builtin_tmp', 'exec')
1560 sys.stdin.seek(0, 0)
1561 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001562 # The result we expect depends on whether new division semantics
1563 # are already in effect.
1564 if 1/2 == 0:
1565 # This test was compiled with old semantics.
1566 expected = ['0', '0.5', '0']
1567 else:
1568 # This test was compiled with new semantics (e.g., -Qnew
1569 # was given on the command line.
1570 expected = ['0.5', '0.5', '0.5']
1571 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001572
Walter Dörwald919497e2003-01-19 16:23:59 +00001573 del sys.stdout
1574 self.assertRaises(RuntimeError, input, 'prompt')
1575 del sys.stdin
1576 self.assertRaises(RuntimeError, input, 'prompt')
1577 finally:
1578 sys.stdin = savestdin
1579 sys.stdout = savestdout
1580 fp.close()
1581 unlink(TESTFN)
1582
1583 def test_reduce(self):
1584 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1585 self.assertEqual(
1586 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1587 ['a','c','d','w']
1588 )
1589 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1590 self.assertEqual(
1591 reduce(lambda x, y: x*y, range(2,21), 1L),
1592 2432902008176640000L
1593 )
1594 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1595 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1596 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1597 self.assertRaises(TypeError, reduce)
1598 self.assertRaises(TypeError, reduce, 42, 42)
1599 self.assertRaises(TypeError, reduce, 42, 42, 42)
1600 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1601 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1602 self.assertRaises(TypeError, reduce, 42, (42, 42))
1603
1604 class BadSeq:
1605 def __getitem__(self, index):
1606 raise ValueError
1607 self.assertRaises(ValueError, reduce, 42, BadSeq())
1608
1609 def test_reload(self):
1610 import marshal
1611 reload(marshal)
1612 import string
1613 reload(string)
1614 ## import sys
1615 ## self.assertRaises(ImportError, reload, sys)
1616
1617 def test_repr(self):
1618 self.assertEqual(repr(''), '\'\'')
1619 self.assertEqual(repr(0), '0')
1620 self.assertEqual(repr(0L), '0L')
1621 self.assertEqual(repr(()), '()')
1622 self.assertEqual(repr([]), '[]')
1623 self.assertEqual(repr({}), '{}')
1624 a = []
1625 a.append(a)
1626 self.assertEqual(repr(a), '[[...]]')
1627 a = {}
1628 a[0] = a
1629 self.assertEqual(repr(a), '{0: {...}}')
1630
1631 def test_round(self):
1632 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001633 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001634 self.assertEqual(round(1.0), 1.0)
1635 self.assertEqual(round(10.0), 10.0)
1636 self.assertEqual(round(1000000000.0), 1000000000.0)
1637 self.assertEqual(round(1e20), 1e20)
1638
1639 self.assertEqual(round(-1.0), -1.0)
1640 self.assertEqual(round(-10.0), -10.0)
1641 self.assertEqual(round(-1000000000.0), -1000000000.0)
1642 self.assertEqual(round(-1e20), -1e20)
1643
1644 self.assertEqual(round(0.1), 0.0)
1645 self.assertEqual(round(1.1), 1.0)
1646 self.assertEqual(round(10.1), 10.0)
1647 self.assertEqual(round(1000000000.1), 1000000000.0)
1648
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(0.9), 1.0)
1654 self.assertEqual(round(9.9), 10.0)
1655 self.assertEqual(round(999999999.9), 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(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001662 self.assertEqual(type(round(-8.0, -1)), float)
1663
1664 self.assertEqual(type(round(-8.0, 0)), float)
1665 self.assertEqual(type(round(-8.0, 1)), float)
1666
1667 # Check even / odd rounding behaviour
1668 self.assertEqual(round(5.5), 6)
1669 self.assertEqual(round(6.5), 6)
1670 self.assertEqual(round(-5.5), -6)
1671 self.assertEqual(round(-6.5), -6)
1672
1673 # Check behavior on ints
1674 self.assertEqual(round(0), 0)
1675 self.assertEqual(round(8), 8)
1676 self.assertEqual(round(-8), -8)
1677 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1678 self.assertEqual(type(round(-8, -1)), float)
1679 self.assertEqual(type(round(-8, 0)), float)
1680 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001681
Georg Brandlccadf842006-03-31 18:54:53 +00001682 # test new kwargs
1683 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1684
Walter Dörwald919497e2003-01-19 16:23:59 +00001685 self.assertRaises(TypeError, round)
1686
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001687 # test generic rounding delegation for reals
1688 class TestRound(object):
1689 def __round__(self):
1690 return 23
1691
1692 class TestNoRound(object):
1693 pass
1694
1695 self.assertEqual(round(TestRound()), 23)
1696
1697 self.assertRaises(TypeError, round, 1, 2, 3)
1698 # XXX: This is not ideal, but see the comment in builtin_round().
1699 self.assertRaises(AttributeError, round, TestNoRound())
1700
1701 t = TestNoRound()
1702 t.__round__ = lambda *args: args
1703 self.assertEquals((), round(t))
1704 self.assertEquals((0,), round(t, 0))
1705
Walter Dörwald919497e2003-01-19 16:23:59 +00001706 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001707 setattr(sys, 'spam', 1)
1708 self.assertEqual(sys.spam, 1)
1709 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1710 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001711
1712 def test_str(self):
1713 self.assertEqual(str(''), '')
1714 self.assertEqual(str(0), '0')
1715 self.assertEqual(str(0L), '0')
1716 self.assertEqual(str(()), '()')
1717 self.assertEqual(str([]), '[]')
1718 self.assertEqual(str({}), '{}')
1719 a = []
1720 a.append(a)
1721 self.assertEqual(str(a), '[[...]]')
1722 a = {}
1723 a[0] = a
1724 self.assertEqual(str(a), '{0: {...}}')
1725
Alex Martellia70b1912003-04-22 08:12:33 +00001726 def test_sum(self):
1727 self.assertEqual(sum([]), 0)
1728 self.assertEqual(sum(range(2,8)), 27)
1729 self.assertEqual(sum(iter(range(2,8))), 27)
1730 self.assertEqual(sum(Squares(10)), 285)
1731 self.assertEqual(sum(iter(Squares(10))), 285)
1732 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1733
1734 self.assertRaises(TypeError, sum)
1735 self.assertRaises(TypeError, sum, 42)
1736 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1737 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1738 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1739 self.assertRaises(TypeError, sum, [{2:3}])
1740 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1741
1742 class BadSeq:
1743 def __getitem__(self, index):
1744 raise ValueError
1745 self.assertRaises(ValueError, sum, BadSeq())
1746
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001747 def test_trunc(self):
1748
1749 self.assertEqual(trunc(1), 1)
1750 self.assertEqual(trunc(-1), -1)
1751 self.assertEqual(type(trunc(1)), int)
1752 self.assertEqual(type(trunc(1.5)), int)
1753 self.assertEqual(trunc(1.5), 1)
1754 self.assertEqual(trunc(-1.5), -1)
1755 self.assertEqual(trunc(1.999999), 1)
1756 self.assertEqual(trunc(-1.999999), -1)
1757 self.assertEqual(trunc(-0.999999), -0)
1758 self.assertEqual(trunc(-100.999), -100)
1759
1760 class TestTrunc(object):
1761 def __trunc__(self):
1762 return 23
1763
1764 class TestNoTrunc(object):
1765 pass
1766
1767 self.assertEqual(trunc(TestTrunc()), 23)
1768
1769 self.assertRaises(TypeError, trunc)
1770 self.assertRaises(TypeError, trunc, 1, 2)
1771 # XXX: This is not ideal, but see the comment in builtin_trunc().
1772 self.assertRaises(AttributeError, trunc, TestNoTrunc())
1773
1774 t = TestNoTrunc()
1775 t.__trunc__ = lambda *args: args
1776 self.assertEquals((), trunc(t))
1777 self.assertRaises(TypeError, trunc, t, 0)
1778
Walter Dörwald919497e2003-01-19 16:23:59 +00001779 def test_tuple(self):
1780 self.assertEqual(tuple(()), ())
1781 t0_3 = (0, 1, 2, 3)
1782 t0_3_bis = tuple(t0_3)
1783 self.assert_(t0_3 is t0_3_bis)
1784 self.assertEqual(tuple([]), ())
1785 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1786 self.assertEqual(tuple(''), ())
1787 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1788
1789 def test_type(self):
1790 self.assertEqual(type(''), type('123'))
1791 self.assertNotEqual(type(''), type(()))
1792
1793 def test_unichr(self):
1794 if have_unicode:
1795 self.assertEqual(unichr(32), unicode(' '))
1796 self.assertEqual(unichr(65), unicode('A'))
1797 self.assertEqual(unichr(97), unicode('a'))
1798 self.assertEqual(
1799 unichr(sys.maxunicode),
1800 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1801 )
1802 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1803 self.assertRaises(TypeError, unichr)
1804
Guido van Rossumfee7b932005-01-16 00:21:28 +00001805 # We don't want self in vars(), so these are static methods
1806
1807 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001808 def get_vars_f0():
1809 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001810
Guido van Rossumfee7b932005-01-16 00:21:28 +00001811 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001812 def get_vars_f2():
1813 BuiltinTest.get_vars_f0()
1814 a = 1
1815 b = 2
1816 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001817
1818 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001819 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001820 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001821 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001822 self.assertEqual(self.get_vars_f0(), {})
1823 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1824 self.assertRaises(TypeError, vars, 42, 42)
1825 self.assertRaises(TypeError, vars, 42)
1826
1827 def test_zip(self):
1828 a = (1, 2, 3)
1829 b = (4, 5, 6)
1830 t = [(1, 4), (2, 5), (3, 6)]
1831 self.assertEqual(zip(a, b), t)
1832 b = [4, 5, 6]
1833 self.assertEqual(zip(a, b), t)
1834 b = (4, 5, 6, 7)
1835 self.assertEqual(zip(a, b), t)
1836 class I:
1837 def __getitem__(self, i):
1838 if i < 0 or i > 2: raise IndexError
1839 return i + 4
1840 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001841 self.assertEqual(zip(), [])
1842 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001843 self.assertRaises(TypeError, zip, None)
1844 class G:
1845 pass
1846 self.assertRaises(TypeError, zip, a, G())
1847
1848 # Make sure zip doesn't try to allocate a billion elements for the
1849 # result list when one of its arguments doesn't say how long it is.
1850 # A MemoryError is the most likely failure mode.
1851 class SequenceWithoutALength:
1852 def __getitem__(self, i):
1853 if i == 5:
1854 raise IndexError
1855 else:
1856 return i
1857 self.assertEqual(
1858 zip(SequenceWithoutALength(), xrange(2**30)),
1859 list(enumerate(range(5)))
1860 )
1861
1862 class BadSeq:
1863 def __getitem__(self, i):
1864 if i == 5:
1865 raise ValueError
1866 else:
1867 return i
1868 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1869
Raymond Hettinger64958a12003-12-17 20:43:33 +00001870class TestSorted(unittest.TestCase):
1871
1872 def test_basic(self):
1873 data = range(100)
1874 copy = data[:]
1875 random.shuffle(copy)
1876 self.assertEqual(data, sorted(copy))
1877 self.assertNotEqual(data, copy)
1878
1879 data.reverse()
1880 random.shuffle(copy)
1881 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1882 self.assertNotEqual(data, copy)
1883 random.shuffle(copy)
1884 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1885 self.assertNotEqual(data, copy)
1886 random.shuffle(copy)
1887 self.assertEqual(data, sorted(copy, reverse=1))
1888 self.assertNotEqual(data, copy)
1889
1890 def test_inputtypes(self):
1891 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001892 types = [list, tuple]
1893 if have_unicode:
1894 types.insert(0, unicode)
1895 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001896 self.assertEqual(sorted(s), sorted(T(s)))
1897
1898 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001899 types = [set, frozenset, list, tuple, dict.fromkeys]
1900 if have_unicode:
1901 types.insert(0, unicode)
1902 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001903 self.assertEqual(sorted(s), sorted(T(s)))
1904
1905 def test_baddecorator(self):
1906 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1907 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1908
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001909def test_main(verbose=None):
1910 test_classes = (BuiltinTest, TestSorted)
1911
1912 run_unittest(*test_classes)
1913
1914 # verify reference counting
1915 if verbose and hasattr(sys, "gettotalrefcount"):
1916 import gc
1917 counts = [None] * 5
1918 for i in xrange(len(counts)):
1919 run_unittest(*test_classes)
1920 gc.collect()
1921 counts[i] = sys.gettotalrefcount()
1922 print counts
1923
Walter Dörwald919497e2003-01-19 16:23:59 +00001924
1925if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001926 test_main(verbose=True)