blob: 500516cefb8a2d0da74941d49b4d67ccc4a55fab [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
Thomas Wouters477c8d52006-05-27 19:21:47 +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:
Jack Diederich4dafcc42006-11-28 19:15:13 +000097 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000098 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')
110 self.assertRaises(ImportError, __import__, 'spamspam')
111 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000112 self.assertRaises(ValueError, __import__, '')
Walter Dörwald919497e2003-01-19 16:23:59 +0000113
114 def test_abs(self):
115 # int
116 self.assertEqual(abs(0), 0)
117 self.assertEqual(abs(1234), 1234)
118 self.assertEqual(abs(-1234), 1234)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000119 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000120 # float
121 self.assertEqual(abs(0.0), 0.0)
122 self.assertEqual(abs(3.14), 3.14)
123 self.assertEqual(abs(-3.14), 3.14)
124 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000125 self.assertEqual(abs(0), 0)
126 self.assertEqual(abs(1234), 1234)
127 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000128 # str
129 self.assertRaises(TypeError, abs, 'a')
130
Raymond Hettinger96229b12005-03-11 06:49:40 +0000131 def test_all(self):
132 self.assertEqual(all([2, 4, 6]), True)
133 self.assertEqual(all([2, None, 6]), False)
134 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
135 self.assertRaises(RuntimeError, all, TestFailingIter())
136 self.assertRaises(TypeError, all, 10) # Non-iterable
137 self.assertRaises(TypeError, all) # No args
138 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
139 self.assertEqual(all([]), True) # Empty iterator
140 S = [50, 60]
141 self.assertEqual(all(x > 42 for x in S), True)
142 S = [50, 40, 60]
143 self.assertEqual(all(x > 42 for x in S), False)
144
145 def test_any(self):
146 self.assertEqual(any([None, None, None]), False)
147 self.assertEqual(any([None, 4, None]), True)
148 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
149 self.assertRaises(RuntimeError, all, TestFailingIter())
150 self.assertRaises(TypeError, any, 10) # Non-iterable
151 self.assertRaises(TypeError, any) # No args
152 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
153 self.assertEqual(any([]), False) # Empty iterator
154 S = [40, 60, 30]
155 self.assertEqual(any(x > 42 for x in S), True)
156 S = [10, 20, 30]
157 self.assertEqual(any(x > 42 for x in S), False)
158
Thomas Wouters89f507f2006-12-13 04:49:30 +0000159 def test_neg(self):
160 x = -sys.maxint-1
161 self.assert_(isinstance(x, int))
162 self.assertEqual(-x, sys.maxint+1)
163
Walter Dörwald919497e2003-01-19 16:23:59 +0000164 def test_callable(self):
165 self.assert_(callable(len))
166 def f(): pass
167 self.assert_(callable(f))
168 class C:
169 def meth(self): pass
170 self.assert_(callable(C))
171 x = C()
172 self.assert_(callable(x.meth))
173 self.assert_(not callable(x))
174 class D(C):
175 def __call__(self): pass
176 y = D()
177 self.assert_(callable(y))
178 y()
179
180 def test_chr(self):
181 self.assertEqual(chr(32), ' ')
182 self.assertEqual(chr(65), 'A')
183 self.assertEqual(chr(97), 'a')
184 self.assertEqual(chr(0xff), '\xff')
185 self.assertRaises(ValueError, chr, 256)
186 self.assertRaises(TypeError, chr)
187
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000188 def XXX_test_cmp(self):
189 # cmp() is no longer supported
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 self.assertEqual(cmp(-1, 1), -1)
191 self.assertEqual(cmp(1, -1), 1)
192 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000193 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000194 a = []; a.append(a)
195 b = []; b.append(b)
196 from UserList import UserList
197 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000198 self.assertRaises(RuntimeError, cmp, a, b)
199 self.assertRaises(RuntimeError, cmp, b, c)
200 self.assertRaises(RuntimeError, cmp, c, a)
201 self.assertRaises(RuntimeError, cmp, a, c)
202 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 a.pop(); b.pop(); c.pop()
204 self.assertRaises(TypeError, cmp)
205
Walter Dörwald919497e2003-01-19 16:23:59 +0000206 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000207 compile('print(1)\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000208 bom = '\xef\xbb\xbf'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000209 compile(bom + 'print(1)\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000210 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000211 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
212 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000213 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000214 if have_unicode:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000215 compile(unicode('print(u"\xc3\xa5")\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000216 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
217 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000218
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 def test_delattr(self):
220 import sys
221 sys.spam = 1
222 delattr(sys, 'spam')
223 self.assertRaises(TypeError, delattr)
224
225 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000226 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000227 self.assertRaises(TypeError, dir, 42, 42)
228
Georg Brandle32b4222007-03-10 22:13:27 +0000229 # dir() - local scope
230 local_var = 1
231 self.assert_('local_var' in dir())
232
233 # dir(module)
234 import sys
235 self.assert_('exit' in dir(sys))
236
237 # dir(module_with_invalid__dict__)
238 import types
239 class Foo(types.ModuleType):
240 __dict__ = 8
241 f = Foo("foo")
242 self.assertRaises(TypeError, dir, f)
243
244 # dir(type)
245 self.assert_("strip" in dir(str))
246 self.assert_("__mro__" not in dir(str))
247
248 # dir(obj)
249 class Foo(object):
250 def __init__(self):
251 self.x = 7
252 self.y = 8
253 self.z = 9
254 f = Foo()
255 self.assert_("y" in dir(f))
256
257 # dir(obj_no__dict__)
258 class Foo(object):
259 __slots__ = []
260 f = Foo()
261 self.assert_("__repr__" in dir(f))
262
263 # dir(obj_no__class__with__dict__)
264 # (an ugly trick to cause getattr(f, "__class__") to fail)
265 class Foo(object):
266 __slots__ = ["__class__", "__dict__"]
267 def __init__(self):
268 self.bar = "wow"
269 f = Foo()
270 self.assert_("__repr__" not in dir(f))
271 self.assert_("bar" in dir(f))
272
273 # dir(obj_using __dir__)
274 class Foo(object):
275 def __dir__(self):
276 return ["kan", "ga", "roo"]
277 f = Foo()
278 self.assert_(dir(f) == ["ga", "kan", "roo"])
279
280 # dir(obj__dir__not_list)
281 class Foo(object):
282 def __dir__(self):
283 return 7
284 f = Foo()
285 self.assertRaises(TypeError, dir, f)
286
Walter Dörwald919497e2003-01-19 16:23:59 +0000287 def test_divmod(self):
288 self.assertEqual(divmod(12, 7), (1, 5))
289 self.assertEqual(divmod(-12, 7), (-2, 2))
290 self.assertEqual(divmod(12, -7), (-2, -2))
291 self.assertEqual(divmod(-12, -7), (1, -5))
292
Guido van Rossume2a383d2007-01-15 16:59:06 +0000293 self.assertEqual(divmod(12, 7), (1, 5))
294 self.assertEqual(divmod(-12, 7), (-2, 2))
295 self.assertEqual(divmod(12, -7), (-2, -2))
296 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000297
Guido van Rossume2a383d2007-01-15 16:59:06 +0000298 self.assertEqual(divmod(12, 7), (1, 5))
299 self.assertEqual(divmod(-12, 7), (-2, 2))
300 self.assertEqual(divmod(12, -7), (-2, -2))
301 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000302
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000303 self.assertEqual(divmod(-sys.maxint-1, -1),
304 (sys.maxint+1, 0))
305
Walter Dörwald919497e2003-01-19 16:23:59 +0000306 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
307 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
308 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
309 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
310
311 self.assertRaises(TypeError, divmod)
312
313 def test_eval(self):
314 self.assertEqual(eval('1+1'), 2)
315 self.assertEqual(eval(' 1+1\n'), 2)
316 globals = {'a': 1, 'b': 2}
317 locals = {'b': 200, 'c': 300}
318 self.assertEqual(eval('a', globals) , 1)
319 self.assertEqual(eval('a', globals, locals), 1)
320 self.assertEqual(eval('b', globals, locals), 200)
321 self.assertEqual(eval('c', globals, locals), 300)
322 if have_unicode:
323 self.assertEqual(eval(unicode('1+1')), 2)
324 self.assertEqual(eval(unicode(' 1+1\n')), 2)
325 globals = {'a': 1, 'b': 2}
326 locals = {'b': 200, 'c': 300}
327 if have_unicode:
328 self.assertEqual(eval(unicode('a'), globals), 1)
329 self.assertEqual(eval(unicode('a'), globals, locals), 1)
330 self.assertEqual(eval(unicode('b'), globals, locals), 200)
331 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000332 bom = '\xef\xbb\xbf'
333 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000334 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
335 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000336 self.assertRaises(TypeError, eval)
337 self.assertRaises(TypeError, eval, ())
338
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000339 def test_general_eval(self):
340 # Tests that general mappings can be used for the locals argument
341
342 class M:
343 "Test mapping interface versus possible calls from eval()."
344 def __getitem__(self, key):
345 if key == 'a':
346 return 12
347 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000348 def keys(self):
349 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000350
351 m = M()
352 g = globals()
353 self.assertEqual(eval('a', g, m), 12)
354 self.assertRaises(NameError, eval, 'b', g, m)
355 self.assertEqual(eval('dir()', g, m), list('xyz'))
356 self.assertEqual(eval('globals()', g, m), g)
357 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000358 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000359 class A:
360 "Non-mapping"
361 pass
362 m = A()
363 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000364
365 # Verify that dict subclasses work as well
366 class D(dict):
367 def __getitem__(self, key):
368 if key == 'a':
369 return 12
370 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000371 def keys(self):
372 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000373
374 d = D()
375 self.assertEqual(eval('a', g, d), 12)
376 self.assertRaises(NameError, eval, 'b', g, d)
377 self.assertEqual(eval('dir()', g, d), list('xyz'))
378 self.assertEqual(eval('globals()', g, d), g)
379 self.assertEqual(eval('locals()', g, d), d)
380
381 # Verify locals stores (used by list comps)
382 eval('[locals() for i in (2,3)]', g, d)
383 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
384
385 class SpreadSheet:
386 "Sample application showing nested, calculated lookups."
387 _cells = {}
388 def __setitem__(self, key, formula):
389 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000390 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000391 return eval(self._cells[key], globals(), self)
392
393 ss = SpreadSheet()
394 ss['a1'] = '5'
395 ss['a2'] = 'a1*6'
396 ss['a3'] = 'a2*7'
397 self.assertEqual(ss['a3'], 210)
398
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000399 # Verify that dir() catches a non-list returned by eval
400 # SF bug #1004669
401 class C:
402 def __getitem__(self, item):
403 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000404 def keys(self):
405 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000406 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
407
Walter Dörwald919497e2003-01-19 16:23:59 +0000408 # Done outside of the method test_z to get the correct scope
409 z = 0
410 f = open(TESTFN, 'w')
411 f.write('z = z+1\n')
412 f.write('z = z*2\n')
413 f.close()
414 execfile(TESTFN)
415
416 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000417 global numruns
418 if numruns:
419 return
420 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000421
Walter Dörwald919497e2003-01-19 16:23:59 +0000422 globals = {'a': 1, 'b': 2}
423 locals = {'b': 200, 'c': 300}
424
425 self.assertEqual(self.__class__.z, 2)
426 globals['z'] = 0
427 execfile(TESTFN, globals)
428 self.assertEqual(globals['z'], 2)
429 locals['z'] = 0
430 execfile(TESTFN, globals, locals)
431 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000432
433 class M:
434 "Test mapping interface versus possible calls from execfile()."
435 def __init__(self):
436 self.z = 10
437 def __getitem__(self, key):
438 if key == 'z':
439 return self.z
440 raise KeyError
441 def __setitem__(self, key, value):
442 if key == 'z':
443 self.z = value
444 return
445 raise KeyError
446
447 locals = M()
448 locals['z'] = 0
449 execfile(TESTFN, globals, locals)
450 self.assertEqual(locals['z'], 2)
451
Walter Dörwald919497e2003-01-19 16:23:59 +0000452 unlink(TESTFN)
453 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000454 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000455 import os
456 self.assertRaises(IOError, execfile, os.curdir)
457 self.assertRaises(IOError, execfile, "I_dont_exist")
458
Georg Brandl7cae87c2006-09-06 06:51:57 +0000459 def test_exec(self):
460 g = {}
461 exec('z = 1', g)
462 if '__builtins__' in g:
463 del g['__builtins__']
464 self.assertEqual(g, {'z': 1})
465
466 exec(u'z = 1+1', g)
467 if '__builtins__' in g:
468 del g['__builtins__']
469 self.assertEqual(g, {'z': 2})
470 g = {}
471 l = {}
472
473 import warnings
474 warnings.filterwarnings("ignore", "global statement", module="<string>")
475 exec('global a; a = 1; b = 2', g, l)
476 if '__builtins__' in g:
477 del g['__builtins__']
478 if '__builtins__' in l:
479 del l['__builtins__']
480 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
481
Walter Dörwald919497e2003-01-19 16:23:59 +0000482 def test_filter(self):
483 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
484 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
485 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
486 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
487 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
488 def identity(item):
489 return 1
490 filter(identity, Squares(5))
491 self.assertRaises(TypeError, filter)
492 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000493 def __getitem__(self, index):
494 if index<4:
495 return 42
496 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000497 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
498 def badfunc():
499 pass
500 self.assertRaises(TypeError, filter, badfunc, range(5))
501
Walter Dörwaldbf517072003-01-27 15:57:14 +0000502 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000503 self.assertEqual(filter(None, (1, 2)), (1, 2))
504 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
505 self.assertRaises(TypeError, filter, 42, (1, 2))
506
Walter Dörwaldbf517072003-01-27 15:57:14 +0000507 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 self.assertEqual(filter(None, "12"), "12")
509 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
510 self.assertRaises(TypeError, filter, 42, "12")
511 class badstr(str):
512 def __getitem__(self, index):
513 raise ValueError
514 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000515
Walter Dörwald903f1e02003-02-04 16:28:00 +0000516 class badstr2(str):
517 def __getitem__(self, index):
518 return 42
519 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
520
521 class weirdstr(str):
522 def __getitem__(self, index):
523 return weirdstr(2*str.__getitem__(self, index))
524 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
525
Walter Dörwald5e61e242003-02-04 17:04:01 +0000526 class shiftstr(str):
527 def __getitem__(self, index):
528 return chr(ord(str.__getitem__(self, index))+1)
529 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
530
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000531 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000532 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000533 self.assertEqual(filter(None, unicode("12")), unicode("12"))
534 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
535 self.assertRaises(TypeError, filter, 42, unicode("12"))
536 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000537
Walter Dörwald903f1e02003-02-04 16:28:00 +0000538 class badunicode(unicode):
539 def __getitem__(self, index):
540 return 42
541 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
542
543 class weirdunicode(unicode):
544 def __getitem__(self, index):
545 return weirdunicode(2*unicode.__getitem__(self, index))
546 self.assertEqual(
547 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
548
Walter Dörwald5e61e242003-02-04 17:04:01 +0000549 class shiftunicode(unicode):
550 def __getitem__(self, index):
551 return unichr(ord(unicode.__getitem__(self, index))+1)
552 self.assertEqual(
553 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
554 unicode("345")
555 )
556
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000557 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000558 # test that filter() never returns tuple, str or unicode subclasses
559 # and that the result always goes through __getitem__
560 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000561 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000562 def __getitem__(self, index):
563 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000564 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000565 def __getitem__(self, index):
566 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000567 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000568 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000569 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000570 }
571 if have_unicode:
572 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000573 def __getitem__(self, index):
574 return 2*unicode.__getitem__(self, index)
575 inputs[unicode2] = {
576 unicode(): unicode(),
577 unicode("123"): unicode("112233")
578 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000579
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000580 for (cls, inps) in inputs.items():
581 for (inp, exp) in inps.items():
Tim Petersf2715e02003-02-19 02:35:07 +0000582 # make sure the output goes through __getitem__
583 # even if func is None
584 self.assertEqual(
585 filter(funcs[0], cls(inp)),
586 filter(funcs[1], cls(inp))
587 )
588 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000589 outp = filter(func, cls(inp))
590 self.assertEqual(outp, exp)
591 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000592
Walter Dörwald919497e2003-01-19 16:23:59 +0000593 def test_float(self):
594 self.assertEqual(float(3.14), 3.14)
595 self.assertEqual(float(314), 314.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000596 self.assertEqual(float(314), 314.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000597 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000598 self.assertRaises(ValueError, float, " 0x3.1 ")
599 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000600 if have_unicode:
601 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
602 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000603 # Implementation limitation in PyFloat_FromString()
604 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000605
Thomas Wouters477c8d52006-05-27 19:21:47 +0000606 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000607 def test_float_with_comma(self):
608 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000609 # float must not accept the locale specific decimal point but
610 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000611 import locale
612 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000613 return
614
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000615 self.assertEqual(float(" 3.14 "), 3.14)
616 self.assertEqual(float("+3.14 "), 3.14)
617 self.assertEqual(float("-3.14 "), -3.14)
618 self.assertEqual(float(".14 "), .14)
619 self.assertEqual(float("3. "), 3.0)
620 self.assertEqual(float("3.e3 "), 3000.0)
621 self.assertEqual(float("3.2e3 "), 3200.0)
622 self.assertEqual(float("2.5e-1 "), 0.25)
623 self.assertEqual(float("5e-1"), 0.5)
624 self.assertRaises(ValueError, float, " 3,14 ")
625 self.assertRaises(ValueError, float, " +3,14 ")
626 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000627 self.assertRaises(ValueError, float, " 0x3.1 ")
628 self.assertRaises(ValueError, float, " -0x3.p-1 ")
629 self.assertEqual(float(" 25.e-1 "), 2.5)
630 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000631
Brett Cannonc3647ac2005-04-26 03:45:26 +0000632 def test_floatconversion(self):
633 # Make sure that calls to __float__() work properly
634 class Foo0:
635 def __float__(self):
636 return 42.
637
638 class Foo1(object):
639 def __float__(self):
640 return 42.
641
642 class Foo2(float):
643 def __float__(self):
644 return 42.
645
646 class Foo3(float):
647 def __new__(cls, value=0.):
648 return float.__new__(cls, 2*value)
649
650 def __float__(self):
651 return self
652
653 class Foo4(float):
654 def __float__(self):
655 return 42
656
657 self.assertAlmostEqual(float(Foo0()), 42.)
658 self.assertAlmostEqual(float(Foo1()), 42.)
659 self.assertAlmostEqual(float(Foo2()), 42.)
660 self.assertAlmostEqual(float(Foo3(21)), 42.)
661 self.assertRaises(TypeError, float, Foo4(42))
662
Walter Dörwald919497e2003-01-19 16:23:59 +0000663 def test_getattr(self):
664 import sys
665 self.assert_(getattr(sys, 'stdout') is sys.stdout)
666 self.assertRaises(TypeError, getattr, sys, 1)
667 self.assertRaises(TypeError, getattr, sys, 1, "foo")
668 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000669 if have_unicode:
670 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000671
672 def test_hasattr(self):
673 import sys
674 self.assert_(hasattr(sys, 'stdout'))
675 self.assertRaises(TypeError, hasattr, sys, 1)
676 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000677 if have_unicode:
678 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000679
680 def test_hash(self):
681 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000682 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000683 self.assertEqual(hash(1), hash(1.0))
684 hash('spam')
685 if have_unicode:
686 self.assertEqual(hash('spam'), hash(unicode('spam')))
687 hash((0,1,2,3))
688 def f(): pass
689 self.assertRaises(TypeError, hash, [])
690 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691 # Bug 1536021: Allow hash to return long objects
692 class X:
693 def __hash__(self):
694 return 2**100
695 self.assertEquals(type(hash(X())), int)
696 class Y(object):
697 def __hash__(self):
698 return 2**100
699 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000700 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000701 def __hash__(self):
702 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000703 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000704
705 def test_hex(self):
706 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000707 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000708 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000709 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000710 self.assertRaises(TypeError, hex, {})
711
712 def test_id(self):
713 id(None)
714 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000715 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000716 id(1.0)
717 id('spam')
718 id((0,1,2,3))
719 id([0,1,2,3])
720 id({'spam': 1, 'eggs': 2, 'ham': 3})
721
Guido van Rossuma88a0332007-02-26 16:59:55 +0000722 # Test input() later, alphabetized as if it were raw_input
723
Walter Dörwald919497e2003-01-19 16:23:59 +0000724 def test_int(self):
725 self.assertEqual(int(314), 314)
726 self.assertEqual(int(3.14), 3)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000727 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000728 # Check that conversion from float truncates towards zero
729 self.assertEqual(int(-3.14), -3)
730 self.assertEqual(int(3.9), 3)
731 self.assertEqual(int(-3.9), -3)
732 self.assertEqual(int(3.5), 3)
733 self.assertEqual(int(-3.5), -3)
734 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000735 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000736 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000737 self.assertEqual(int(unicode("10"),16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000738 # Test conversion from strings and various anomalies
739 for s, v in L:
740 for sign in "", "+", "-":
741 for prefix in "", " ", "\t", " \t\t ":
742 ss = prefix + sign + s
743 vv = v
744 if sign == "-" and v is not ValueError:
745 vv = -v
746 try:
747 self.assertEqual(int(ss), vv)
748 except v:
749 pass
750
Walter Dörwald70a6b492004-02-12 17:35:32 +0000751 s = repr(-1-sys.maxint)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000752 x = int(s)
753 self.assertEqual(x+1, -sys.maxint)
754 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000755 # should return long
Thomas Wouters89f507f2006-12-13 04:49:30 +0000756 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000757
758 # should return long
759 x = int(1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000760 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000761 x = int(-1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000762 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000763
764
765 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
766 # Worked by accident in Windows release build, but failed in debug build.
767 # Failed in all Linux builds.
768 x = -1-sys.maxint
769 self.assertEqual(x >> 1, x//2)
770
771 self.assertRaises(ValueError, int, '123\0')
772 self.assertRaises(ValueError, int, '53', 40)
773
Thomas Wouters89f507f2006-12-13 04:49:30 +0000774 # SF bug 1545497: embedded NULs were not detected with
775 # explicit base
776 self.assertRaises(ValueError, int, '123\0', 10)
777 self.assertRaises(ValueError, int, '123\x00 245', 20)
778
Walter Dörwald919497e2003-01-19 16:23:59 +0000779 x = int('1' * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000780 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000781
782 if have_unicode:
783 x = int(unichr(0x661) * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000784 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000785
786 self.assertRaises(TypeError, int, 1, 12)
787
788 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000789 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000790
Thomas Wouters477c8d52006-05-27 19:21:47 +0000791 # SF bug 1334662: int(string, base) wrong answers
792 # Various representations of 2**32 evaluated to 0
793 # rather than 2**32 in previous versions
794
Guido van Rossume2a383d2007-01-15 16:59:06 +0000795 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
796 self.assertEqual(int('102002022201221111211', 3), 4294967296)
797 self.assertEqual(int('10000000000000000', 4), 4294967296)
798 self.assertEqual(int('32244002423141', 5), 4294967296)
799 self.assertEqual(int('1550104015504', 6), 4294967296)
800 self.assertEqual(int('211301422354', 7), 4294967296)
801 self.assertEqual(int('40000000000', 8), 4294967296)
802 self.assertEqual(int('12068657454', 9), 4294967296)
803 self.assertEqual(int('4294967296', 10), 4294967296)
804 self.assertEqual(int('1904440554', 11), 4294967296)
805 self.assertEqual(int('9ba461594', 12), 4294967296)
806 self.assertEqual(int('535a79889', 13), 4294967296)
807 self.assertEqual(int('2ca5b7464', 14), 4294967296)
808 self.assertEqual(int('1a20dcd81', 15), 4294967296)
809 self.assertEqual(int('100000000', 16), 4294967296)
810 self.assertEqual(int('a7ffda91', 17), 4294967296)
811 self.assertEqual(int('704he7g4', 18), 4294967296)
812 self.assertEqual(int('4f5aff66', 19), 4294967296)
813 self.assertEqual(int('3723ai4g', 20), 4294967296)
814 self.assertEqual(int('281d55i4', 21), 4294967296)
815 self.assertEqual(int('1fj8b184', 22), 4294967296)
816 self.assertEqual(int('1606k7ic', 23), 4294967296)
817 self.assertEqual(int('mb994ag', 24), 4294967296)
818 self.assertEqual(int('hek2mgl', 25), 4294967296)
819 self.assertEqual(int('dnchbnm', 26), 4294967296)
820 self.assertEqual(int('b28jpdm', 27), 4294967296)
821 self.assertEqual(int('8pfgih4', 28), 4294967296)
822 self.assertEqual(int('76beigg', 29), 4294967296)
823 self.assertEqual(int('5qmcpqg', 30), 4294967296)
824 self.assertEqual(int('4q0jto4', 31), 4294967296)
825 self.assertEqual(int('4000000', 32), 4294967296)
826 self.assertEqual(int('3aokq94', 33), 4294967296)
827 self.assertEqual(int('2qhxjli', 34), 4294967296)
828 self.assertEqual(int('2br45qb', 35), 4294967296)
829 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830
831 # SF bug 1334662: int(string, base) wrong answers
832 # Checks for proper evaluation of 2**32 + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000833 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
834 self.assertEqual(int('102002022201221111212', 3), 4294967297)
835 self.assertEqual(int('10000000000000001', 4), 4294967297)
836 self.assertEqual(int('32244002423142', 5), 4294967297)
837 self.assertEqual(int('1550104015505', 6), 4294967297)
838 self.assertEqual(int('211301422355', 7), 4294967297)
839 self.assertEqual(int('40000000001', 8), 4294967297)
840 self.assertEqual(int('12068657455', 9), 4294967297)
841 self.assertEqual(int('4294967297', 10), 4294967297)
842 self.assertEqual(int('1904440555', 11), 4294967297)
843 self.assertEqual(int('9ba461595', 12), 4294967297)
844 self.assertEqual(int('535a7988a', 13), 4294967297)
845 self.assertEqual(int('2ca5b7465', 14), 4294967297)
846 self.assertEqual(int('1a20dcd82', 15), 4294967297)
847 self.assertEqual(int('100000001', 16), 4294967297)
848 self.assertEqual(int('a7ffda92', 17), 4294967297)
849 self.assertEqual(int('704he7g5', 18), 4294967297)
850 self.assertEqual(int('4f5aff67', 19), 4294967297)
851 self.assertEqual(int('3723ai4h', 20), 4294967297)
852 self.assertEqual(int('281d55i5', 21), 4294967297)
853 self.assertEqual(int('1fj8b185', 22), 4294967297)
854 self.assertEqual(int('1606k7id', 23), 4294967297)
855 self.assertEqual(int('mb994ah', 24), 4294967297)
856 self.assertEqual(int('hek2mgm', 25), 4294967297)
857 self.assertEqual(int('dnchbnn', 26), 4294967297)
858 self.assertEqual(int('b28jpdn', 27), 4294967297)
859 self.assertEqual(int('8pfgih5', 28), 4294967297)
860 self.assertEqual(int('76beigh', 29), 4294967297)
861 self.assertEqual(int('5qmcpqh', 30), 4294967297)
862 self.assertEqual(int('4q0jto5', 31), 4294967297)
863 self.assertEqual(int('4000001', 32), 4294967297)
864 self.assertEqual(int('3aokq95', 33), 4294967297)
865 self.assertEqual(int('2qhxjlj', 34), 4294967297)
866 self.assertEqual(int('2br45qc', 35), 4294967297)
867 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000868
Brett Cannonc3647ac2005-04-26 03:45:26 +0000869 def test_intconversion(self):
870 # Test __int__()
871 class Foo0:
872 def __int__(self):
873 return 42
874
875 class Foo1(object):
876 def __int__(self):
877 return 42
878
879 class Foo2(int):
880 def __int__(self):
881 return 42
882
883 class Foo3(int):
884 def __int__(self):
885 return self
886
887 class Foo4(int):
888 def __int__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000889 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000890
891 class Foo5(int):
892 def __int__(self):
893 return 42.
894
895 self.assertEqual(int(Foo0()), 42)
896 self.assertEqual(int(Foo1()), 42)
897 self.assertEqual(int(Foo2()), 42)
898 self.assertEqual(int(Foo3()), 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000899 self.assertEqual(int(Foo4()), 42)
Brett Cannonc3647ac2005-04-26 03:45:26 +0000900 self.assertRaises(TypeError, int, Foo5())
901
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 def test_iter(self):
903 self.assertRaises(TypeError, iter)
904 self.assertRaises(TypeError, iter, 42, 42)
905 lists = [("1", "2"), ["1", "2"], "12"]
906 if have_unicode:
907 lists.append(unicode("12"))
908 for l in lists:
909 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000910 self.assertEqual(next(i), '1')
911 self.assertEqual(next(i), '2')
912 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000913
914 def test_isinstance(self):
915 class C:
916 pass
917 class D(C):
918 pass
919 class E:
920 pass
921 c = C()
922 d = D()
923 e = E()
924 self.assert_(isinstance(c, C))
925 self.assert_(isinstance(d, C))
926 self.assert_(not isinstance(e, C))
927 self.assert_(not isinstance(c, D))
928 self.assert_(not isinstance('foo', E))
929 self.assertRaises(TypeError, isinstance, E, 'foo')
930 self.assertRaises(TypeError, isinstance)
931
932 def test_issubclass(self):
933 class C:
934 pass
935 class D(C):
936 pass
937 class E:
938 pass
939 c = C()
940 d = D()
941 e = E()
942 self.assert_(issubclass(D, C))
943 self.assert_(issubclass(C, C))
944 self.assert_(not issubclass(C, D))
945 self.assertRaises(TypeError, issubclass, 'foo', E)
946 self.assertRaises(TypeError, issubclass, E, 'foo')
947 self.assertRaises(TypeError, issubclass)
948
949 def test_len(self):
950 self.assertEqual(len('123'), 3)
951 self.assertEqual(len(()), 0)
952 self.assertEqual(len((1, 2, 3, 4)), 4)
953 self.assertEqual(len([1, 2, 3, 4]), 4)
954 self.assertEqual(len({}), 0)
955 self.assertEqual(len({'a':1, 'b': 2}), 2)
956 class BadSeq:
957 def __len__(self):
958 raise ValueError
959 self.assertRaises(ValueError, len, BadSeq())
960
961 def test_list(self):
962 self.assertEqual(list([]), [])
963 l0_3 = [0, 1, 2, 3]
964 l0_3_bis = list(l0_3)
965 self.assertEqual(l0_3, l0_3_bis)
966 self.assert_(l0_3 is not l0_3_bis)
967 self.assertEqual(list(()), [])
968 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
969 self.assertEqual(list(''), [])
970 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
971
972 if sys.maxint == 0x7fffffff:
973 # This test can currently only work on 32-bit machines.
974 # XXX If/when PySequence_Length() returns a ssize_t, it should be
975 # XXX re-enabled.
976 # Verify clearing of bug #556025.
977 # This assumes that the max data size (sys.maxint) == max
978 # address size this also assumes that the address size is at
979 # least 4 bytes with 8 byte addresses, the bug is not well
980 # tested
981 #
982 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
983 # earlier due to a newlib bug. See the following mailing list
984 # thread for the details:
985
986 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
987 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
988
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000989 # This code used to segfault in Py2.4a3
990 x = []
991 x.extend(-y for y in x)
992 self.assertEqual(x, [])
993
Walter Dörwald919497e2003-01-19 16:23:59 +0000994 def test_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000995 self.assertEqual(int(314), 314)
996 self.assertEqual(int(3.14), 3)
997 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000998 # Check that conversion from float truncates towards zero
Guido van Rossume2a383d2007-01-15 16:59:06 +0000999 self.assertEqual(int(-3.14), -3)
1000 self.assertEqual(int(3.9), 3)
1001 self.assertEqual(int(-3.9), -3)
1002 self.assertEqual(int(3.5), 3)
1003 self.assertEqual(int(-3.5), -3)
1004 self.assertEqual(int("-3"), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001005 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001006 self.assertEqual(int(unicode("-3")), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001007 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001008 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +00001009 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001010 self.assertEqual(int(unicode("10"),16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +00001011 # Check conversions from string (same test set as for int(), and then some)
1012 LL = [
Guido van Rossume2a383d2007-01-15 16:59:06 +00001013 ('1' + '0'*20, 10**20),
1014 ('1' + '0'*100, 10**100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001016 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001017 if have_unicode:
1018 L2 += [
Guido van Rossume2a383d2007-01-15 16:59:06 +00001019 (unicode('1') + unicode('0')*20, 10**20),
1020 (unicode('1') + unicode('0')*100, 10**100),
Walter Dörwald919497e2003-01-19 16:23:59 +00001021 ]
1022 for s, v in L2 + LL:
1023 for sign in "", "+", "-":
1024 for prefix in "", " ", "\t", " \t\t ":
1025 ss = prefix + sign + s
1026 vv = v
1027 if sign == "-" and v is not ValueError:
1028 vv = -v
1029 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001030 self.assertEqual(int(ss), int(vv))
Walter Dörwald919497e2003-01-19 16:23:59 +00001031 except v:
1032 pass
1033
Guido van Rossume2a383d2007-01-15 16:59:06 +00001034 self.assertRaises(ValueError, int, '123\0')
1035 self.assertRaises(ValueError, int, '53', 40)
1036 self.assertRaises(TypeError, int, 1, 12)
Walter Dörwald919497e2003-01-19 16:23:59 +00001037
Guido van Rossume2a383d2007-01-15 16:59:06 +00001038 self.assertEqual(int('100000000000000000000000000000000', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +00001039 4294967296)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001040 self.assertEqual(int('102002022201221111211', 3), 4294967296)
1041 self.assertEqual(int('10000000000000000', 4), 4294967296)
1042 self.assertEqual(int('32244002423141', 5), 4294967296)
1043 self.assertEqual(int('1550104015504', 6), 4294967296)
1044 self.assertEqual(int('211301422354', 7), 4294967296)
1045 self.assertEqual(int('40000000000', 8), 4294967296)
1046 self.assertEqual(int('12068657454', 9), 4294967296)
1047 self.assertEqual(int('4294967296', 10), 4294967296)
1048 self.assertEqual(int('1904440554', 11), 4294967296)
1049 self.assertEqual(int('9ba461594', 12), 4294967296)
1050 self.assertEqual(int('535a79889', 13), 4294967296)
1051 self.assertEqual(int('2ca5b7464', 14), 4294967296)
1052 self.assertEqual(int('1a20dcd81', 15), 4294967296)
1053 self.assertEqual(int('100000000', 16), 4294967296)
1054 self.assertEqual(int('a7ffda91', 17), 4294967296)
1055 self.assertEqual(int('704he7g4', 18), 4294967296)
1056 self.assertEqual(int('4f5aff66', 19), 4294967296)
1057 self.assertEqual(int('3723ai4g', 20), 4294967296)
1058 self.assertEqual(int('281d55i4', 21), 4294967296)
1059 self.assertEqual(int('1fj8b184', 22), 4294967296)
1060 self.assertEqual(int('1606k7ic', 23), 4294967296)
1061 self.assertEqual(int('mb994ag', 24), 4294967296)
1062 self.assertEqual(int('hek2mgl', 25), 4294967296)
1063 self.assertEqual(int('dnchbnm', 26), 4294967296)
1064 self.assertEqual(int('b28jpdm', 27), 4294967296)
1065 self.assertEqual(int('8pfgih4', 28), 4294967296)
1066 self.assertEqual(int('76beigg', 29), 4294967296)
1067 self.assertEqual(int('5qmcpqg', 30), 4294967296)
1068 self.assertEqual(int('4q0jto4', 31), 4294967296)
1069 self.assertEqual(int('4000000', 32), 4294967296)
1070 self.assertEqual(int('3aokq94', 33), 4294967296)
1071 self.assertEqual(int('2qhxjli', 34), 4294967296)
1072 self.assertEqual(int('2br45qb', 35), 4294967296)
1073 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001074
Guido van Rossume2a383d2007-01-15 16:59:06 +00001075 self.assertEqual(int('100000000000000000000000000000001', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +00001076 4294967297)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001077 self.assertEqual(int('102002022201221111212', 3), 4294967297)
1078 self.assertEqual(int('10000000000000001', 4), 4294967297)
1079 self.assertEqual(int('32244002423142', 5), 4294967297)
1080 self.assertEqual(int('1550104015505', 6), 4294967297)
1081 self.assertEqual(int('211301422355', 7), 4294967297)
1082 self.assertEqual(int('40000000001', 8), 4294967297)
1083 self.assertEqual(int('12068657455', 9), 4294967297)
1084 self.assertEqual(int('4294967297', 10), 4294967297)
1085 self.assertEqual(int('1904440555', 11), 4294967297)
1086 self.assertEqual(int('9ba461595', 12), 4294967297)
1087 self.assertEqual(int('535a7988a', 13), 4294967297)
1088 self.assertEqual(int('2ca5b7465', 14), 4294967297)
1089 self.assertEqual(int('1a20dcd82', 15), 4294967297)
1090 self.assertEqual(int('100000001', 16), 4294967297)
1091 self.assertEqual(int('a7ffda92', 17), 4294967297)
1092 self.assertEqual(int('704he7g5', 18), 4294967297)
1093 self.assertEqual(int('4f5aff67', 19), 4294967297)
1094 self.assertEqual(int('3723ai4h', 20), 4294967297)
1095 self.assertEqual(int('281d55i5', 21), 4294967297)
1096 self.assertEqual(int('1fj8b185', 22), 4294967297)
1097 self.assertEqual(int('1606k7id', 23), 4294967297)
1098 self.assertEqual(int('mb994ah', 24), 4294967297)
1099 self.assertEqual(int('hek2mgm', 25), 4294967297)
1100 self.assertEqual(int('dnchbnn', 26), 4294967297)
1101 self.assertEqual(int('b28jpdn', 27), 4294967297)
1102 self.assertEqual(int('8pfgih5', 28), 4294967297)
1103 self.assertEqual(int('76beigh', 29), 4294967297)
1104 self.assertEqual(int('5qmcpqh', 30), 4294967297)
1105 self.assertEqual(int('4q0jto5', 31), 4294967297)
1106 self.assertEqual(int('4000001', 32), 4294967297)
1107 self.assertEqual(int('3aokq95', 33), 4294967297)
1108 self.assertEqual(int('2qhxjlj', 34), 4294967297)
1109 self.assertEqual(int('2br45qc', 35), 4294967297)
1110 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001111
1112
Brett Cannonc3647ac2005-04-26 03:45:26 +00001113 def test_longconversion(self):
1114 # Test __long__()
1115 class Foo0:
1116 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001117 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001118
1119 class Foo1(object):
1120 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001121 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001122
Guido van Rossume2a383d2007-01-15 16:59:06 +00001123 class Foo2(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001124 def __long__(self):
1125 return 42
1126
Guido van Rossume2a383d2007-01-15 16:59:06 +00001127 class Foo3(int):
1128 def __long__(self):
1129 return self
1130
1131 class Foo4(int):
1132 def __long__(self):
1133 return 42
1134
1135 class Foo5(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001136 def __long__(self):
1137 return 42.
1138
Guido van Rossume2a383d2007-01-15 16:59:06 +00001139 self.assertEqual(int(Foo0()), 42)
1140 self.assertEqual(int(Foo1()), 42)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001141 # XXX invokes __int__ now
1142 # self.assertEqual(long(Foo2()), 42L)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001143 self.assertEqual(int(Foo3()), 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001144 # XXX likewise
1145 # self.assertEqual(long(Foo4()), 42)
1146 # self.assertRaises(TypeError, long, Foo5())
Brett Cannonc3647ac2005-04-26 03:45:26 +00001147
Walter Dörwald919497e2003-01-19 16:23:59 +00001148 def test_map(self):
1149 self.assertEqual(
1150 map(None, 'hello world'),
1151 ['h','e','l','l','o',' ','w','o','r','l','d']
1152 )
1153 self.assertEqual(
1154 map(None, 'abcd', 'efg'),
1155 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1156 )
1157 self.assertEqual(
1158 map(None, range(10)),
1159 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1160 )
1161 self.assertEqual(
1162 map(lambda x: x*x, range(1,4)),
1163 [1, 4, 9]
1164 )
1165 try:
1166 from math import sqrt
1167 except ImportError:
1168 def sqrt(x):
1169 return pow(x, 0.5)
1170 self.assertEqual(
1171 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1172 [[4.0, 2.0], [9.0, 3.0]]
1173 )
1174 self.assertEqual(
1175 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1176 [10, 4, 6]
1177 )
1178
1179 def plus(*v):
1180 accu = 0
1181 for i in v: accu = accu + i
1182 return accu
1183 self.assertEqual(
1184 map(plus, [1, 3, 7]),
1185 [1, 3, 7]
1186 )
1187 self.assertEqual(
1188 map(plus, [1, 3, 7], [4, 9, 2]),
1189 [1+4, 3+9, 7+2]
1190 )
1191 self.assertEqual(
1192 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1193 [1+4+1, 3+9+1, 7+2+0]
1194 )
1195 self.assertEqual(
1196 map(None, Squares(10)),
1197 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1198 )
1199 self.assertEqual(
1200 map(int, Squares(10)),
1201 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1202 )
1203 self.assertEqual(
1204 map(None, Squares(3), Squares(2)),
1205 [(0,0), (1,1), (4,None)]
1206 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001207 def Max(a, b):
1208 if a is None:
1209 return b
1210 if b is None:
1211 return a
1212 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001213 self.assertEqual(
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001214 map(Max, Squares(3), Squares(2)),
Walter Dörwald919497e2003-01-19 16:23:59 +00001215 [0, 1, 4]
1216 )
1217 self.assertRaises(TypeError, map)
1218 self.assertRaises(TypeError, map, lambda x: x, 42)
1219 self.assertEqual(map(None, [42]), [42])
1220 class BadSeq:
1221 def __getitem__(self, index):
1222 raise ValueError
1223 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001224 def badfunc(x):
1225 raise RuntimeError
1226 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001227
1228 def test_max(self):
1229 self.assertEqual(max('123123'), '3')
1230 self.assertEqual(max(1, 2, 3), 3)
1231 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1232 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1233
Guido van Rossume2a383d2007-01-15 16:59:06 +00001234 self.assertEqual(max(1, 2, 3.0), 3.0)
1235 self.assertEqual(max(1, 2.0, 3), 3)
1236 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001237
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001238 for stmt in (
1239 "max(key=int)", # no args
1240 "max(1, key=int)", # single arg not iterable
1241 "max(1, 2, keystone=int)", # wrong keyword
1242 "max(1, 2, key=int, abc=int)", # two many keywords
1243 "max(1, 2, key=1)", # keyfunc is not callable
1244 ):
Tim Peters7f061872004-12-07 21:17:46 +00001245 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001246 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001247 except TypeError:
1248 pass
1249 else:
1250 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001251
1252 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1253 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1254 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1255
1256 data = [random.randrange(200) for i in range(100)]
1257 keys = dict((elem, random.randrange(50)) for elem in data)
1258 f = keys.__getitem__
1259 self.assertEqual(max(data, key=f),
1260 sorted(reversed(data), key=f)[-1])
1261
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 def test_min(self):
1263 self.assertEqual(min('123123'), '1')
1264 self.assertEqual(min(1, 2, 3), 1)
1265 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1266 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1267
Guido van Rossume2a383d2007-01-15 16:59:06 +00001268 self.assertEqual(min(1, 2, 3.0), 1)
1269 self.assertEqual(min(1, 2.0, 3), 1)
1270 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001271
1272 self.assertRaises(TypeError, min)
1273 self.assertRaises(TypeError, min, 42)
1274 self.assertRaises(ValueError, min, ())
1275 class BadSeq:
1276 def __getitem__(self, index):
1277 raise ValueError
1278 self.assertRaises(ValueError, min, BadSeq())
1279 class BadNumber:
1280 def __cmp__(self, other):
1281 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001282 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001283
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001284 for stmt in (
1285 "min(key=int)", # no args
1286 "min(1, key=int)", # single arg not iterable
1287 "min(1, 2, keystone=int)", # wrong keyword
1288 "min(1, 2, key=int, abc=int)", # two many keywords
1289 "min(1, 2, key=1)", # keyfunc is not callable
1290 ):
Tim Peters7f061872004-12-07 21:17:46 +00001291 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001292 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001293 except TypeError:
1294 pass
1295 else:
1296 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001297
1298 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1299 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1300 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1301
1302 data = [random.randrange(200) for i in range(100)]
1303 keys = dict((elem, random.randrange(50)) for elem in data)
1304 f = keys.__getitem__
1305 self.assertEqual(min(data, key=f),
1306 sorted(data, key=f)[0])
1307
Georg Brandla18af4e2007-04-21 15:47:16 +00001308 def test_next(self):
1309 it = iter(range(2))
1310 self.assertEqual(next(it), 0)
1311 self.assertEqual(next(it), 1)
1312 self.assertRaises(StopIteration, next, it)
1313 self.assertRaises(StopIteration, next, it)
1314 self.assertEquals(next(it, 42), 42)
1315
1316 class Iter(object):
1317 def __iter__(self):
1318 return self
1319 def __next__(self):
1320 raise StopIteration
1321
1322 it = iter(Iter())
1323 self.assertEquals(next(it, 42), 42)
1324 self.assertRaises(StopIteration, next, it)
1325
1326 def gen():
1327 yield 1
1328 return
1329
1330 it = gen()
1331 self.assertEquals(next(it), 1)
1332 self.assertRaises(StopIteration, next, it)
1333 self.assertEquals(next(it, 42), 42)
1334
Walter Dörwald919497e2003-01-19 16:23:59 +00001335 def test_oct(self):
1336 self.assertEqual(oct(100), '0144')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001337 self.assertEqual(oct(100), '0144')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001338 self.assertEqual(oct(-100), '-0144')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001339 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001340 self.assertRaises(TypeError, oct, ())
1341
1342 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001343 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001344 fp = open(TESTFN, 'w')
1345 try:
1346 fp.write('1+1\n')
1347 fp.write('1+1\n')
1348 fp.write('The quick brown fox jumps over the lazy dog')
1349 fp.write('.\n')
1350 fp.write('Dear John\n')
1351 fp.write('XXX'*100)
1352 fp.write('YYY'*100)
1353 finally:
1354 fp.close()
1355
1356 def test_open(self):
1357 self.write_testfile()
1358 fp = open(TESTFN, 'r')
1359 try:
1360 self.assertEqual(fp.readline(4), '1+1\n')
1361 self.assertEqual(fp.readline(4), '1+1\n')
1362 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1363 self.assertEqual(fp.readline(4), 'Dear')
1364 self.assertEqual(fp.readline(100), ' John\n')
1365 self.assertEqual(fp.read(300), 'XXX'*100)
1366 self.assertEqual(fp.read(1000), 'YYY'*100)
1367 finally:
1368 fp.close()
1369 unlink(TESTFN)
1370
1371 def test_ord(self):
1372 self.assertEqual(ord(' '), 32)
1373 self.assertEqual(ord('A'), 65)
1374 self.assertEqual(ord('a'), 97)
1375 if have_unicode:
1376 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1377 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001378 if have_unicode:
1379 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001380
1381 def test_pow(self):
1382 self.assertEqual(pow(0,0), 1)
1383 self.assertEqual(pow(0,1), 0)
1384 self.assertEqual(pow(1,0), 1)
1385 self.assertEqual(pow(1,1), 1)
1386
1387 self.assertEqual(pow(2,0), 1)
1388 self.assertEqual(pow(2,10), 1024)
1389 self.assertEqual(pow(2,20), 1024*1024)
1390 self.assertEqual(pow(2,30), 1024*1024*1024)
1391
1392 self.assertEqual(pow(-2,0), 1)
1393 self.assertEqual(pow(-2,1), -2)
1394 self.assertEqual(pow(-2,2), 4)
1395 self.assertEqual(pow(-2,3), -8)
1396
Guido van Rossume2a383d2007-01-15 16:59:06 +00001397 self.assertEqual(pow(0,0), 1)
1398 self.assertEqual(pow(0,1), 0)
1399 self.assertEqual(pow(1,0), 1)
1400 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001401
Guido van Rossume2a383d2007-01-15 16:59:06 +00001402 self.assertEqual(pow(2,0), 1)
1403 self.assertEqual(pow(2,10), 1024)
1404 self.assertEqual(pow(2,20), 1024*1024)
1405 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +00001406
Guido van Rossume2a383d2007-01-15 16:59:06 +00001407 self.assertEqual(pow(-2,0), 1)
1408 self.assertEqual(pow(-2,1), -2)
1409 self.assertEqual(pow(-2,2), 4)
1410 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +00001411
1412 self.assertAlmostEqual(pow(0.,0), 1.)
1413 self.assertAlmostEqual(pow(0.,1), 0.)
1414 self.assertAlmostEqual(pow(1.,0), 1.)
1415 self.assertAlmostEqual(pow(1.,1), 1.)
1416
1417 self.assertAlmostEqual(pow(2.,0), 1.)
1418 self.assertAlmostEqual(pow(2.,10), 1024.)
1419 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1420 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1421
1422 self.assertAlmostEqual(pow(-2.,0), 1.)
1423 self.assertAlmostEqual(pow(-2.,1), -2.)
1424 self.assertAlmostEqual(pow(-2.,2), 4.)
1425 self.assertAlmostEqual(pow(-2.,3), -8.)
1426
Guido van Rossume2a383d2007-01-15 16:59:06 +00001427 for x in 2, 2, 2.0:
1428 for y in 10, 10, 10.0:
1429 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001430 if isinstance(x, float) or \
1431 isinstance(y, float) or \
1432 isinstance(z, float):
1433 self.assertRaises(TypeError, pow, x, y, z)
1434 else:
1435 self.assertAlmostEqual(pow(x, y, z), 24.0)
1436
1437 self.assertRaises(TypeError, pow, -1, -2, 3)
1438 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001439 self.assertRaises(TypeError, pow, -1, -2, 3)
1440 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001441 self.assertRaises(ValueError, pow, -342.43, 0.234)
1442
1443 self.assertRaises(TypeError, pow)
1444
1445 def test_range(self):
1446 self.assertEqual(range(3), [0, 1, 2])
1447 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1448 self.assertEqual(range(0), [])
1449 self.assertEqual(range(-3), [])
1450 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1451 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1452
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001453 # Now test range() with longs
1454 self.assertEqual(range(-2**100), [])
1455 self.assertEqual(range(0, -2**100), [])
1456 self.assertEqual(range(0, 2**100, -1), [])
1457 self.assertEqual(range(0, 2**100, -1), [])
1458
Guido van Rossume2a383d2007-01-15 16:59:06 +00001459 a = int(10 * sys.maxint)
1460 b = int(100 * sys.maxint)
1461 c = int(50 * sys.maxint)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001462
1463 self.assertEqual(range(a, a+2), [a, a+1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001464 self.assertEqual(range(a+2, a, -1), [a+2, a+1])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001465 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1466
1467 seq = range(a, b, c)
1468 self.assert_(a in seq)
1469 self.assert_(b not in seq)
1470 self.assertEqual(len(seq), 2)
1471
1472 seq = range(b, a, -c)
1473 self.assert_(b in seq)
1474 self.assert_(a not in seq)
1475 self.assertEqual(len(seq), 2)
1476
1477 seq = range(-a, -b, -c)
1478 self.assert_(-a in seq)
1479 self.assert_(-b not in seq)
1480 self.assertEqual(len(seq), 2)
1481
Walter Dörwald919497e2003-01-19 16:23:59 +00001482 self.assertRaises(TypeError, range)
1483 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1484 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001485 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001486
1487 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001488 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001489 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001490 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1491
1492 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001493 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001494
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001495 # Reject floats when it would require PyLongs to represent.
1496 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001497 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001498
Walter Dörwald357981e2003-04-15 18:59:28 +00001499 self.assertRaises(TypeError, range, 0, "spam")
1500 self.assertRaises(TypeError, range, 0, 42, "spam")
1501
1502 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1503 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1504
Guido van Rossuma88a0332007-02-26 16:59:55 +00001505 def test_input(self):
1506 self.write_testfile()
1507 fp = open(TESTFN, 'r')
1508 savestdin = sys.stdin
1509 savestdout = sys.stdout # Eats the echo
1510 try:
1511 sys.stdin = fp
1512 sys.stdout = BitBucket()
1513 self.assertEqual(input(), "1+1")
1514 self.assertEqual(input('testing\n'), "1+1")
1515 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1516 self.assertEqual(input('testing\n'), 'Dear John')
1517
1518 # SF 1535165: don't segfault on closed stdin
1519 # sys.stdout must be a regular file for triggering
1520 sys.stdout = savestdout
1521 sys.stdin.close()
1522 self.assertRaises(ValueError, input)
1523
1524 sys.stdout = BitBucket()
1525 sys.stdin = cStringIO.StringIO("NULL\0")
1526 self.assertRaises(TypeError, input, 42, 42)
1527 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1528 self.assertEqual(input(), " 'whitespace'")
1529 sys.stdin = cStringIO.StringIO()
1530 self.assertRaises(EOFError, input)
1531
1532 del sys.stdout
1533 self.assertRaises(RuntimeError, input, 'prompt')
1534 del sys.stdin
1535 self.assertRaises(RuntimeError, input, 'prompt')
1536 finally:
1537 sys.stdin = savestdin
1538 sys.stdout = savestdout
1539 fp.close()
1540 unlink(TESTFN)
1541
Walter Dörwald919497e2003-01-19 16:23:59 +00001542 def test_reload(self):
1543 import marshal
1544 reload(marshal)
1545 import string
1546 reload(string)
1547 ## import sys
1548 ## self.assertRaises(ImportError, reload, sys)
1549
1550 def test_repr(self):
1551 self.assertEqual(repr(''), '\'\'')
1552 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001553 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001554 self.assertEqual(repr(()), '()')
1555 self.assertEqual(repr([]), '[]')
1556 self.assertEqual(repr({}), '{}')
1557 a = []
1558 a.append(a)
1559 self.assertEqual(repr(a), '[[...]]')
1560 a = {}
1561 a[0] = a
1562 self.assertEqual(repr(a), '{0: {...}}')
1563
1564 def test_round(self):
1565 self.assertEqual(round(0.0), 0.0)
1566 self.assertEqual(round(1.0), 1.0)
1567 self.assertEqual(round(10.0), 10.0)
1568 self.assertEqual(round(1000000000.0), 1000000000.0)
1569 self.assertEqual(round(1e20), 1e20)
1570
1571 self.assertEqual(round(-1.0), -1.0)
1572 self.assertEqual(round(-10.0), -10.0)
1573 self.assertEqual(round(-1000000000.0), -1000000000.0)
1574 self.assertEqual(round(-1e20), -1e20)
1575
1576 self.assertEqual(round(0.1), 0.0)
1577 self.assertEqual(round(1.1), 1.0)
1578 self.assertEqual(round(10.1), 10.0)
1579 self.assertEqual(round(1000000000.1), 1000000000.0)
1580
1581 self.assertEqual(round(-1.1), -1.0)
1582 self.assertEqual(round(-10.1), -10.0)
1583 self.assertEqual(round(-1000000000.1), -1000000000.0)
1584
1585 self.assertEqual(round(0.9), 1.0)
1586 self.assertEqual(round(9.9), 10.0)
1587 self.assertEqual(round(999999999.9), 1000000000.0)
1588
1589 self.assertEqual(round(-0.9), -1.0)
1590 self.assertEqual(round(-9.9), -10.0)
1591 self.assertEqual(round(-999999999.9), -1000000000.0)
1592
1593 self.assertEqual(round(-8.0, -1), -10.0)
1594
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001595 # test new kwargs
1596 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1597
Walter Dörwald919497e2003-01-19 16:23:59 +00001598 self.assertRaises(TypeError, round)
1599
1600 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001601 setattr(sys, 'spam', 1)
1602 self.assertEqual(sys.spam, 1)
1603 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1604 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001605
1606 def test_str(self):
1607 self.assertEqual(str(''), '')
1608 self.assertEqual(str(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001609 self.assertEqual(str(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001610 self.assertEqual(str(()), '()')
1611 self.assertEqual(str([]), '[]')
1612 self.assertEqual(str({}), '{}')
1613 a = []
1614 a.append(a)
1615 self.assertEqual(str(a), '[[...]]')
1616 a = {}
1617 a[0] = a
1618 self.assertEqual(str(a), '{0: {...}}')
1619
Alex Martellia70b1912003-04-22 08:12:33 +00001620 def test_sum(self):
1621 self.assertEqual(sum([]), 0)
1622 self.assertEqual(sum(range(2,8)), 27)
1623 self.assertEqual(sum(iter(range(2,8))), 27)
1624 self.assertEqual(sum(Squares(10)), 285)
1625 self.assertEqual(sum(iter(Squares(10))), 285)
1626 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1627
1628 self.assertRaises(TypeError, sum)
1629 self.assertRaises(TypeError, sum, 42)
1630 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1631 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1632 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1633 self.assertRaises(TypeError, sum, [{2:3}])
1634 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1635
1636 class BadSeq:
1637 def __getitem__(self, index):
1638 raise ValueError
1639 self.assertRaises(ValueError, sum, BadSeq())
1640
Walter Dörwald919497e2003-01-19 16:23:59 +00001641 def test_tuple(self):
1642 self.assertEqual(tuple(()), ())
1643 t0_3 = (0, 1, 2, 3)
1644 t0_3_bis = tuple(t0_3)
1645 self.assert_(t0_3 is t0_3_bis)
1646 self.assertEqual(tuple([]), ())
1647 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1648 self.assertEqual(tuple(''), ())
1649 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1650
1651 def test_type(self):
1652 self.assertEqual(type(''), type('123'))
1653 self.assertNotEqual(type(''), type(()))
1654
1655 def test_unichr(self):
1656 if have_unicode:
1657 self.assertEqual(unichr(32), unicode(' '))
1658 self.assertEqual(unichr(65), unicode('A'))
1659 self.assertEqual(unichr(97), unicode('a'))
1660 self.assertEqual(
1661 unichr(sys.maxunicode),
1662 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1663 )
1664 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1665 self.assertRaises(TypeError, unichr)
1666
Guido van Rossumfee7b932005-01-16 00:21:28 +00001667 # We don't want self in vars(), so these are static methods
1668
1669 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001670 def get_vars_f0():
1671 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001672
Guido van Rossumfee7b932005-01-16 00:21:28 +00001673 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001674 def get_vars_f2():
1675 BuiltinTest.get_vars_f0()
1676 a = 1
1677 b = 2
1678 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001679
1680 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001681 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001682 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001683 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001684 self.assertEqual(self.get_vars_f0(), {})
1685 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1686 self.assertRaises(TypeError, vars, 42, 42)
1687 self.assertRaises(TypeError, vars, 42)
1688
1689 def test_zip(self):
1690 a = (1, 2, 3)
1691 b = (4, 5, 6)
1692 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001693 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001694 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001695 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001696 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001697 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001698 class I:
1699 def __getitem__(self, i):
1700 if i < 0 or i > 2: raise IndexError
1701 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001702 self.assertEqual(list(zip(a, I())), t)
1703 self.assertEqual(list(zip()), [])
1704 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001705 self.assertRaises(TypeError, zip, None)
1706 class G:
1707 pass
1708 self.assertRaises(TypeError, zip, a, G())
1709
1710 # Make sure zip doesn't try to allocate a billion elements for the
1711 # result list when one of its arguments doesn't say how long it is.
1712 # A MemoryError is the most likely failure mode.
1713 class SequenceWithoutALength:
1714 def __getitem__(self, i):
1715 if i == 5:
1716 raise IndexError
1717 else:
1718 return i
1719 self.assertEqual(
Guido van Rossum801f0d72006-08-24 19:48:10 +00001720 list(zip(SequenceWithoutALength(), xrange(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001721 list(enumerate(range(5)))
1722 )
1723
1724 class BadSeq:
1725 def __getitem__(self, i):
1726 if i == 5:
1727 raise ValueError
1728 else:
1729 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001730 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001731
Raymond Hettinger64958a12003-12-17 20:43:33 +00001732class TestSorted(unittest.TestCase):
1733
1734 def test_basic(self):
1735 data = range(100)
1736 copy = data[:]
1737 random.shuffle(copy)
1738 self.assertEqual(data, sorted(copy))
1739 self.assertNotEqual(data, copy)
1740
1741 data.reverse()
1742 random.shuffle(copy)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001743 self.assertEqual(data, sorted(copy, cmp=lambda x, y: (x < y) - (x > y)))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001744 self.assertNotEqual(data, copy)
1745 random.shuffle(copy)
1746 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1747 self.assertNotEqual(data, copy)
1748 random.shuffle(copy)
1749 self.assertEqual(data, sorted(copy, reverse=1))
1750 self.assertNotEqual(data, copy)
1751
1752 def test_inputtypes(self):
1753 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001754 types = [list, tuple]
1755 if have_unicode:
1756 types.insert(0, unicode)
1757 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001758 self.assertEqual(sorted(s), sorted(T(s)))
1759
1760 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001761 types = [set, frozenset, list, tuple, dict.fromkeys]
1762 if have_unicode:
1763 types.insert(0, unicode)
1764 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001765 self.assertEqual(sorted(s), sorted(T(s)))
1766
1767 def test_baddecorator(self):
1768 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1769 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1770
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001771def test_main(verbose=None):
1772 test_classes = (BuiltinTest, TestSorted)
1773
1774 run_unittest(*test_classes)
1775
1776 # verify reference counting
1777 if verbose and hasattr(sys, "gettotalrefcount"):
1778 import gc
1779 counts = [None] * 5
1780 for i in xrange(len(counts)):
1781 run_unittest(*test_classes)
1782 gc.collect()
1783 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001784 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001785
Walter Dörwald919497e2003-01-19 16:23:59 +00001786
1787if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001788 test_main(verbose=True)