blob: 333e01e7067ea36af78b139e75f4fce520e4bdd6 [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')
110 self.assertRaises(ImportError, __import__, 'spamspam')
111 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +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)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +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
125 self.assertEqual(abs(0L), 0L)
126 self.assertEqual(abs(1234L), 1234L)
127 self.assertEqual(abs(-1234L), 1234L)
128 # 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
Armin Rigo7ccbca92006-10-04 12:17:45 +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_apply(self):
165 def f0(*args):
166 self.assertEqual(args, ())
167 def f1(a1):
168 self.assertEqual(a1, 1)
169 def f2(a1, a2):
170 self.assertEqual(a1, 1)
171 self.assertEqual(a2, 2)
172 def f3(a1, a2, a3):
173 self.assertEqual(a1, 1)
174 self.assertEqual(a2, 2)
175 self.assertEqual(a3, 3)
176 apply(f0, ())
177 apply(f1, (1,))
178 apply(f2, (1, 2))
179 apply(f3, (1, 2, 3))
180
181 # A PyCFunction that takes only positional parameters should allow an
182 # empty keyword dictionary to pass without a complaint, but raise a
183 # TypeError if the dictionary is non-empty.
184 apply(id, (1,), {})
185 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
186 self.assertRaises(TypeError, apply)
187 self.assertRaises(TypeError, apply, id, 42)
188 self.assertRaises(TypeError, apply, id, (42,), 42)
189
190 def test_callable(self):
191 self.assert_(callable(len))
192 def f(): pass
193 self.assert_(callable(f))
194 class C:
195 def meth(self): pass
196 self.assert_(callable(C))
197 x = C()
198 self.assert_(callable(x.meth))
199 self.assert_(not callable(x))
200 class D(C):
201 def __call__(self): pass
202 y = D()
203 self.assert_(callable(y))
204 y()
205
206 def test_chr(self):
207 self.assertEqual(chr(32), ' ')
208 self.assertEqual(chr(65), 'A')
209 self.assertEqual(chr(97), 'a')
210 self.assertEqual(chr(0xff), '\xff')
211 self.assertRaises(ValueError, chr, 256)
212 self.assertRaises(TypeError, chr)
213
214 def test_cmp(self):
215 self.assertEqual(cmp(-1, 1), -1)
216 self.assertEqual(cmp(1, -1), 1)
217 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000218 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 a = []; a.append(a)
220 b = []; b.append(b)
221 from UserList import UserList
222 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000223 self.assertRaises(RuntimeError, cmp, a, b)
224 self.assertRaises(RuntimeError, cmp, b, c)
225 self.assertRaises(RuntimeError, cmp, c, a)
226 self.assertRaises(RuntimeError, cmp, a, c)
227 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000228 a.pop(); b.pop(); c.pop()
229 self.assertRaises(TypeError, cmp)
230
231 def test_coerce(self):
232 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
233 self.assertEqual(coerce(1, 1L), (1L, 1L))
234 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
235 self.assertRaises(TypeError, coerce)
236 class BadNumber:
237 def __coerce__(self, other):
238 raise ValueError
239 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000240 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000241
242 def test_compile(self):
243 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000244 bom = '\xef\xbb\xbf'
245 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000246 self.assertRaises(TypeError, compile)
247 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
248 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000249 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000250 if have_unicode:
251 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000252 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
253 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000254
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 def test_delattr(self):
256 import sys
257 sys.spam = 1
258 delattr(sys, 'spam')
259 self.assertRaises(TypeError, delattr)
260
261 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000262 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000263 self.assertRaises(TypeError, dir, 42, 42)
264
Georg Brandl871f1bc2007-03-12 13:17:36 +0000265 # dir() - local scope
266 local_var = 1
267 self.assert_('local_var' in dir())
268
269 # dir(module)
270 import sys
271 self.assert_('exit' in dir(sys))
272
273 # dir(module_with_invalid__dict__)
274 import types
275 class Foo(types.ModuleType):
276 __dict__ = 8
277 f = Foo("foo")
278 self.assertRaises(TypeError, dir, f)
279
280 # dir(type)
281 self.assert_("strip" in dir(str))
282 self.assert_("__mro__" not in dir(str))
283
284 # dir(obj)
285 class Foo(object):
286 def __init__(self):
287 self.x = 7
288 self.y = 8
289 self.z = 9
290 f = Foo()
291 self.assert_("y" in dir(f))
292
293 # dir(obj_no__dict__)
294 class Foo(object):
295 __slots__ = []
296 f = Foo()
297 self.assert_("__repr__" in dir(f))
298
299 # dir(obj_no__class__with__dict__)
300 # (an ugly trick to cause getattr(f, "__class__") to fail)
301 class Foo(object):
302 __slots__ = ["__class__", "__dict__"]
303 def __init__(self):
304 self.bar = "wow"
305 f = Foo()
306 self.assert_("__repr__" not in dir(f))
307 self.assert_("bar" in dir(f))
308
309 # dir(obj_using __dir__)
310 class Foo(object):
311 def __dir__(self):
312 return ["kan", "ga", "roo"]
313 f = Foo()
314 self.assert_(dir(f) == ["ga", "kan", "roo"])
315
316 # dir(obj__dir__not_list)
317 class Foo(object):
318 def __dir__(self):
319 return 7
320 f = Foo()
321 self.assertRaises(TypeError, dir, f)
322
Walter Dörwald919497e2003-01-19 16:23:59 +0000323 def test_divmod(self):
324 self.assertEqual(divmod(12, 7), (1, 5))
325 self.assertEqual(divmod(-12, 7), (-2, 2))
326 self.assertEqual(divmod(12, -7), (-2, -2))
327 self.assertEqual(divmod(-12, -7), (1, -5))
328
329 self.assertEqual(divmod(12L, 7L), (1L, 5L))
330 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
331 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
332 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
333
334 self.assertEqual(divmod(12, 7L), (1, 5L))
335 self.assertEqual(divmod(-12, 7L), (-2, 2L))
336 self.assertEqual(divmod(12L, -7), (-2L, -2))
337 self.assertEqual(divmod(-12L, -7), (1L, -5))
338
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000339 self.assertEqual(divmod(-sys.maxint-1, -1),
340 (sys.maxint+1, 0))
341
Walter Dörwald919497e2003-01-19 16:23:59 +0000342 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
343 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
344 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
345 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
346
347 self.assertRaises(TypeError, divmod)
348
349 def test_eval(self):
350 self.assertEqual(eval('1+1'), 2)
351 self.assertEqual(eval(' 1+1\n'), 2)
352 globals = {'a': 1, 'b': 2}
353 locals = {'b': 200, 'c': 300}
354 self.assertEqual(eval('a', globals) , 1)
355 self.assertEqual(eval('a', globals, locals), 1)
356 self.assertEqual(eval('b', globals, locals), 200)
357 self.assertEqual(eval('c', globals, locals), 300)
358 if have_unicode:
359 self.assertEqual(eval(unicode('1+1')), 2)
360 self.assertEqual(eval(unicode(' 1+1\n')), 2)
361 globals = {'a': 1, 'b': 2}
362 locals = {'b': 200, 'c': 300}
363 if have_unicode:
364 self.assertEqual(eval(unicode('a'), globals), 1)
365 self.assertEqual(eval(unicode('a'), globals, locals), 1)
366 self.assertEqual(eval(unicode('b'), globals, locals), 200)
367 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000368 bom = '\xef\xbb\xbf'
369 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000370 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
371 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000372 self.assertRaises(TypeError, eval)
373 self.assertRaises(TypeError, eval, ())
374
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000375 def test_general_eval(self):
376 # Tests that general mappings can be used for the locals argument
377
378 class M:
379 "Test mapping interface versus possible calls from eval()."
380 def __getitem__(self, key):
381 if key == 'a':
382 return 12
383 raise KeyError
384 def keys(self):
385 return list('xyz')
386
387 m = M()
388 g = globals()
389 self.assertEqual(eval('a', g, m), 12)
390 self.assertRaises(NameError, eval, 'b', g, m)
391 self.assertEqual(eval('dir()', g, m), list('xyz'))
392 self.assertEqual(eval('globals()', g, m), g)
393 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000394 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000395 class A:
396 "Non-mapping"
397 pass
398 m = A()
399 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000400
401 # Verify that dict subclasses work as well
402 class D(dict):
403 def __getitem__(self, key):
404 if key == 'a':
405 return 12
406 return dict.__getitem__(self, key)
407 def keys(self):
408 return list('xyz')
409
410 d = D()
411 self.assertEqual(eval('a', g, d), 12)
412 self.assertRaises(NameError, eval, 'b', g, d)
413 self.assertEqual(eval('dir()', g, d), list('xyz'))
414 self.assertEqual(eval('globals()', g, d), g)
415 self.assertEqual(eval('locals()', g, d), d)
416
417 # Verify locals stores (used by list comps)
418 eval('[locals() for i in (2,3)]', g, d)
419 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
420
421 class SpreadSheet:
422 "Sample application showing nested, calculated lookups."
423 _cells = {}
424 def __setitem__(self, key, formula):
425 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000426 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000427 return eval(self._cells[key], globals(), self)
428
429 ss = SpreadSheet()
430 ss['a1'] = '5'
431 ss['a2'] = 'a1*6'
432 ss['a3'] = 'a2*7'
433 self.assertEqual(ss['a3'], 210)
434
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000435 # Verify that dir() catches a non-list returned by eval
436 # SF bug #1004669
437 class C:
438 def __getitem__(self, item):
439 raise KeyError(item)
440 def keys(self):
441 return 'a'
442 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
443
Walter Dörwald919497e2003-01-19 16:23:59 +0000444 # Done outside of the method test_z to get the correct scope
445 z = 0
446 f = open(TESTFN, 'w')
447 f.write('z = z+1\n')
448 f.write('z = z*2\n')
449 f.close()
450 execfile(TESTFN)
451
452 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000453 global numruns
454 if numruns:
455 return
456 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000457
Walter Dörwald919497e2003-01-19 16:23:59 +0000458 globals = {'a': 1, 'b': 2}
459 locals = {'b': 200, 'c': 300}
460
461 self.assertEqual(self.__class__.z, 2)
462 globals['z'] = 0
463 execfile(TESTFN, globals)
464 self.assertEqual(globals['z'], 2)
465 locals['z'] = 0
466 execfile(TESTFN, globals, locals)
467 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000468
469 class M:
470 "Test mapping interface versus possible calls from execfile()."
471 def __init__(self):
472 self.z = 10
473 def __getitem__(self, key):
474 if key == 'z':
475 return self.z
476 raise KeyError
477 def __setitem__(self, key, value):
478 if key == 'z':
479 self.z = value
480 return
481 raise KeyError
482
483 locals = M()
484 locals['z'] = 0
485 execfile(TESTFN, globals, locals)
486 self.assertEqual(locals['z'], 2)
487
Walter Dörwald919497e2003-01-19 16:23:59 +0000488 unlink(TESTFN)
489 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000490 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000491 import os
492 self.assertRaises(IOError, execfile, os.curdir)
493 self.assertRaises(IOError, execfile, "I_dont_exist")
494
495 def test_filter(self):
496 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
497 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
498 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
499 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
500 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
501 def identity(item):
502 return 1
503 filter(identity, Squares(5))
504 self.assertRaises(TypeError, filter)
505 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000506 def __getitem__(self, index):
507 if index<4:
508 return 42
509 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000510 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
511 def badfunc():
512 pass
513 self.assertRaises(TypeError, filter, badfunc, range(5))
514
Walter Dörwaldbf517072003-01-27 15:57:14 +0000515 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 self.assertEqual(filter(None, (1, 2)), (1, 2))
517 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
518 self.assertRaises(TypeError, filter, 42, (1, 2))
519
Walter Dörwaldbf517072003-01-27 15:57:14 +0000520 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000521 self.assertEqual(filter(None, "12"), "12")
522 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
523 self.assertRaises(TypeError, filter, 42, "12")
524 class badstr(str):
525 def __getitem__(self, index):
526 raise ValueError
527 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000528
Walter Dörwald903f1e02003-02-04 16:28:00 +0000529 class badstr2(str):
530 def __getitem__(self, index):
531 return 42
532 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
533
534 class weirdstr(str):
535 def __getitem__(self, index):
536 return weirdstr(2*str.__getitem__(self, index))
537 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
538
Walter Dörwald5e61e242003-02-04 17:04:01 +0000539 class shiftstr(str):
540 def __getitem__(self, index):
541 return chr(ord(str.__getitem__(self, index))+1)
542 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
543
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000544 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000545 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000546 self.assertEqual(filter(None, unicode("12")), unicode("12"))
547 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
548 self.assertRaises(TypeError, filter, 42, unicode("12"))
549 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000550
Walter Dörwald903f1e02003-02-04 16:28:00 +0000551 class badunicode(unicode):
552 def __getitem__(self, index):
553 return 42
554 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
555
556 class weirdunicode(unicode):
557 def __getitem__(self, index):
558 return weirdunicode(2*unicode.__getitem__(self, index))
559 self.assertEqual(
560 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
561
Walter Dörwald5e61e242003-02-04 17:04:01 +0000562 class shiftunicode(unicode):
563 def __getitem__(self, index):
564 return unichr(ord(unicode.__getitem__(self, index))+1)
565 self.assertEqual(
566 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
567 unicode("345")
568 )
569
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000570 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000571 # test that filter() never returns tuple, str or unicode subclasses
572 # and that the result always goes through __getitem__
573 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000574 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000575 def __getitem__(self, index):
576 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000577 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000578 def __getitem__(self, index):
579 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000580 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000581 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000582 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000583 }
584 if have_unicode:
585 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000586 def __getitem__(self, index):
587 return 2*unicode.__getitem__(self, index)
588 inputs[unicode2] = {
589 unicode(): unicode(),
590 unicode("123"): unicode("112233")
591 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000592
Walter Dörwald1918f772003-02-10 13:19:13 +0000593 for (cls, inps) in inputs.iteritems():
594 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000595 # make sure the output goes through __getitem__
596 # even if func is None
597 self.assertEqual(
598 filter(funcs[0], cls(inp)),
599 filter(funcs[1], cls(inp))
600 )
601 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000602 outp = filter(func, cls(inp))
603 self.assertEqual(outp, exp)
604 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000605
Walter Dörwald919497e2003-01-19 16:23:59 +0000606 def test_float(self):
607 self.assertEqual(float(3.14), 3.14)
608 self.assertEqual(float(314), 314.0)
609 self.assertEqual(float(314L), 314.0)
610 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000611 self.assertRaises(ValueError, float, " 0x3.1 ")
612 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000613 if have_unicode:
614 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
615 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000616 # Implementation limitation in PyFloat_FromString()
617 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000618
Georg Brandlde9b6242006-04-30 11:13:56 +0000619 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000620 def test_float_with_comma(self):
621 # set locale to something that doesn't use '.' for the decimal point
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000622 # float must not accept the locale specific decimal point but
623 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000624 import locale
625 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000626 return
627
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000628 self.assertEqual(float(" 3.14 "), 3.14)
629 self.assertEqual(float("+3.14 "), 3.14)
630 self.assertEqual(float("-3.14 "), -3.14)
631 self.assertEqual(float(".14 "), .14)
632 self.assertEqual(float("3. "), 3.0)
633 self.assertEqual(float("3.e3 "), 3000.0)
634 self.assertEqual(float("3.2e3 "), 3200.0)
635 self.assertEqual(float("2.5e-1 "), 0.25)
636 self.assertEqual(float("5e-1"), 0.5)
637 self.assertRaises(ValueError, float, " 3,14 ")
638 self.assertRaises(ValueError, float, " +3,14 ")
639 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000640 self.assertRaises(ValueError, float, " 0x3.1 ")
641 self.assertRaises(ValueError, float, " -0x3.p-1 ")
642 self.assertEqual(float(" 25.e-1 "), 2.5)
643 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000644
Brett Cannonc3647ac2005-04-26 03:45:26 +0000645 def test_floatconversion(self):
646 # Make sure that calls to __float__() work properly
647 class Foo0:
648 def __float__(self):
649 return 42.
650
651 class Foo1(object):
652 def __float__(self):
653 return 42.
654
655 class Foo2(float):
656 def __float__(self):
657 return 42.
658
659 class Foo3(float):
660 def __new__(cls, value=0.):
661 return float.__new__(cls, 2*value)
662
663 def __float__(self):
664 return self
665
666 class Foo4(float):
667 def __float__(self):
668 return 42
669
670 self.assertAlmostEqual(float(Foo0()), 42.)
671 self.assertAlmostEqual(float(Foo1()), 42.)
672 self.assertAlmostEqual(float(Foo2()), 42.)
673 self.assertAlmostEqual(float(Foo3(21)), 42.)
674 self.assertRaises(TypeError, float, Foo4(42))
675
Walter Dörwald919497e2003-01-19 16:23:59 +0000676 def test_getattr(self):
677 import sys
678 self.assert_(getattr(sys, 'stdout') is sys.stdout)
679 self.assertRaises(TypeError, getattr, sys, 1)
680 self.assertRaises(TypeError, getattr, sys, 1, "foo")
681 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000682 if have_unicode:
683 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000684
685 def test_hasattr(self):
686 import sys
687 self.assert_(hasattr(sys, 'stdout'))
688 self.assertRaises(TypeError, hasattr, sys, 1)
689 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000690 if have_unicode:
691 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000692
693 def test_hash(self):
694 hash(None)
695 self.assertEqual(hash(1), hash(1L))
696 self.assertEqual(hash(1), hash(1.0))
697 hash('spam')
698 if have_unicode:
699 self.assertEqual(hash('spam'), hash(unicode('spam')))
700 hash((0,1,2,3))
701 def f(): pass
702 self.assertRaises(TypeError, hash, [])
703 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000704 # Bug 1536021: Allow hash to return long objects
705 class X:
706 def __hash__(self):
707 return 2**100
708 self.assertEquals(type(hash(X())), int)
709 class Y(object):
710 def __hash__(self):
711 return 2**100
712 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000713 class Z(long):
714 def __hash__(self):
715 return self
716 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000717
718 def test_hex(self):
719 self.assertEqual(hex(16), '0x10')
720 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000721 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000722 self.assertEqual(hex(-16L), '-0x10L')
723 self.assertRaises(TypeError, hex, {})
724
725 def test_id(self):
726 id(None)
727 id(1)
728 id(1L)
729 id(1.0)
730 id('spam')
731 id((0,1,2,3))
732 id([0,1,2,3])
733 id({'spam': 1, 'eggs': 2, 'ham': 3})
734
735 # Test input() later, together with raw_input
736
737 def test_int(self):
738 self.assertEqual(int(314), 314)
739 self.assertEqual(int(3.14), 3)
740 self.assertEqual(int(314L), 314)
741 # Check that conversion from float truncates towards zero
742 self.assertEqual(int(-3.14), -3)
743 self.assertEqual(int(3.9), 3)
744 self.assertEqual(int(-3.9), -3)
745 self.assertEqual(int(3.5), 3)
746 self.assertEqual(int(-3.5), -3)
747 # Different base:
748 self.assertEqual(int("10",16), 16L)
749 if have_unicode:
750 self.assertEqual(int(unicode("10"),16), 16L)
751 # Test conversion from strings and various anomalies
752 for s, v in L:
753 for sign in "", "+", "-":
754 for prefix in "", " ", "\t", " \t\t ":
755 ss = prefix + sign + s
756 vv = v
757 if sign == "-" and v is not ValueError:
758 vv = -v
759 try:
760 self.assertEqual(int(ss), vv)
761 except v:
762 pass
763
Walter Dörwald70a6b492004-02-12 17:35:32 +0000764 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000765 x = int(s)
766 self.assertEqual(x+1, -sys.maxint)
767 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000768 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000769 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000770
771 # should return long
772 x = int(1e100)
773 self.assert_(isinstance(x, long))
774 x = int(-1e100)
775 self.assert_(isinstance(x, long))
776
777
778 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
779 # Worked by accident in Windows release build, but failed in debug build.
780 # Failed in all Linux builds.
781 x = -1-sys.maxint
782 self.assertEqual(x >> 1, x//2)
783
784 self.assertRaises(ValueError, int, '123\0')
785 self.assertRaises(ValueError, int, '53', 40)
786
Georg Brandl2c1375c2006-10-12 11:27:59 +0000787 # SF bug 1545497: embedded NULs were not detected with
788 # explicit base
789 self.assertRaises(ValueError, int, '123\0', 10)
790 self.assertRaises(ValueError, int, '123\x00 245', 20)
791
Walter Dörwald919497e2003-01-19 16:23:59 +0000792 x = int('1' * 600)
793 self.assert_(isinstance(x, long))
794
795 if have_unicode:
796 x = int(unichr(0x661) * 600)
797 self.assert_(isinstance(x, long))
798
799 self.assertRaises(TypeError, int, 1, 12)
800
801 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000802 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000803
Tim Petersb713ec22006-05-23 18:45:30 +0000804 # SF bug 1334662: int(string, base) wrong answers
805 # Various representations of 2**32 evaluated to 0
806 # rather than 2**32 in previous versions
807
808 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
809 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
810 self.assertEqual(int('10000000000000000', 4), 4294967296L)
811 self.assertEqual(int('32244002423141', 5), 4294967296L)
812 self.assertEqual(int('1550104015504', 6), 4294967296L)
813 self.assertEqual(int('211301422354', 7), 4294967296L)
814 self.assertEqual(int('40000000000', 8), 4294967296L)
815 self.assertEqual(int('12068657454', 9), 4294967296L)
816 self.assertEqual(int('4294967296', 10), 4294967296L)
817 self.assertEqual(int('1904440554', 11), 4294967296L)
818 self.assertEqual(int('9ba461594', 12), 4294967296L)
819 self.assertEqual(int('535a79889', 13), 4294967296L)
820 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
821 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
822 self.assertEqual(int('100000000', 16), 4294967296L)
823 self.assertEqual(int('a7ffda91', 17), 4294967296L)
824 self.assertEqual(int('704he7g4', 18), 4294967296L)
825 self.assertEqual(int('4f5aff66', 19), 4294967296L)
826 self.assertEqual(int('3723ai4g', 20), 4294967296L)
827 self.assertEqual(int('281d55i4', 21), 4294967296L)
828 self.assertEqual(int('1fj8b184', 22), 4294967296L)
829 self.assertEqual(int('1606k7ic', 23), 4294967296L)
830 self.assertEqual(int('mb994ag', 24), 4294967296L)
831 self.assertEqual(int('hek2mgl', 25), 4294967296L)
832 self.assertEqual(int('dnchbnm', 26), 4294967296L)
833 self.assertEqual(int('b28jpdm', 27), 4294967296L)
834 self.assertEqual(int('8pfgih4', 28), 4294967296L)
835 self.assertEqual(int('76beigg', 29), 4294967296L)
836 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
837 self.assertEqual(int('4q0jto4', 31), 4294967296L)
838 self.assertEqual(int('4000000', 32), 4294967296L)
839 self.assertEqual(int('3aokq94', 33), 4294967296L)
840 self.assertEqual(int('2qhxjli', 34), 4294967296L)
841 self.assertEqual(int('2br45qb', 35), 4294967296L)
842 self.assertEqual(int('1z141z4', 36), 4294967296L)
843
844 # SF bug 1334662: int(string, base) wrong answers
845 # Checks for proper evaluation of 2**32 + 1
846 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
847 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
848 self.assertEqual(int('10000000000000001', 4), 4294967297L)
849 self.assertEqual(int('32244002423142', 5), 4294967297L)
850 self.assertEqual(int('1550104015505', 6), 4294967297L)
851 self.assertEqual(int('211301422355', 7), 4294967297L)
852 self.assertEqual(int('40000000001', 8), 4294967297L)
853 self.assertEqual(int('12068657455', 9), 4294967297L)
854 self.assertEqual(int('4294967297', 10), 4294967297L)
855 self.assertEqual(int('1904440555', 11), 4294967297L)
856 self.assertEqual(int('9ba461595', 12), 4294967297L)
857 self.assertEqual(int('535a7988a', 13), 4294967297L)
858 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
859 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
860 self.assertEqual(int('100000001', 16), 4294967297L)
861 self.assertEqual(int('a7ffda92', 17), 4294967297L)
862 self.assertEqual(int('704he7g5', 18), 4294967297L)
863 self.assertEqual(int('4f5aff67', 19), 4294967297L)
864 self.assertEqual(int('3723ai4h', 20), 4294967297L)
865 self.assertEqual(int('281d55i5', 21), 4294967297L)
866 self.assertEqual(int('1fj8b185', 22), 4294967297L)
867 self.assertEqual(int('1606k7id', 23), 4294967297L)
868 self.assertEqual(int('mb994ah', 24), 4294967297L)
869 self.assertEqual(int('hek2mgm', 25), 4294967297L)
870 self.assertEqual(int('dnchbnn', 26), 4294967297L)
871 self.assertEqual(int('b28jpdn', 27), 4294967297L)
872 self.assertEqual(int('8pfgih5', 28), 4294967297L)
873 self.assertEqual(int('76beigh', 29), 4294967297L)
874 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
875 self.assertEqual(int('4q0jto5', 31), 4294967297L)
876 self.assertEqual(int('4000001', 32), 4294967297L)
877 self.assertEqual(int('3aokq95', 33), 4294967297L)
878 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
879 self.assertEqual(int('2br45qc', 35), 4294967297L)
880 self.assertEqual(int('1z141z5', 36), 4294967297L)
881
Brett Cannonc3647ac2005-04-26 03:45:26 +0000882 def test_intconversion(self):
883 # Test __int__()
884 class Foo0:
885 def __int__(self):
886 return 42
887
888 class Foo1(object):
889 def __int__(self):
890 return 42
891
892 class Foo2(int):
893 def __int__(self):
894 return 42
895
896 class Foo3(int):
897 def __int__(self):
898 return self
899
900 class Foo4(int):
901 def __int__(self):
902 return 42L
903
904 class Foo5(int):
905 def __int__(self):
906 return 42.
907
908 self.assertEqual(int(Foo0()), 42)
909 self.assertEqual(int(Foo1()), 42)
910 self.assertEqual(int(Foo2()), 42)
911 self.assertEqual(int(Foo3()), 0)
912 self.assertEqual(int(Foo4()), 42L)
913 self.assertRaises(TypeError, int, Foo5())
914
Walter Dörwald919497e2003-01-19 16:23:59 +0000915 def test_intern(self):
916 self.assertRaises(TypeError, intern)
917 s = "never interned before"
918 self.assert_(intern(s) is s)
919 s2 = s.swapcase().swapcase()
920 self.assert_(intern(s2) is s)
921
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000922 # Subclasses of string can't be interned, because they
923 # provide too much opportunity for insane things to happen.
924 # We don't want them in the interned dict and if they aren't
925 # actually interned, we don't want to create the appearance
926 # that they are by allowing intern() to succeeed.
927 class S(str):
928 def __hash__(self):
929 return 123
930
931 self.assertRaises(TypeError, intern, S("abc"))
932
933 # It's still safe to pass these strings to routines that
934 # call intern internally, e.g. PyObject_SetAttr().
935 s = S("abc")
936 setattr(s, s, s)
937 self.assertEqual(getattr(s, s), s)
938
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 def test_iter(self):
940 self.assertRaises(TypeError, iter)
941 self.assertRaises(TypeError, iter, 42, 42)
942 lists = [("1", "2"), ["1", "2"], "12"]
943 if have_unicode:
944 lists.append(unicode("12"))
945 for l in lists:
946 i = iter(l)
947 self.assertEqual(i.next(), '1')
948 self.assertEqual(i.next(), '2')
949 self.assertRaises(StopIteration, i.next)
950
951 def test_isinstance(self):
952 class C:
953 pass
954 class D(C):
955 pass
956 class E:
957 pass
958 c = C()
959 d = D()
960 e = E()
961 self.assert_(isinstance(c, C))
962 self.assert_(isinstance(d, C))
963 self.assert_(not isinstance(e, C))
964 self.assert_(not isinstance(c, D))
965 self.assert_(not isinstance('foo', E))
966 self.assertRaises(TypeError, isinstance, E, 'foo')
967 self.assertRaises(TypeError, isinstance)
968
969 def test_issubclass(self):
970 class C:
971 pass
972 class D(C):
973 pass
974 class E:
975 pass
976 c = C()
977 d = D()
978 e = E()
979 self.assert_(issubclass(D, C))
980 self.assert_(issubclass(C, C))
981 self.assert_(not issubclass(C, D))
982 self.assertRaises(TypeError, issubclass, 'foo', E)
983 self.assertRaises(TypeError, issubclass, E, 'foo')
984 self.assertRaises(TypeError, issubclass)
985
986 def test_len(self):
987 self.assertEqual(len('123'), 3)
988 self.assertEqual(len(()), 0)
989 self.assertEqual(len((1, 2, 3, 4)), 4)
990 self.assertEqual(len([1, 2, 3, 4]), 4)
991 self.assertEqual(len({}), 0)
992 self.assertEqual(len({'a':1, 'b': 2}), 2)
993 class BadSeq:
994 def __len__(self):
995 raise ValueError
996 self.assertRaises(ValueError, len, BadSeq())
997
998 def test_list(self):
999 self.assertEqual(list([]), [])
1000 l0_3 = [0, 1, 2, 3]
1001 l0_3_bis = list(l0_3)
1002 self.assertEqual(l0_3, l0_3_bis)
1003 self.assert_(l0_3 is not l0_3_bis)
1004 self.assertEqual(list(()), [])
1005 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1006 self.assertEqual(list(''), [])
1007 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1008
1009 if sys.maxint == 0x7fffffff:
1010 # This test can currently only work on 32-bit machines.
1011 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1012 # XXX re-enabled.
1013 # Verify clearing of bug #556025.
1014 # This assumes that the max data size (sys.maxint) == max
1015 # address size this also assumes that the address size is at
1016 # least 4 bytes with 8 byte addresses, the bug is not well
1017 # tested
1018 #
1019 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1020 # earlier due to a newlib bug. See the following mailing list
1021 # thread for the details:
1022
1023 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1024 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1025
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001026 # This code used to segfault in Py2.4a3
1027 x = []
1028 x.extend(-y for y in x)
1029 self.assertEqual(x, [])
1030
Walter Dörwald919497e2003-01-19 16:23:59 +00001031 def test_long(self):
1032 self.assertEqual(long(314), 314L)
1033 self.assertEqual(long(3.14), 3L)
1034 self.assertEqual(long(314L), 314L)
1035 # Check that conversion from float truncates towards zero
1036 self.assertEqual(long(-3.14), -3L)
1037 self.assertEqual(long(3.9), 3L)
1038 self.assertEqual(long(-3.9), -3L)
1039 self.assertEqual(long(3.5), 3L)
1040 self.assertEqual(long(-3.5), -3L)
1041 self.assertEqual(long("-3"), -3L)
1042 if have_unicode:
1043 self.assertEqual(long(unicode("-3")), -3L)
1044 # Different base:
1045 self.assertEqual(long("10",16), 16L)
1046 if have_unicode:
1047 self.assertEqual(long(unicode("10"),16), 16L)
1048 # Check conversions from string (same test set as for int(), and then some)
1049 LL = [
1050 ('1' + '0'*20, 10L**20),
1051 ('1' + '0'*100, 10L**100)
1052 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001053 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001054 if have_unicode:
1055 L2 += [
1056 (unicode('1') + unicode('0')*20, 10L**20),
1057 (unicode('1') + unicode('0')*100, 10L**100),
1058 ]
1059 for s, v in L2 + LL:
1060 for sign in "", "+", "-":
1061 for prefix in "", " ", "\t", " \t\t ":
1062 ss = prefix + sign + s
1063 vv = v
1064 if sign == "-" and v is not ValueError:
1065 vv = -v
1066 try:
1067 self.assertEqual(long(ss), long(vv))
1068 except v:
1069 pass
1070
1071 self.assertRaises(ValueError, long, '123\0')
1072 self.assertRaises(ValueError, long, '53', 40)
1073 self.assertRaises(TypeError, long, 1, 12)
1074
Georg Brandl00cd8182007-03-06 18:41:12 +00001075 # SF patch #1638879: embedded NULs were not detected with
1076 # explicit base
1077 self.assertRaises(ValueError, long, '123\0', 10)
1078 self.assertRaises(ValueError, long, '123\x00 245', 20)
1079
Tim Peters696cf432006-05-24 21:10:40 +00001080 self.assertEqual(long('100000000000000000000000000000000', 2),
1081 4294967296)
1082 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1083 self.assertEqual(long('10000000000000000', 4), 4294967296)
1084 self.assertEqual(long('32244002423141', 5), 4294967296)
1085 self.assertEqual(long('1550104015504', 6), 4294967296)
1086 self.assertEqual(long('211301422354', 7), 4294967296)
1087 self.assertEqual(long('40000000000', 8), 4294967296)
1088 self.assertEqual(long('12068657454', 9), 4294967296)
1089 self.assertEqual(long('4294967296', 10), 4294967296)
1090 self.assertEqual(long('1904440554', 11), 4294967296)
1091 self.assertEqual(long('9ba461594', 12), 4294967296)
1092 self.assertEqual(long('535a79889', 13), 4294967296)
1093 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1094 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1095 self.assertEqual(long('100000000', 16), 4294967296)
1096 self.assertEqual(long('a7ffda91', 17), 4294967296)
1097 self.assertEqual(long('704he7g4', 18), 4294967296)
1098 self.assertEqual(long('4f5aff66', 19), 4294967296)
1099 self.assertEqual(long('3723ai4g', 20), 4294967296)
1100 self.assertEqual(long('281d55i4', 21), 4294967296)
1101 self.assertEqual(long('1fj8b184', 22), 4294967296)
1102 self.assertEqual(long('1606k7ic', 23), 4294967296)
1103 self.assertEqual(long('mb994ag', 24), 4294967296)
1104 self.assertEqual(long('hek2mgl', 25), 4294967296)
1105 self.assertEqual(long('dnchbnm', 26), 4294967296)
1106 self.assertEqual(long('b28jpdm', 27), 4294967296)
1107 self.assertEqual(long('8pfgih4', 28), 4294967296)
1108 self.assertEqual(long('76beigg', 29), 4294967296)
1109 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1110 self.assertEqual(long('4q0jto4', 31), 4294967296)
1111 self.assertEqual(long('4000000', 32), 4294967296)
1112 self.assertEqual(long('3aokq94', 33), 4294967296)
1113 self.assertEqual(long('2qhxjli', 34), 4294967296)
1114 self.assertEqual(long('2br45qb', 35), 4294967296)
1115 self.assertEqual(long('1z141z4', 36), 4294967296)
1116
1117 self.assertEqual(long('100000000000000000000000000000001', 2),
1118 4294967297)
1119 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1120 self.assertEqual(long('10000000000000001', 4), 4294967297)
1121 self.assertEqual(long('32244002423142', 5), 4294967297)
1122 self.assertEqual(long('1550104015505', 6), 4294967297)
1123 self.assertEqual(long('211301422355', 7), 4294967297)
1124 self.assertEqual(long('40000000001', 8), 4294967297)
1125 self.assertEqual(long('12068657455', 9), 4294967297)
1126 self.assertEqual(long('4294967297', 10), 4294967297)
1127 self.assertEqual(long('1904440555', 11), 4294967297)
1128 self.assertEqual(long('9ba461595', 12), 4294967297)
1129 self.assertEqual(long('535a7988a', 13), 4294967297)
1130 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1131 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1132 self.assertEqual(long('100000001', 16), 4294967297)
1133 self.assertEqual(long('a7ffda92', 17), 4294967297)
1134 self.assertEqual(long('704he7g5', 18), 4294967297)
1135 self.assertEqual(long('4f5aff67', 19), 4294967297)
1136 self.assertEqual(long('3723ai4h', 20), 4294967297)
1137 self.assertEqual(long('281d55i5', 21), 4294967297)
1138 self.assertEqual(long('1fj8b185', 22), 4294967297)
1139 self.assertEqual(long('1606k7id', 23), 4294967297)
1140 self.assertEqual(long('mb994ah', 24), 4294967297)
1141 self.assertEqual(long('hek2mgm', 25), 4294967297)
1142 self.assertEqual(long('dnchbnn', 26), 4294967297)
1143 self.assertEqual(long('b28jpdn', 27), 4294967297)
1144 self.assertEqual(long('8pfgih5', 28), 4294967297)
1145 self.assertEqual(long('76beigh', 29), 4294967297)
1146 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1147 self.assertEqual(long('4q0jto5', 31), 4294967297)
1148 self.assertEqual(long('4000001', 32), 4294967297)
1149 self.assertEqual(long('3aokq95', 33), 4294967297)
1150 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1151 self.assertEqual(long('2br45qc', 35), 4294967297)
1152 self.assertEqual(long('1z141z5', 36), 4294967297)
1153
1154
Brett Cannonc3647ac2005-04-26 03:45:26 +00001155 def test_longconversion(self):
1156 # Test __long__()
1157 class Foo0:
1158 def __long__(self):
1159 return 42L
1160
1161 class Foo1(object):
1162 def __long__(self):
1163 return 42L
1164
1165 class Foo2(long):
1166 def __long__(self):
1167 return 42L
1168
1169 class Foo3(long):
1170 def __long__(self):
1171 return self
1172
1173 class Foo4(long):
1174 def __long__(self):
1175 return 42
1176
1177 class Foo5(long):
1178 def __long__(self):
1179 return 42.
1180
1181 self.assertEqual(long(Foo0()), 42L)
1182 self.assertEqual(long(Foo1()), 42L)
1183 self.assertEqual(long(Foo2()), 42L)
1184 self.assertEqual(long(Foo3()), 0)
1185 self.assertEqual(long(Foo4()), 42)
1186 self.assertRaises(TypeError, long, Foo5())
1187
Walter Dörwald919497e2003-01-19 16:23:59 +00001188 def test_map(self):
1189 self.assertEqual(
1190 map(None, 'hello world'),
1191 ['h','e','l','l','o',' ','w','o','r','l','d']
1192 )
1193 self.assertEqual(
1194 map(None, 'abcd', 'efg'),
1195 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1196 )
1197 self.assertEqual(
1198 map(None, range(10)),
1199 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1200 )
1201 self.assertEqual(
1202 map(lambda x: x*x, range(1,4)),
1203 [1, 4, 9]
1204 )
1205 try:
1206 from math import sqrt
1207 except ImportError:
1208 def sqrt(x):
1209 return pow(x, 0.5)
1210 self.assertEqual(
1211 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1212 [[4.0, 2.0], [9.0, 3.0]]
1213 )
1214 self.assertEqual(
1215 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1216 [10, 4, 6]
1217 )
1218
1219 def plus(*v):
1220 accu = 0
1221 for i in v: accu = accu + i
1222 return accu
1223 self.assertEqual(
1224 map(plus, [1, 3, 7]),
1225 [1, 3, 7]
1226 )
1227 self.assertEqual(
1228 map(plus, [1, 3, 7], [4, 9, 2]),
1229 [1+4, 3+9, 7+2]
1230 )
1231 self.assertEqual(
1232 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1233 [1+4+1, 3+9+1, 7+2+0]
1234 )
1235 self.assertEqual(
1236 map(None, Squares(10)),
1237 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1238 )
1239 self.assertEqual(
1240 map(int, Squares(10)),
1241 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1242 )
1243 self.assertEqual(
1244 map(None, Squares(3), Squares(2)),
1245 [(0,0), (1,1), (4,None)]
1246 )
1247 self.assertEqual(
1248 map(max, Squares(3), Squares(2)),
1249 [0, 1, 4]
1250 )
1251 self.assertRaises(TypeError, map)
1252 self.assertRaises(TypeError, map, lambda x: x, 42)
1253 self.assertEqual(map(None, [42]), [42])
1254 class BadSeq:
1255 def __getitem__(self, index):
1256 raise ValueError
1257 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001258 def badfunc(x):
1259 raise RuntimeError
1260 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001261
1262 def test_max(self):
1263 self.assertEqual(max('123123'), '3')
1264 self.assertEqual(max(1, 2, 3), 3)
1265 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1266 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1267
1268 self.assertEqual(max(1, 2L, 3.0), 3.0)
1269 self.assertEqual(max(1L, 2.0, 3), 3)
1270 self.assertEqual(max(1.0, 2, 3L), 3L)
1271
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001272 for stmt in (
1273 "max(key=int)", # no args
1274 "max(1, key=int)", # single arg not iterable
1275 "max(1, 2, keystone=int)", # wrong keyword
1276 "max(1, 2, key=int, abc=int)", # two many keywords
1277 "max(1, 2, key=1)", # keyfunc is not callable
1278 ):
Tim Peters7f061872004-12-07 21:17:46 +00001279 try:
1280 exec(stmt) in globals()
1281 except TypeError:
1282 pass
1283 else:
1284 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001285
1286 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1287 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1288 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1289
1290 data = [random.randrange(200) for i in range(100)]
1291 keys = dict((elem, random.randrange(50)) for elem in data)
1292 f = keys.__getitem__
1293 self.assertEqual(max(data, key=f),
1294 sorted(reversed(data), key=f)[-1])
1295
Walter Dörwald919497e2003-01-19 16:23:59 +00001296 def test_min(self):
1297 self.assertEqual(min('123123'), '1')
1298 self.assertEqual(min(1, 2, 3), 1)
1299 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1300 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1301
1302 self.assertEqual(min(1, 2L, 3.0), 1)
1303 self.assertEqual(min(1L, 2.0, 3), 1L)
1304 self.assertEqual(min(1.0, 2, 3L), 1.0)
1305
1306 self.assertRaises(TypeError, min)
1307 self.assertRaises(TypeError, min, 42)
1308 self.assertRaises(ValueError, min, ())
1309 class BadSeq:
1310 def __getitem__(self, index):
1311 raise ValueError
1312 self.assertRaises(ValueError, min, BadSeq())
1313 class BadNumber:
1314 def __cmp__(self, other):
1315 raise ValueError
1316 self.assertRaises(ValueError, min, (42, BadNumber()))
1317
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001318 for stmt in (
1319 "min(key=int)", # no args
1320 "min(1, key=int)", # single arg not iterable
1321 "min(1, 2, keystone=int)", # wrong keyword
1322 "min(1, 2, key=int, abc=int)", # two many keywords
1323 "min(1, 2, key=1)", # keyfunc is not callable
1324 ):
Tim Peters7f061872004-12-07 21:17:46 +00001325 try:
1326 exec(stmt) in globals()
1327 except TypeError:
1328 pass
1329 else:
1330 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001331
1332 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1333 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1334 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1335
1336 data = [random.randrange(200) for i in range(100)]
1337 keys = dict((elem, random.randrange(50)) for elem in data)
1338 f = keys.__getitem__
1339 self.assertEqual(min(data, key=f),
1340 sorted(data, key=f)[0])
1341
Walter Dörwald919497e2003-01-19 16:23:59 +00001342 def test_oct(self):
1343 self.assertEqual(oct(100), '0144')
1344 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001345 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001346 self.assertEqual(oct(-100L), '-0144L')
1347 self.assertRaises(TypeError, oct, ())
1348
1349 def write_testfile(self):
1350 # NB the first 4 lines are also used to test input and raw_input, below
1351 fp = open(TESTFN, 'w')
1352 try:
1353 fp.write('1+1\n')
1354 fp.write('1+1\n')
1355 fp.write('The quick brown fox jumps over the lazy dog')
1356 fp.write('.\n')
1357 fp.write('Dear John\n')
1358 fp.write('XXX'*100)
1359 fp.write('YYY'*100)
1360 finally:
1361 fp.close()
1362
1363 def test_open(self):
1364 self.write_testfile()
1365 fp = open(TESTFN, 'r')
1366 try:
1367 self.assertEqual(fp.readline(4), '1+1\n')
1368 self.assertEqual(fp.readline(4), '1+1\n')
1369 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1370 self.assertEqual(fp.readline(4), 'Dear')
1371 self.assertEqual(fp.readline(100), ' John\n')
1372 self.assertEqual(fp.read(300), 'XXX'*100)
1373 self.assertEqual(fp.read(1000), 'YYY'*100)
1374 finally:
1375 fp.close()
1376 unlink(TESTFN)
1377
1378 def test_ord(self):
1379 self.assertEqual(ord(' '), 32)
1380 self.assertEqual(ord('A'), 65)
1381 self.assertEqual(ord('a'), 97)
1382 if have_unicode:
1383 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1384 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001385 if have_unicode:
1386 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001387
1388 def test_pow(self):
1389 self.assertEqual(pow(0,0), 1)
1390 self.assertEqual(pow(0,1), 0)
1391 self.assertEqual(pow(1,0), 1)
1392 self.assertEqual(pow(1,1), 1)
1393
1394 self.assertEqual(pow(2,0), 1)
1395 self.assertEqual(pow(2,10), 1024)
1396 self.assertEqual(pow(2,20), 1024*1024)
1397 self.assertEqual(pow(2,30), 1024*1024*1024)
1398
1399 self.assertEqual(pow(-2,0), 1)
1400 self.assertEqual(pow(-2,1), -2)
1401 self.assertEqual(pow(-2,2), 4)
1402 self.assertEqual(pow(-2,3), -8)
1403
1404 self.assertEqual(pow(0L,0), 1)
1405 self.assertEqual(pow(0L,1), 0)
1406 self.assertEqual(pow(1L,0), 1)
1407 self.assertEqual(pow(1L,1), 1)
1408
1409 self.assertEqual(pow(2L,0), 1)
1410 self.assertEqual(pow(2L,10), 1024)
1411 self.assertEqual(pow(2L,20), 1024*1024)
1412 self.assertEqual(pow(2L,30), 1024*1024*1024)
1413
1414 self.assertEqual(pow(-2L,0), 1)
1415 self.assertEqual(pow(-2L,1), -2)
1416 self.assertEqual(pow(-2L,2), 4)
1417 self.assertEqual(pow(-2L,3), -8)
1418
1419 self.assertAlmostEqual(pow(0.,0), 1.)
1420 self.assertAlmostEqual(pow(0.,1), 0.)
1421 self.assertAlmostEqual(pow(1.,0), 1.)
1422 self.assertAlmostEqual(pow(1.,1), 1.)
1423
1424 self.assertAlmostEqual(pow(2.,0), 1.)
1425 self.assertAlmostEqual(pow(2.,10), 1024.)
1426 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1427 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1428
1429 self.assertAlmostEqual(pow(-2.,0), 1.)
1430 self.assertAlmostEqual(pow(-2.,1), -2.)
1431 self.assertAlmostEqual(pow(-2.,2), 4.)
1432 self.assertAlmostEqual(pow(-2.,3), -8.)
1433
1434 for x in 2, 2L, 2.0:
1435 for y in 10, 10L, 10.0:
1436 for z in 1000, 1000L, 1000.0:
1437 if isinstance(x, float) or \
1438 isinstance(y, float) or \
1439 isinstance(z, float):
1440 self.assertRaises(TypeError, pow, x, y, z)
1441 else:
1442 self.assertAlmostEqual(pow(x, y, z), 24.0)
1443
1444 self.assertRaises(TypeError, pow, -1, -2, 3)
1445 self.assertRaises(ValueError, pow, 1, 2, 0)
1446 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1447 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1448 self.assertRaises(ValueError, pow, -342.43, 0.234)
1449
1450 self.assertRaises(TypeError, pow)
1451
1452 def test_range(self):
1453 self.assertEqual(range(3), [0, 1, 2])
1454 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1455 self.assertEqual(range(0), [])
1456 self.assertEqual(range(-3), [])
1457 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1458 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1459
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001460 # Now test range() with longs
1461 self.assertEqual(range(-2**100), [])
1462 self.assertEqual(range(0, -2**100), [])
1463 self.assertEqual(range(0, 2**100, -1), [])
1464 self.assertEqual(range(0, 2**100, -1), [])
1465
1466 a = long(10 * sys.maxint)
1467 b = long(100 * sys.maxint)
1468 c = long(50 * sys.maxint)
1469
1470 self.assertEqual(range(a, a+2), [a, a+1])
1471 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1472 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1473
1474 seq = range(a, b, c)
1475 self.assert_(a in seq)
1476 self.assert_(b not in seq)
1477 self.assertEqual(len(seq), 2)
1478
1479 seq = range(b, a, -c)
1480 self.assert_(b in seq)
1481 self.assert_(a not in seq)
1482 self.assertEqual(len(seq), 2)
1483
1484 seq = range(-a, -b, -c)
1485 self.assert_(-a in seq)
1486 self.assert_(-b not in seq)
1487 self.assertEqual(len(seq), 2)
1488
Walter Dörwald919497e2003-01-19 16:23:59 +00001489 self.assertRaises(TypeError, range)
1490 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1491 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001492 self.assertRaises(ValueError, range, a, a + 1, long(0))
1493
1494 class badzero(int):
1495 def __cmp__(self, other):
1496 raise RuntimeError
1497 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001498
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001499 # Reject floats when it would require PyLongs to represent.
1500 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001501 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001502
Walter Dörwald357981e2003-04-15 18:59:28 +00001503 self.assertRaises(TypeError, range, 0, "spam")
1504 self.assertRaises(TypeError, range, 0, 42, "spam")
1505
1506 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1507 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1508
Walter Dörwald919497e2003-01-19 16:23:59 +00001509 def test_input_and_raw_input(self):
1510 self.write_testfile()
1511 fp = open(TESTFN, 'r')
1512 savestdin = sys.stdin
1513 savestdout = sys.stdout # Eats the echo
1514 try:
1515 sys.stdin = fp
1516 sys.stdout = BitBucket()
1517 self.assertEqual(input(), 2)
1518 self.assertEqual(input('testing\n'), 2)
1519 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1520 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001521
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001522 # SF 1535165: don't segfault on closed stdin
1523 # sys.stdout must be a regular file for triggering
1524 sys.stdout = savestdout
1525 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001526 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001527
1528 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001529 sys.stdin = cStringIO.StringIO("NULL\0")
1530 self.assertRaises(TypeError, input, 42, 42)
1531 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1532 self.assertEqual(input(), 'whitespace')
1533 sys.stdin = cStringIO.StringIO()
1534 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001535
1536 # SF 876178: make sure input() respect future options.
1537 sys.stdin = cStringIO.StringIO('1/2')
1538 sys.stdout = cStringIO.StringIO()
1539 exec compile('print input()', 'test_builtin_tmp', 'exec')
1540 sys.stdin.seek(0, 0)
1541 exec compile('from __future__ import division;print input()',
1542 'test_builtin_tmp', 'exec')
1543 sys.stdin.seek(0, 0)
1544 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001545 # The result we expect depends on whether new division semantics
1546 # are already in effect.
1547 if 1/2 == 0:
1548 # This test was compiled with old semantics.
1549 expected = ['0', '0.5', '0']
1550 else:
1551 # This test was compiled with new semantics (e.g., -Qnew
1552 # was given on the command line.
1553 expected = ['0.5', '0.5', '0.5']
1554 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001555
Walter Dörwald919497e2003-01-19 16:23:59 +00001556 del sys.stdout
1557 self.assertRaises(RuntimeError, input, 'prompt')
1558 del sys.stdin
1559 self.assertRaises(RuntimeError, input, 'prompt')
1560 finally:
1561 sys.stdin = savestdin
1562 sys.stdout = savestdout
1563 fp.close()
1564 unlink(TESTFN)
1565
1566 def test_reduce(self):
1567 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1568 self.assertEqual(
1569 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1570 ['a','c','d','w']
1571 )
1572 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1573 self.assertEqual(
1574 reduce(lambda x, y: x*y, range(2,21), 1L),
1575 2432902008176640000L
1576 )
1577 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1578 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1579 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1580 self.assertRaises(TypeError, reduce)
1581 self.assertRaises(TypeError, reduce, 42, 42)
1582 self.assertRaises(TypeError, reduce, 42, 42, 42)
1583 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1584 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1585 self.assertRaises(TypeError, reduce, 42, (42, 42))
1586
1587 class BadSeq:
1588 def __getitem__(self, index):
1589 raise ValueError
1590 self.assertRaises(ValueError, reduce, 42, BadSeq())
1591
1592 def test_reload(self):
1593 import marshal
1594 reload(marshal)
1595 import string
1596 reload(string)
1597 ## import sys
1598 ## self.assertRaises(ImportError, reload, sys)
1599
1600 def test_repr(self):
1601 self.assertEqual(repr(''), '\'\'')
1602 self.assertEqual(repr(0), '0')
1603 self.assertEqual(repr(0L), '0L')
1604 self.assertEqual(repr(()), '()')
1605 self.assertEqual(repr([]), '[]')
1606 self.assertEqual(repr({}), '{}')
1607 a = []
1608 a.append(a)
1609 self.assertEqual(repr(a), '[[...]]')
1610 a = {}
1611 a[0] = a
1612 self.assertEqual(repr(a), '{0: {...}}')
1613
1614 def test_round(self):
1615 self.assertEqual(round(0.0), 0.0)
1616 self.assertEqual(round(1.0), 1.0)
1617 self.assertEqual(round(10.0), 10.0)
1618 self.assertEqual(round(1000000000.0), 1000000000.0)
1619 self.assertEqual(round(1e20), 1e20)
1620
1621 self.assertEqual(round(-1.0), -1.0)
1622 self.assertEqual(round(-10.0), -10.0)
1623 self.assertEqual(round(-1000000000.0), -1000000000.0)
1624 self.assertEqual(round(-1e20), -1e20)
1625
1626 self.assertEqual(round(0.1), 0.0)
1627 self.assertEqual(round(1.1), 1.0)
1628 self.assertEqual(round(10.1), 10.0)
1629 self.assertEqual(round(1000000000.1), 1000000000.0)
1630
1631 self.assertEqual(round(-1.1), -1.0)
1632 self.assertEqual(round(-10.1), -10.0)
1633 self.assertEqual(round(-1000000000.1), -1000000000.0)
1634
1635 self.assertEqual(round(0.9), 1.0)
1636 self.assertEqual(round(9.9), 10.0)
1637 self.assertEqual(round(999999999.9), 1000000000.0)
1638
1639 self.assertEqual(round(-0.9), -1.0)
1640 self.assertEqual(round(-9.9), -10.0)
1641 self.assertEqual(round(-999999999.9), -1000000000.0)
1642
1643 self.assertEqual(round(-8.0, -1), -10.0)
1644
Georg Brandlccadf842006-03-31 18:54:53 +00001645 # test new kwargs
1646 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1647
Walter Dörwald919497e2003-01-19 16:23:59 +00001648 self.assertRaises(TypeError, round)
1649
1650 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001651 setattr(sys, 'spam', 1)
1652 self.assertEqual(sys.spam, 1)
1653 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1654 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001655
1656 def test_str(self):
1657 self.assertEqual(str(''), '')
1658 self.assertEqual(str(0), '0')
1659 self.assertEqual(str(0L), '0')
1660 self.assertEqual(str(()), '()')
1661 self.assertEqual(str([]), '[]')
1662 self.assertEqual(str({}), '{}')
1663 a = []
1664 a.append(a)
1665 self.assertEqual(str(a), '[[...]]')
1666 a = {}
1667 a[0] = a
1668 self.assertEqual(str(a), '{0: {...}}')
1669
Alex Martellia70b1912003-04-22 08:12:33 +00001670 def test_sum(self):
1671 self.assertEqual(sum([]), 0)
1672 self.assertEqual(sum(range(2,8)), 27)
1673 self.assertEqual(sum(iter(range(2,8))), 27)
1674 self.assertEqual(sum(Squares(10)), 285)
1675 self.assertEqual(sum(iter(Squares(10))), 285)
1676 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1677
1678 self.assertRaises(TypeError, sum)
1679 self.assertRaises(TypeError, sum, 42)
1680 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1681 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1682 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1683 self.assertRaises(TypeError, sum, [{2:3}])
1684 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1685
1686 class BadSeq:
1687 def __getitem__(self, index):
1688 raise ValueError
1689 self.assertRaises(ValueError, sum, BadSeq())
1690
Walter Dörwald919497e2003-01-19 16:23:59 +00001691 def test_tuple(self):
1692 self.assertEqual(tuple(()), ())
1693 t0_3 = (0, 1, 2, 3)
1694 t0_3_bis = tuple(t0_3)
1695 self.assert_(t0_3 is t0_3_bis)
1696 self.assertEqual(tuple([]), ())
1697 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1698 self.assertEqual(tuple(''), ())
1699 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1700
1701 def test_type(self):
1702 self.assertEqual(type(''), type('123'))
1703 self.assertNotEqual(type(''), type(()))
1704
1705 def test_unichr(self):
1706 if have_unicode:
1707 self.assertEqual(unichr(32), unicode(' '))
1708 self.assertEqual(unichr(65), unicode('A'))
1709 self.assertEqual(unichr(97), unicode('a'))
1710 self.assertEqual(
1711 unichr(sys.maxunicode),
1712 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1713 )
1714 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1715 self.assertRaises(TypeError, unichr)
1716
Guido van Rossumfee7b932005-01-16 00:21:28 +00001717 # We don't want self in vars(), so these are static methods
1718
1719 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001720 def get_vars_f0():
1721 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001722
Guido van Rossumfee7b932005-01-16 00:21:28 +00001723 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001724 def get_vars_f2():
1725 BuiltinTest.get_vars_f0()
1726 a = 1
1727 b = 2
1728 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001729
1730 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001731 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001732 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001733 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001734 self.assertEqual(self.get_vars_f0(), {})
1735 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1736 self.assertRaises(TypeError, vars, 42, 42)
1737 self.assertRaises(TypeError, vars, 42)
1738
1739 def test_zip(self):
1740 a = (1, 2, 3)
1741 b = (4, 5, 6)
1742 t = [(1, 4), (2, 5), (3, 6)]
1743 self.assertEqual(zip(a, b), t)
1744 b = [4, 5, 6]
1745 self.assertEqual(zip(a, b), t)
1746 b = (4, 5, 6, 7)
1747 self.assertEqual(zip(a, b), t)
1748 class I:
1749 def __getitem__(self, i):
1750 if i < 0 or i > 2: raise IndexError
1751 return i + 4
1752 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001753 self.assertEqual(zip(), [])
1754 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001755 self.assertRaises(TypeError, zip, None)
1756 class G:
1757 pass
1758 self.assertRaises(TypeError, zip, a, G())
1759
1760 # Make sure zip doesn't try to allocate a billion elements for the
1761 # result list when one of its arguments doesn't say how long it is.
1762 # A MemoryError is the most likely failure mode.
1763 class SequenceWithoutALength:
1764 def __getitem__(self, i):
1765 if i == 5:
1766 raise IndexError
1767 else:
1768 return i
1769 self.assertEqual(
1770 zip(SequenceWithoutALength(), xrange(2**30)),
1771 list(enumerate(range(5)))
1772 )
1773
1774 class BadSeq:
1775 def __getitem__(self, i):
1776 if i == 5:
1777 raise ValueError
1778 else:
1779 return i
1780 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1781
Raymond Hettinger64958a12003-12-17 20:43:33 +00001782class TestSorted(unittest.TestCase):
1783
1784 def test_basic(self):
1785 data = range(100)
1786 copy = data[:]
1787 random.shuffle(copy)
1788 self.assertEqual(data, sorted(copy))
1789 self.assertNotEqual(data, copy)
1790
1791 data.reverse()
1792 random.shuffle(copy)
1793 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1794 self.assertNotEqual(data, copy)
1795 random.shuffle(copy)
1796 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1797 self.assertNotEqual(data, copy)
1798 random.shuffle(copy)
1799 self.assertEqual(data, sorted(copy, reverse=1))
1800 self.assertNotEqual(data, copy)
1801
1802 def test_inputtypes(self):
1803 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001804 types = [list, tuple]
1805 if have_unicode:
1806 types.insert(0, unicode)
1807 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001808 self.assertEqual(sorted(s), sorted(T(s)))
1809
1810 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001811 types = [set, frozenset, list, tuple, dict.fromkeys]
1812 if have_unicode:
1813 types.insert(0, unicode)
1814 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001815 self.assertEqual(sorted(s), sorted(T(s)))
1816
1817 def test_baddecorator(self):
1818 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1819 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1820
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001821def test_main(verbose=None):
1822 test_classes = (BuiltinTest, TestSorted)
1823
1824 run_unittest(*test_classes)
1825
1826 # verify reference counting
1827 if verbose and hasattr(sys, "gettotalrefcount"):
1828 import gc
1829 counts = [None] * 5
1830 for i in xrange(len(counts)):
1831 run_unittest(*test_classes)
1832 gc.collect()
1833 counts[i] = sys.gettotalrefcount()
1834 print counts
1835
Walter Dörwald919497e2003-01-19 16:23:59 +00001836
1837if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001838 test_main(verbose=True)