blob: eb4b3d2a820dbaa9d0bdfb505835e29f59752b00 [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
4from test.test_support import fcmp, have_unicode, TESTFN, unlink
Guido van Rossum3bead091992-01-27 17:00:37 +00005
Walter Dörwald919497e2003-01-19 16:23:59 +00006import sys, warnings, cStringIO
7warnings.filterwarnings("ignore", "hex../oct.. of negative int",
8 FutureWarning, __name__)
Guido van Rossum3bead091992-01-27 17:00:37 +00009
Walter Dörwald919497e2003-01-19 16:23:59 +000010class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Walter Dörwald919497e2003-01-19 16:23:59 +000012 def __init__(self, max):
13 self.max = max
14 self.sofar = []
15
16 def __len__(self): return len(self.sofar)
17
18 def __getitem__(self, i):
19 if not 0 <= i < self.max: raise IndexError
20 n = len(self.sofar)
21 while n <= i:
22 self.sofar.append(n*n)
23 n += 1
24 return self.sofar[i]
25
26class StrSquares:
27
28 def __init__(self, max):
29 self.max = max
30 self.sofar = []
31
32 def __len__(self):
33 return len(self.sofar)
34
35 def __getitem__(self, i):
36 if not 0 <= i < self.max:
37 raise IndexError
38 n = len(self.sofar)
39 while n <= i:
40 self.sofar.append(str(n*n))
41 n += 1
42 return self.sofar[i]
43
44class BitBucket:
45 def write(self, line):
46 pass
47
48L = [
49 ('0', 0),
50 ('1', 1),
51 ('9', 9),
52 ('10', 10),
53 ('99', 99),
54 ('100', 100),
55 ('314', 314),
56 (' 314', 314),
57 ('314 ', 314),
58 (' \t\t 314 \t\t ', 314),
59 (`sys.maxint`, sys.maxint),
60 (' 1x', ValueError),
61 (' 1 ', 1),
62 (' 1\02 ', ValueError),
63 ('', ValueError),
64 (' ', ValueError),
65 (' \t\t ', ValueError)
66]
67if have_unicode:
68 L += [
69 (unicode('0'), 0),
70 (unicode('1'), 1),
71 (unicode('9'), 9),
72 (unicode('10'), 10),
73 (unicode('99'), 99),
74 (unicode('100'), 100),
75 (unicode('314'), 314),
76 (unicode(' 314'), 314),
77 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
78 (unicode(' \t\t 314 \t\t '), 314),
79 (unicode(' 1x'), ValueError),
80 (unicode(' 1 '), 1),
81 (unicode(' 1\02 '), ValueError),
82 (unicode(''), ValueError),
83 (unicode(' '), ValueError),
84 (unicode(' \t\t '), ValueError),
85 (unichr(0x200), ValueError),
86]
87
88class BuiltinTest(unittest.TestCase):
89
90 def test_import(self):
91 __import__('sys')
92 __import__('time')
93 __import__('string')
94 self.assertRaises(ImportError, __import__, 'spamspam')
95 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
96
97 def test_abs(self):
98 # int
99 self.assertEqual(abs(0), 0)
100 self.assertEqual(abs(1234), 1234)
101 self.assertEqual(abs(-1234), 1234)
102 # float
103 self.assertEqual(abs(0.0), 0.0)
104 self.assertEqual(abs(3.14), 3.14)
105 self.assertEqual(abs(-3.14), 3.14)
106 # long
107 self.assertEqual(abs(0L), 0L)
108 self.assertEqual(abs(1234L), 1234L)
109 self.assertEqual(abs(-1234L), 1234L)
110 # str
111 self.assertRaises(TypeError, abs, 'a')
112
113 def test_apply(self):
114 def f0(*args):
115 self.assertEqual(args, ())
116 def f1(a1):
117 self.assertEqual(a1, 1)
118 def f2(a1, a2):
119 self.assertEqual(a1, 1)
120 self.assertEqual(a2, 2)
121 def f3(a1, a2, a3):
122 self.assertEqual(a1, 1)
123 self.assertEqual(a2, 2)
124 self.assertEqual(a3, 3)
125 apply(f0, ())
126 apply(f1, (1,))
127 apply(f2, (1, 2))
128 apply(f3, (1, 2, 3))
129
130 # A PyCFunction that takes only positional parameters should allow an
131 # empty keyword dictionary to pass without a complaint, but raise a
132 # TypeError if the dictionary is non-empty.
133 apply(id, (1,), {})
134 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
135 self.assertRaises(TypeError, apply)
136 self.assertRaises(TypeError, apply, id, 42)
137 self.assertRaises(TypeError, apply, id, (42,), 42)
138
139 def test_callable(self):
140 self.assert_(callable(len))
141 def f(): pass
142 self.assert_(callable(f))
143 class C:
144 def meth(self): pass
145 self.assert_(callable(C))
146 x = C()
147 self.assert_(callable(x.meth))
148 self.assert_(not callable(x))
149 class D(C):
150 def __call__(self): pass
151 y = D()
152 self.assert_(callable(y))
153 y()
154
155 def test_chr(self):
156 self.assertEqual(chr(32), ' ')
157 self.assertEqual(chr(65), 'A')
158 self.assertEqual(chr(97), 'a')
159 self.assertEqual(chr(0xff), '\xff')
160 self.assertRaises(ValueError, chr, 256)
161 self.assertRaises(TypeError, chr)
162
163 def test_cmp(self):
164 self.assertEqual(cmp(-1, 1), -1)
165 self.assertEqual(cmp(1, -1), 1)
166 self.assertEqual(cmp(1, 1), 0)
167 # verify that circular objects are handled
168 a = []; a.append(a)
169 b = []; b.append(b)
170 from UserList import UserList
171 c = UserList(); c.append(c)
172 self.assertEqual(cmp(a, b), 0)
173 self.assertEqual(cmp(b, c), 0)
174 self.assertEqual(cmp(c, a), 0)
175 self.assertEqual(cmp(a, c), 0)
176 # okay, now break the cycles
177 a.pop(); b.pop(); c.pop()
178 self.assertRaises(TypeError, cmp)
179
180 def test_coerce(self):
181 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
182 self.assertEqual(coerce(1, 1L), (1L, 1L))
183 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
184 self.assertRaises(TypeError, coerce)
185 class BadNumber:
186 def __coerce__(self, other):
187 raise ValueError
188 self.assertRaises(ValueError, coerce, 42, BadNumber())
189
190 def test_compile(self):
191 compile('print 1\n', '', 'exec')
192 self.assertRaises(TypeError, compile)
193 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
194 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
195
196 def test_complex(self):
197 class OS:
198 def __complex__(self): return 1+10j
199 class NS(object):
200 def __complex__(self): return 1+10j
201 self.assertEqual(complex(OS()), 1+10j)
202 self.assertEqual(complex(NS()), 1+10j)
203 self.assertEqual(complex("1+10j"), 1+10j)
204 self.assertEqual(complex(10), 10+0j)
205 self.assertEqual(complex(10.0), 10+0j)
206 self.assertEqual(complex(10L), 10+0j)
207 self.assertEqual(complex(10+0j), 10+0j)
208 self.assertEqual(complex(1,10), 1+10j)
209 self.assertEqual(complex(1,10L), 1+10j)
210 self.assertEqual(complex(1,10.0), 1+10j)
211 self.assertEqual(complex(1L,10), 1+10j)
212 self.assertEqual(complex(1L,10L), 1+10j)
213 self.assertEqual(complex(1L,10.0), 1+10j)
214 self.assertEqual(complex(1.0,10), 1+10j)
215 self.assertEqual(complex(1.0,10L), 1+10j)
216 self.assertEqual(complex(1.0,10.0), 1+10j)
217 self.assertEqual(complex(3.14+0j), 3.14+0j)
218 self.assertEqual(complex(3.14), 3.14+0j)
219 self.assertEqual(complex(314), 314.0+0j)
220 self.assertEqual(complex(314L), 314.0+0j)
221 self.assertEqual(complex(3.14+0j, 0j), 3.14+0j)
222 self.assertEqual(complex(3.14, 0.0), 3.14+0j)
223 self.assertEqual(complex(314, 0), 314.0+0j)
224 self.assertEqual(complex(314L, 0L), 314.0+0j)
225 self.assertEqual(complex(0j, 3.14j), -3.14+0j)
226 self.assertEqual(complex(0.0, 3.14j), -3.14+0j)
227 self.assertEqual(complex(0j, 3.14), 3.14j)
228 self.assertEqual(complex(0.0, 3.14), 3.14j)
229 self.assertEqual(complex("1"), 1+0j)
230 self.assertEqual(complex("1j"), 1j)
231
232 c = 3.14 + 1j
233 self.assert_(complex(c) is c)
234 del c
235
236 self.assertRaises(TypeError, complex, "1", "1")
237 self.assertRaises(TypeError, complex, 1, "1")
238
239 self.assertEqual(complex(" 3.14+J "), 3.14+1j)
240 if have_unicode:
241 self.assertEqual(complex(unicode(" 3.14+J ")), 3.14+1j)
242
243 # SF bug 543840: complex(string) accepts strings with \0
244 # Fixed in 2.3.
245 self.assertRaises(ValueError, complex, '1+1j\0j')
246
247 class Z:
248 def __complex__(self): return 3.14j
249 z = Z()
250 self.assertEqual(complex(z), 3.14j)
251
252 def test_delattr(self):
253 import sys
254 sys.spam = 1
255 delattr(sys, 'spam')
256 self.assertRaises(TypeError, delattr)
257
258 def test_dir(self):
259 x = 1
260 self.assert_('x' in dir())
261 import sys
262 self.assert_('modules' in dir(sys))
263 self.assertRaises(TypeError, dir, 42, 42)
264
265 def test_divmod(self):
266 self.assertEqual(divmod(12, 7), (1, 5))
267 self.assertEqual(divmod(-12, 7), (-2, 2))
268 self.assertEqual(divmod(12, -7), (-2, -2))
269 self.assertEqual(divmod(-12, -7), (1, -5))
270
271 self.assertEqual(divmod(12L, 7L), (1L, 5L))
272 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
273 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
274 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
275
276 self.assertEqual(divmod(12, 7L), (1, 5L))
277 self.assertEqual(divmod(-12, 7L), (-2, 2L))
278 self.assertEqual(divmod(12L, -7), (-2L, -2))
279 self.assertEqual(divmod(-12L, -7), (1L, -5))
280
281 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
282 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
283 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
284 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
285
286 self.assertRaises(TypeError, divmod)
287
288 def test_eval(self):
289 self.assertEqual(eval('1+1'), 2)
290 self.assertEqual(eval(' 1+1\n'), 2)
291 globals = {'a': 1, 'b': 2}
292 locals = {'b': 200, 'c': 300}
293 self.assertEqual(eval('a', globals) , 1)
294 self.assertEqual(eval('a', globals, locals), 1)
295 self.assertEqual(eval('b', globals, locals), 200)
296 self.assertEqual(eval('c', globals, locals), 300)
297 if have_unicode:
298 self.assertEqual(eval(unicode('1+1')), 2)
299 self.assertEqual(eval(unicode(' 1+1\n')), 2)
300 globals = {'a': 1, 'b': 2}
301 locals = {'b': 200, 'c': 300}
302 if have_unicode:
303 self.assertEqual(eval(unicode('a'), globals), 1)
304 self.assertEqual(eval(unicode('a'), globals, locals), 1)
305 self.assertEqual(eval(unicode('b'), globals, locals), 200)
306 self.assertEqual(eval(unicode('c'), globals, locals), 300)
307 self.assertRaises(TypeError, eval)
308 self.assertRaises(TypeError, eval, ())
309
310 # Done outside of the method test_z to get the correct scope
311 z = 0
312 f = open(TESTFN, 'w')
313 f.write('z = z+1\n')
314 f.write('z = z*2\n')
315 f.close()
316 execfile(TESTFN)
317
318 def test_execfile(self):
319 globals = {'a': 1, 'b': 2}
320 locals = {'b': 200, 'c': 300}
321
322 self.assertEqual(self.__class__.z, 2)
323 globals['z'] = 0
324 execfile(TESTFN, globals)
325 self.assertEqual(globals['z'], 2)
326 locals['z'] = 0
327 execfile(TESTFN, globals, locals)
328 self.assertEqual(locals['z'], 2)
329 unlink(TESTFN)
330 self.assertRaises(TypeError, execfile)
331 import os
332 self.assertRaises(IOError, execfile, os.curdir)
333 self.assertRaises(IOError, execfile, "I_dont_exist")
334
335 def test_filter(self):
336 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
337 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
338 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
339 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
340 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
341 def identity(item):
342 return 1
343 filter(identity, Squares(5))
344 self.assertRaises(TypeError, filter)
345 class BadSeq(object):
346 def __getitem__(self, index):
347 if index<4:
348 return 42
349 raise ValueError
350 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
351 def badfunc():
352 pass
353 self.assertRaises(TypeError, filter, badfunc, range(5))
354
355 # test biltinmodule.c::filtertuple()
356 self.assertEqual(filter(None, (1, 2)), (1, 2))
357 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
358 self.assertRaises(TypeError, filter, 42, (1, 2))
359
360 # test biltinmodule.c::filterstring()
361 self.assertEqual(filter(None, "12"), "12")
362 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
363 self.assertRaises(TypeError, filter, 42, "12")
364 class badstr(str):
365 def __getitem__(self, index):
366 raise ValueError
367 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000368 if have_unicode:
369 # test biltinmodule.c::filterstring()
370 self.assertEqual(filter(None, unicode("12")), unicode("12"))
371 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
372 self.assertRaises(TypeError, filter, 42, unicode("12"))
373 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000374
375 def test_float(self):
376 self.assertEqual(float(3.14), 3.14)
377 self.assertEqual(float(314), 314.0)
378 self.assertEqual(float(314L), 314.0)
379 self.assertEqual(float(" 3.14 "), 3.14)
380 if have_unicode:
381 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
382 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
383
384 def test_getattr(self):
385 import sys
386 self.assert_(getattr(sys, 'stdout') is sys.stdout)
387 self.assertRaises(TypeError, getattr, sys, 1)
388 self.assertRaises(TypeError, getattr, sys, 1, "foo")
389 self.assertRaises(TypeError, getattr)
390 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
391
392 def test_hasattr(self):
393 import sys
394 self.assert_(hasattr(sys, 'stdout'))
395 self.assertRaises(TypeError, hasattr, sys, 1)
396 self.assertRaises(TypeError, hasattr)
397 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
398
399 def test_hash(self):
400 hash(None)
401 self.assertEqual(hash(1), hash(1L))
402 self.assertEqual(hash(1), hash(1.0))
403 hash('spam')
404 if have_unicode:
405 self.assertEqual(hash('spam'), hash(unicode('spam')))
406 hash((0,1,2,3))
407 def f(): pass
408 self.assertRaises(TypeError, hash, [])
409 self.assertRaises(TypeError, hash, {})
410
411 def test_hex(self):
412 self.assertEqual(hex(16), '0x10')
413 self.assertEqual(hex(16L), '0x10L')
414 self.assertEqual(len(hex(-1)), len(hex(sys.maxint)))
415 self.assert_(hex(-16) in ('0xfffffff0', '0xfffffffffffffff0'))
416 self.assertEqual(hex(-16L), '-0x10L')
417 self.assertRaises(TypeError, hex, {})
418
419 def test_id(self):
420 id(None)
421 id(1)
422 id(1L)
423 id(1.0)
424 id('spam')
425 id((0,1,2,3))
426 id([0,1,2,3])
427 id({'spam': 1, 'eggs': 2, 'ham': 3})
428
429 # Test input() later, together with raw_input
430
431 def test_int(self):
432 self.assertEqual(int(314), 314)
433 self.assertEqual(int(3.14), 3)
434 self.assertEqual(int(314L), 314)
435 # Check that conversion from float truncates towards zero
436 self.assertEqual(int(-3.14), -3)
437 self.assertEqual(int(3.9), 3)
438 self.assertEqual(int(-3.9), -3)
439 self.assertEqual(int(3.5), 3)
440 self.assertEqual(int(-3.5), -3)
441 # Different base:
442 self.assertEqual(int("10",16), 16L)
443 if have_unicode:
444 self.assertEqual(int(unicode("10"),16), 16L)
445 # Test conversion from strings and various anomalies
446 for s, v in L:
447 for sign in "", "+", "-":
448 for prefix in "", " ", "\t", " \t\t ":
449 ss = prefix + sign + s
450 vv = v
451 if sign == "-" and v is not ValueError:
452 vv = -v
453 try:
454 self.assertEqual(int(ss), vv)
455 except v:
456 pass
457
458 s = `-1-sys.maxint`
459 self.assertEqual(int(s)+1, -sys.maxint)
460 # should return long
461 int(s[1:])
462
463 # should return long
464 x = int(1e100)
465 self.assert_(isinstance(x, long))
466 x = int(-1e100)
467 self.assert_(isinstance(x, long))
468
469
470 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
471 # Worked by accident in Windows release build, but failed in debug build.
472 # Failed in all Linux builds.
473 x = -1-sys.maxint
474 self.assertEqual(x >> 1, x//2)
475
476 self.assertRaises(ValueError, int, '123\0')
477 self.assertRaises(ValueError, int, '53', 40)
478
479 x = int('1' * 600)
480 self.assert_(isinstance(x, long))
481
482 if have_unicode:
483 x = int(unichr(0x661) * 600)
484 self.assert_(isinstance(x, long))
485
486 self.assertRaises(TypeError, int, 1, 12)
487
488 self.assertEqual(int('0123', 0), 83)
489
490 def test_intern(self):
491 self.assertRaises(TypeError, intern)
492 s = "never interned before"
493 self.assert_(intern(s) is s)
494 s2 = s.swapcase().swapcase()
495 self.assert_(intern(s2) is s)
496
497 def test_iter(self):
498 self.assertRaises(TypeError, iter)
499 self.assertRaises(TypeError, iter, 42, 42)
500 lists = [("1", "2"), ["1", "2"], "12"]
501 if have_unicode:
502 lists.append(unicode("12"))
503 for l in lists:
504 i = iter(l)
505 self.assertEqual(i.next(), '1')
506 self.assertEqual(i.next(), '2')
507 self.assertRaises(StopIteration, i.next)
508
509 def test_isinstance(self):
510 class C:
511 pass
512 class D(C):
513 pass
514 class E:
515 pass
516 c = C()
517 d = D()
518 e = E()
519 self.assert_(isinstance(c, C))
520 self.assert_(isinstance(d, C))
521 self.assert_(not isinstance(e, C))
522 self.assert_(not isinstance(c, D))
523 self.assert_(not isinstance('foo', E))
524 self.assertRaises(TypeError, isinstance, E, 'foo')
525 self.assertRaises(TypeError, isinstance)
526
527 def test_issubclass(self):
528 class C:
529 pass
530 class D(C):
531 pass
532 class E:
533 pass
534 c = C()
535 d = D()
536 e = E()
537 self.assert_(issubclass(D, C))
538 self.assert_(issubclass(C, C))
539 self.assert_(not issubclass(C, D))
540 self.assertRaises(TypeError, issubclass, 'foo', E)
541 self.assertRaises(TypeError, issubclass, E, 'foo')
542 self.assertRaises(TypeError, issubclass)
543
544 def test_len(self):
545 self.assertEqual(len('123'), 3)
546 self.assertEqual(len(()), 0)
547 self.assertEqual(len((1, 2, 3, 4)), 4)
548 self.assertEqual(len([1, 2, 3, 4]), 4)
549 self.assertEqual(len({}), 0)
550 self.assertEqual(len({'a':1, 'b': 2}), 2)
551 class BadSeq:
552 def __len__(self):
553 raise ValueError
554 self.assertRaises(ValueError, len, BadSeq())
555
556 def test_list(self):
557 self.assertEqual(list([]), [])
558 l0_3 = [0, 1, 2, 3]
559 l0_3_bis = list(l0_3)
560 self.assertEqual(l0_3, l0_3_bis)
561 self.assert_(l0_3 is not l0_3_bis)
562 self.assertEqual(list(()), [])
563 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
564 self.assertEqual(list(''), [])
565 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
566
567 if sys.maxint == 0x7fffffff:
568 # This test can currently only work on 32-bit machines.
569 # XXX If/when PySequence_Length() returns a ssize_t, it should be
570 # XXX re-enabled.
571 # Verify clearing of bug #556025.
572 # This assumes that the max data size (sys.maxint) == max
573 # address size this also assumes that the address size is at
574 # least 4 bytes with 8 byte addresses, the bug is not well
575 # tested
576 #
577 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
578 # earlier due to a newlib bug. See the following mailing list
579 # thread for the details:
580
581 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
582 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
583
584 def test_long(self):
585 self.assertEqual(long(314), 314L)
586 self.assertEqual(long(3.14), 3L)
587 self.assertEqual(long(314L), 314L)
588 # Check that conversion from float truncates towards zero
589 self.assertEqual(long(-3.14), -3L)
590 self.assertEqual(long(3.9), 3L)
591 self.assertEqual(long(-3.9), -3L)
592 self.assertEqual(long(3.5), 3L)
593 self.assertEqual(long(-3.5), -3L)
594 self.assertEqual(long("-3"), -3L)
595 if have_unicode:
596 self.assertEqual(long(unicode("-3")), -3L)
597 # Different base:
598 self.assertEqual(long("10",16), 16L)
599 if have_unicode:
600 self.assertEqual(long(unicode("10"),16), 16L)
601 # Check conversions from string (same test set as for int(), and then some)
602 LL = [
603 ('1' + '0'*20, 10L**20),
604 ('1' + '0'*100, 10L**100)
605 ]
606 L2 = L
607 if have_unicode:
608 L2 += [
609 (unicode('1') + unicode('0')*20, 10L**20),
610 (unicode('1') + unicode('0')*100, 10L**100),
611 ]
612 for s, v in L2 + LL:
613 for sign in "", "+", "-":
614 for prefix in "", " ", "\t", " \t\t ":
615 ss = prefix + sign + s
616 vv = v
617 if sign == "-" and v is not ValueError:
618 vv = -v
619 try:
620 self.assertEqual(long(ss), long(vv))
621 except v:
622 pass
623
624 self.assertRaises(ValueError, long, '123\0')
625 self.assertRaises(ValueError, long, '53', 40)
626 self.assertRaises(TypeError, long, 1, 12)
627
628 def test_map(self):
629 self.assertEqual(
630 map(None, 'hello world'),
631 ['h','e','l','l','o',' ','w','o','r','l','d']
632 )
633 self.assertEqual(
634 map(None, 'abcd', 'efg'),
635 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
636 )
637 self.assertEqual(
638 map(None, range(10)),
639 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
640 )
641 self.assertEqual(
642 map(lambda x: x*x, range(1,4)),
643 [1, 4, 9]
644 )
645 try:
646 from math import sqrt
647 except ImportError:
648 def sqrt(x):
649 return pow(x, 0.5)
650 self.assertEqual(
651 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
652 [[4.0, 2.0], [9.0, 3.0]]
653 )
654 self.assertEqual(
655 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
656 [10, 4, 6]
657 )
658
659 def plus(*v):
660 accu = 0
661 for i in v: accu = accu + i
662 return accu
663 self.assertEqual(
664 map(plus, [1, 3, 7]),
665 [1, 3, 7]
666 )
667 self.assertEqual(
668 map(plus, [1, 3, 7], [4, 9, 2]),
669 [1+4, 3+9, 7+2]
670 )
671 self.assertEqual(
672 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
673 [1+4+1, 3+9+1, 7+2+0]
674 )
675 self.assertEqual(
676 map(None, Squares(10)),
677 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
678 )
679 self.assertEqual(
680 map(int, Squares(10)),
681 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
682 )
683 self.assertEqual(
684 map(None, Squares(3), Squares(2)),
685 [(0,0), (1,1), (4,None)]
686 )
687 self.assertEqual(
688 map(max, Squares(3), Squares(2)),
689 [0, 1, 4]
690 )
691 self.assertRaises(TypeError, map)
692 self.assertRaises(TypeError, map, lambda x: x, 42)
693 self.assertEqual(map(None, [42]), [42])
694 class BadSeq:
695 def __getitem__(self, index):
696 raise ValueError
697 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
698
699 def test_max(self):
700 self.assertEqual(max('123123'), '3')
701 self.assertEqual(max(1, 2, 3), 3)
702 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
703 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
704
705 self.assertEqual(max(1, 2L, 3.0), 3.0)
706 self.assertEqual(max(1L, 2.0, 3), 3)
707 self.assertEqual(max(1.0, 2, 3L), 3L)
708
709 def test_min(self):
710 self.assertEqual(min('123123'), '1')
711 self.assertEqual(min(1, 2, 3), 1)
712 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
713 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
714
715 self.assertEqual(min(1, 2L, 3.0), 1)
716 self.assertEqual(min(1L, 2.0, 3), 1L)
717 self.assertEqual(min(1.0, 2, 3L), 1.0)
718
719 self.assertRaises(TypeError, min)
720 self.assertRaises(TypeError, min, 42)
721 self.assertRaises(ValueError, min, ())
722 class BadSeq:
723 def __getitem__(self, index):
724 raise ValueError
725 self.assertRaises(ValueError, min, BadSeq())
726 class BadNumber:
727 def __cmp__(self, other):
728 raise ValueError
729 self.assertRaises(ValueError, min, (42, BadNumber()))
730
731 def test_oct(self):
732 self.assertEqual(oct(100), '0144')
733 self.assertEqual(oct(100L), '0144L')
734 self.assert_(oct(-100) in ('037777777634', '01777777777777777777634'))
735 self.assertEqual(oct(-100L), '-0144L')
736 self.assertRaises(TypeError, oct, ())
737
738 def write_testfile(self):
739 # NB the first 4 lines are also used to test input and raw_input, below
740 fp = open(TESTFN, 'w')
741 try:
742 fp.write('1+1\n')
743 fp.write('1+1\n')
744 fp.write('The quick brown fox jumps over the lazy dog')
745 fp.write('.\n')
746 fp.write('Dear John\n')
747 fp.write('XXX'*100)
748 fp.write('YYY'*100)
749 finally:
750 fp.close()
751
752 def test_open(self):
753 self.write_testfile()
754 fp = open(TESTFN, 'r')
755 try:
756 self.assertEqual(fp.readline(4), '1+1\n')
757 self.assertEqual(fp.readline(4), '1+1\n')
758 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
759 self.assertEqual(fp.readline(4), 'Dear')
760 self.assertEqual(fp.readline(100), ' John\n')
761 self.assertEqual(fp.read(300), 'XXX'*100)
762 self.assertEqual(fp.read(1000), 'YYY'*100)
763 finally:
764 fp.close()
765 unlink(TESTFN)
766
767 def test_ord(self):
768 self.assertEqual(ord(' '), 32)
769 self.assertEqual(ord('A'), 65)
770 self.assertEqual(ord('a'), 97)
771 if have_unicode:
772 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
773 self.assertRaises(TypeError, ord, 42)
774 self.assertRaises(TypeError, ord, unicode("12"))
775
776 def test_pow(self):
777 self.assertEqual(pow(0,0), 1)
778 self.assertEqual(pow(0,1), 0)
779 self.assertEqual(pow(1,0), 1)
780 self.assertEqual(pow(1,1), 1)
781
782 self.assertEqual(pow(2,0), 1)
783 self.assertEqual(pow(2,10), 1024)
784 self.assertEqual(pow(2,20), 1024*1024)
785 self.assertEqual(pow(2,30), 1024*1024*1024)
786
787 self.assertEqual(pow(-2,0), 1)
788 self.assertEqual(pow(-2,1), -2)
789 self.assertEqual(pow(-2,2), 4)
790 self.assertEqual(pow(-2,3), -8)
791
792 self.assertEqual(pow(0L,0), 1)
793 self.assertEqual(pow(0L,1), 0)
794 self.assertEqual(pow(1L,0), 1)
795 self.assertEqual(pow(1L,1), 1)
796
797 self.assertEqual(pow(2L,0), 1)
798 self.assertEqual(pow(2L,10), 1024)
799 self.assertEqual(pow(2L,20), 1024*1024)
800 self.assertEqual(pow(2L,30), 1024*1024*1024)
801
802 self.assertEqual(pow(-2L,0), 1)
803 self.assertEqual(pow(-2L,1), -2)
804 self.assertEqual(pow(-2L,2), 4)
805 self.assertEqual(pow(-2L,3), -8)
806
807 self.assertAlmostEqual(pow(0.,0), 1.)
808 self.assertAlmostEqual(pow(0.,1), 0.)
809 self.assertAlmostEqual(pow(1.,0), 1.)
810 self.assertAlmostEqual(pow(1.,1), 1.)
811
812 self.assertAlmostEqual(pow(2.,0), 1.)
813 self.assertAlmostEqual(pow(2.,10), 1024.)
814 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
815 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
816
817 self.assertAlmostEqual(pow(-2.,0), 1.)
818 self.assertAlmostEqual(pow(-2.,1), -2.)
819 self.assertAlmostEqual(pow(-2.,2), 4.)
820 self.assertAlmostEqual(pow(-2.,3), -8.)
821
822 for x in 2, 2L, 2.0:
823 for y in 10, 10L, 10.0:
824 for z in 1000, 1000L, 1000.0:
825 if isinstance(x, float) or \
826 isinstance(y, float) or \
827 isinstance(z, float):
828 self.assertRaises(TypeError, pow, x, y, z)
829 else:
830 self.assertAlmostEqual(pow(x, y, z), 24.0)
831
832 self.assertRaises(TypeError, pow, -1, -2, 3)
833 self.assertRaises(ValueError, pow, 1, 2, 0)
834 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
835 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
836 self.assertRaises(ValueError, pow, -342.43, 0.234)
837
838 self.assertRaises(TypeError, pow)
839
840 def test_range(self):
841 self.assertEqual(range(3), [0, 1, 2])
842 self.assertEqual(range(1, 5), [1, 2, 3, 4])
843 self.assertEqual(range(0), [])
844 self.assertEqual(range(-3), [])
845 self.assertEqual(range(1, 10, 3), [1, 4, 7])
846 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
847
848 self.assertRaises(TypeError, range)
849 self.assertRaises(TypeError, range, 1, 2, 3, 4)
850 self.assertRaises(ValueError, range, 1, 2, 0)
851
852 def test_input_and_raw_input(self):
853 self.write_testfile()
854 fp = open(TESTFN, 'r')
855 savestdin = sys.stdin
856 savestdout = sys.stdout # Eats the echo
857 try:
858 sys.stdin = fp
859 sys.stdout = BitBucket()
860 self.assertEqual(input(), 2)
861 self.assertEqual(input('testing\n'), 2)
862 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
863 self.assertEqual(raw_input('testing\n'), 'Dear John')
864 sys.stdin = cStringIO.StringIO("NULL\0")
865 self.assertRaises(TypeError, input, 42, 42)
866 sys.stdin = cStringIO.StringIO(" 'whitespace'")
867 self.assertEqual(input(), 'whitespace')
868 sys.stdin = cStringIO.StringIO()
869 self.assertRaises(EOFError, input)
870 del sys.stdout
871 self.assertRaises(RuntimeError, input, 'prompt')
872 del sys.stdin
873 self.assertRaises(RuntimeError, input, 'prompt')
874 finally:
875 sys.stdin = savestdin
876 sys.stdout = savestdout
877 fp.close()
878 unlink(TESTFN)
879
880 def test_reduce(self):
881 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
882 self.assertEqual(
883 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
884 ['a','c','d','w']
885 )
886 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
887 self.assertEqual(
888 reduce(lambda x, y: x*y, range(2,21), 1L),
889 2432902008176640000L
890 )
891 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
892 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
893 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
894 self.assertRaises(TypeError, reduce)
895 self.assertRaises(TypeError, reduce, 42, 42)
896 self.assertRaises(TypeError, reduce, 42, 42, 42)
897 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
898 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
899 self.assertRaises(TypeError, reduce, 42, (42, 42))
900
901 class BadSeq:
902 def __getitem__(self, index):
903 raise ValueError
904 self.assertRaises(ValueError, reduce, 42, BadSeq())
905
906 def test_reload(self):
907 import marshal
908 reload(marshal)
909 import string
910 reload(string)
911 ## import sys
912 ## self.assertRaises(ImportError, reload, sys)
913
914 def test_repr(self):
915 self.assertEqual(repr(''), '\'\'')
916 self.assertEqual(repr(0), '0')
917 self.assertEqual(repr(0L), '0L')
918 self.assertEqual(repr(()), '()')
919 self.assertEqual(repr([]), '[]')
920 self.assertEqual(repr({}), '{}')
921 a = []
922 a.append(a)
923 self.assertEqual(repr(a), '[[...]]')
924 a = {}
925 a[0] = a
926 self.assertEqual(repr(a), '{0: {...}}')
927
928 def test_round(self):
929 self.assertEqual(round(0.0), 0.0)
930 self.assertEqual(round(1.0), 1.0)
931 self.assertEqual(round(10.0), 10.0)
932 self.assertEqual(round(1000000000.0), 1000000000.0)
933 self.assertEqual(round(1e20), 1e20)
934
935 self.assertEqual(round(-1.0), -1.0)
936 self.assertEqual(round(-10.0), -10.0)
937 self.assertEqual(round(-1000000000.0), -1000000000.0)
938 self.assertEqual(round(-1e20), -1e20)
939
940 self.assertEqual(round(0.1), 0.0)
941 self.assertEqual(round(1.1), 1.0)
942 self.assertEqual(round(10.1), 10.0)
943 self.assertEqual(round(1000000000.1), 1000000000.0)
944
945 self.assertEqual(round(-1.1), -1.0)
946 self.assertEqual(round(-10.1), -10.0)
947 self.assertEqual(round(-1000000000.1), -1000000000.0)
948
949 self.assertEqual(round(0.9), 1.0)
950 self.assertEqual(round(9.9), 10.0)
951 self.assertEqual(round(999999999.9), 1000000000.0)
952
953 self.assertEqual(round(-0.9), -1.0)
954 self.assertEqual(round(-9.9), -10.0)
955 self.assertEqual(round(-999999999.9), -1000000000.0)
956
957 self.assertEqual(round(-8.0, -1), -10.0)
958
959 self.assertRaises(TypeError, round)
960
961 def test_setattr(self):
962 setattr(sys, 'spam', 1)
963 self.assertEqual(sys.spam, 1)
964 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
965 self.assertRaises(TypeError, setattr)
966
967 def test_str(self):
968 self.assertEqual(str(''), '')
969 self.assertEqual(str(0), '0')
970 self.assertEqual(str(0L), '0')
971 self.assertEqual(str(()), '()')
972 self.assertEqual(str([]), '[]')
973 self.assertEqual(str({}), '{}')
974 a = []
975 a.append(a)
976 self.assertEqual(str(a), '[[...]]')
977 a = {}
978 a[0] = a
979 self.assertEqual(str(a), '{0: {...}}')
980
981 def test_tuple(self):
982 self.assertEqual(tuple(()), ())
983 t0_3 = (0, 1, 2, 3)
984 t0_3_bis = tuple(t0_3)
985 self.assert_(t0_3 is t0_3_bis)
986 self.assertEqual(tuple([]), ())
987 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
988 self.assertEqual(tuple(''), ())
989 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
990
991 def test_type(self):
992 self.assertEqual(type(''), type('123'))
993 self.assertNotEqual(type(''), type(()))
994
995 def test_unichr(self):
996 if have_unicode:
997 self.assertEqual(unichr(32), unicode(' '))
998 self.assertEqual(unichr(65), unicode('A'))
999 self.assertEqual(unichr(97), unicode('a'))
1000 self.assertEqual(
1001 unichr(sys.maxunicode),
1002 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1003 )
1004 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1005 self.assertRaises(TypeError, unichr)
1006
1007 def get_vars_f0():
1008 return vars()
1009 # we don't want self in vars(), so use staticmethod
1010 get_vars_f0 = staticmethod(get_vars_f0)
1011
1012 def get_vars_f2():
1013 BuiltinTest.get_vars_f0()
1014 a = 1
1015 b = 2
1016 return vars()
1017 get_vars_f2 = staticmethod(get_vars_f2)
1018
1019 def test_vars(self):
1020 a = b = None
1021 a = vars().keys()
1022 b = dir()
1023 a.sort()
1024 b.sort()
1025 self.assertEqual(a, b)
1026 import sys
1027 a = vars(sys).keys()
1028 b = dir(sys)
1029 a.sort()
1030 b.sort()
1031 self.assertEqual(a, b)
1032 self.assertEqual(self.get_vars_f0(), {})
1033 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1034 self.assertRaises(TypeError, vars, 42, 42)
1035 self.assertRaises(TypeError, vars, 42)
1036
1037 def test_zip(self):
1038 a = (1, 2, 3)
1039 b = (4, 5, 6)
1040 t = [(1, 4), (2, 5), (3, 6)]
1041 self.assertEqual(zip(a, b), t)
1042 b = [4, 5, 6]
1043 self.assertEqual(zip(a, b), t)
1044 b = (4, 5, 6, 7)
1045 self.assertEqual(zip(a, b), t)
1046 class I:
1047 def __getitem__(self, i):
1048 if i < 0 or i > 2: raise IndexError
1049 return i + 4
1050 self.assertEqual(zip(a, I()), t)
1051 self.assertRaises(TypeError, zip)
1052 self.assertRaises(TypeError, zip, None)
1053 class G:
1054 pass
1055 self.assertRaises(TypeError, zip, a, G())
1056
1057 # Make sure zip doesn't try to allocate a billion elements for the
1058 # result list when one of its arguments doesn't say how long it is.
1059 # A MemoryError is the most likely failure mode.
1060 class SequenceWithoutALength:
1061 def __getitem__(self, i):
1062 if i == 5:
1063 raise IndexError
1064 else:
1065 return i
1066 self.assertEqual(
1067 zip(SequenceWithoutALength(), xrange(2**30)),
1068 list(enumerate(range(5)))
1069 )
1070
1071 class BadSeq:
1072 def __getitem__(self, i):
1073 if i == 5:
1074 raise ValueError
1075 else:
1076 return i
1077 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1078
1079def test_main():
1080 suite = unittest.TestSuite()
1081 suite.addTest(unittest.makeSuite(BuiltinTest))
1082 test.test_support.run_suite(suite)
1083
1084if __name__ == "__main__":
1085 test_main()