blob: 60358a45f19d93101c542d239c38a0fe72a4c179 [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"))
368
369 def test_float(self):
370 self.assertEqual(float(3.14), 3.14)
371 self.assertEqual(float(314), 314.0)
372 self.assertEqual(float(314L), 314.0)
373 self.assertEqual(float(" 3.14 "), 3.14)
374 if have_unicode:
375 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
376 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
377
378 def test_getattr(self):
379 import sys
380 self.assert_(getattr(sys, 'stdout') is sys.stdout)
381 self.assertRaises(TypeError, getattr, sys, 1)
382 self.assertRaises(TypeError, getattr, sys, 1, "foo")
383 self.assertRaises(TypeError, getattr)
384 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
385
386 def test_hasattr(self):
387 import sys
388 self.assert_(hasattr(sys, 'stdout'))
389 self.assertRaises(TypeError, hasattr, sys, 1)
390 self.assertRaises(TypeError, hasattr)
391 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
392
393 def test_hash(self):
394 hash(None)
395 self.assertEqual(hash(1), hash(1L))
396 self.assertEqual(hash(1), hash(1.0))
397 hash('spam')
398 if have_unicode:
399 self.assertEqual(hash('spam'), hash(unicode('spam')))
400 hash((0,1,2,3))
401 def f(): pass
402 self.assertRaises(TypeError, hash, [])
403 self.assertRaises(TypeError, hash, {})
404
405 def test_hex(self):
406 self.assertEqual(hex(16), '0x10')
407 self.assertEqual(hex(16L), '0x10L')
408 self.assertEqual(len(hex(-1)), len(hex(sys.maxint)))
409 self.assert_(hex(-16) in ('0xfffffff0', '0xfffffffffffffff0'))
410 self.assertEqual(hex(-16L), '-0x10L')
411 self.assertRaises(TypeError, hex, {})
412
413 def test_id(self):
414 id(None)
415 id(1)
416 id(1L)
417 id(1.0)
418 id('spam')
419 id((0,1,2,3))
420 id([0,1,2,3])
421 id({'spam': 1, 'eggs': 2, 'ham': 3})
422
423 # Test input() later, together with raw_input
424
425 def test_int(self):
426 self.assertEqual(int(314), 314)
427 self.assertEqual(int(3.14), 3)
428 self.assertEqual(int(314L), 314)
429 # Check that conversion from float truncates towards zero
430 self.assertEqual(int(-3.14), -3)
431 self.assertEqual(int(3.9), 3)
432 self.assertEqual(int(-3.9), -3)
433 self.assertEqual(int(3.5), 3)
434 self.assertEqual(int(-3.5), -3)
435 # Different base:
436 self.assertEqual(int("10",16), 16L)
437 if have_unicode:
438 self.assertEqual(int(unicode("10"),16), 16L)
439 # Test conversion from strings and various anomalies
440 for s, v in L:
441 for sign in "", "+", "-":
442 for prefix in "", " ", "\t", " \t\t ":
443 ss = prefix + sign + s
444 vv = v
445 if sign == "-" and v is not ValueError:
446 vv = -v
447 try:
448 self.assertEqual(int(ss), vv)
449 except v:
450 pass
451
452 s = `-1-sys.maxint`
453 self.assertEqual(int(s)+1, -sys.maxint)
454 # should return long
455 int(s[1:])
456
457 # should return long
458 x = int(1e100)
459 self.assert_(isinstance(x, long))
460 x = int(-1e100)
461 self.assert_(isinstance(x, long))
462
463
464 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
465 # Worked by accident in Windows release build, but failed in debug build.
466 # Failed in all Linux builds.
467 x = -1-sys.maxint
468 self.assertEqual(x >> 1, x//2)
469
470 self.assertRaises(ValueError, int, '123\0')
471 self.assertRaises(ValueError, int, '53', 40)
472
473 x = int('1' * 600)
474 self.assert_(isinstance(x, long))
475
476 if have_unicode:
477 x = int(unichr(0x661) * 600)
478 self.assert_(isinstance(x, long))
479
480 self.assertRaises(TypeError, int, 1, 12)
481
482 self.assertEqual(int('0123', 0), 83)
483
484 def test_intern(self):
485 self.assertRaises(TypeError, intern)
486 s = "never interned before"
487 self.assert_(intern(s) is s)
488 s2 = s.swapcase().swapcase()
489 self.assert_(intern(s2) is s)
490
491 def test_iter(self):
492 self.assertRaises(TypeError, iter)
493 self.assertRaises(TypeError, iter, 42, 42)
494 lists = [("1", "2"), ["1", "2"], "12"]
495 if have_unicode:
496 lists.append(unicode("12"))
497 for l in lists:
498 i = iter(l)
499 self.assertEqual(i.next(), '1')
500 self.assertEqual(i.next(), '2')
501 self.assertRaises(StopIteration, i.next)
502
503 def test_isinstance(self):
504 class C:
505 pass
506 class D(C):
507 pass
508 class E:
509 pass
510 c = C()
511 d = D()
512 e = E()
513 self.assert_(isinstance(c, C))
514 self.assert_(isinstance(d, C))
515 self.assert_(not isinstance(e, C))
516 self.assert_(not isinstance(c, D))
517 self.assert_(not isinstance('foo', E))
518 self.assertRaises(TypeError, isinstance, E, 'foo')
519 self.assertRaises(TypeError, isinstance)
520
521 def test_issubclass(self):
522 class C:
523 pass
524 class D(C):
525 pass
526 class E:
527 pass
528 c = C()
529 d = D()
530 e = E()
531 self.assert_(issubclass(D, C))
532 self.assert_(issubclass(C, C))
533 self.assert_(not issubclass(C, D))
534 self.assertRaises(TypeError, issubclass, 'foo', E)
535 self.assertRaises(TypeError, issubclass, E, 'foo')
536 self.assertRaises(TypeError, issubclass)
537
538 def test_len(self):
539 self.assertEqual(len('123'), 3)
540 self.assertEqual(len(()), 0)
541 self.assertEqual(len((1, 2, 3, 4)), 4)
542 self.assertEqual(len([1, 2, 3, 4]), 4)
543 self.assertEqual(len({}), 0)
544 self.assertEqual(len({'a':1, 'b': 2}), 2)
545 class BadSeq:
546 def __len__(self):
547 raise ValueError
548 self.assertRaises(ValueError, len, BadSeq())
549
550 def test_list(self):
551 self.assertEqual(list([]), [])
552 l0_3 = [0, 1, 2, 3]
553 l0_3_bis = list(l0_3)
554 self.assertEqual(l0_3, l0_3_bis)
555 self.assert_(l0_3 is not l0_3_bis)
556 self.assertEqual(list(()), [])
557 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
558 self.assertEqual(list(''), [])
559 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
560
561 if sys.maxint == 0x7fffffff:
562 # This test can currently only work on 32-bit machines.
563 # XXX If/when PySequence_Length() returns a ssize_t, it should be
564 # XXX re-enabled.
565 # Verify clearing of bug #556025.
566 # This assumes that the max data size (sys.maxint) == max
567 # address size this also assumes that the address size is at
568 # least 4 bytes with 8 byte addresses, the bug is not well
569 # tested
570 #
571 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
572 # earlier due to a newlib bug. See the following mailing list
573 # thread for the details:
574
575 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
576 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
577
578 def test_long(self):
579 self.assertEqual(long(314), 314L)
580 self.assertEqual(long(3.14), 3L)
581 self.assertEqual(long(314L), 314L)
582 # Check that conversion from float truncates towards zero
583 self.assertEqual(long(-3.14), -3L)
584 self.assertEqual(long(3.9), 3L)
585 self.assertEqual(long(-3.9), -3L)
586 self.assertEqual(long(3.5), 3L)
587 self.assertEqual(long(-3.5), -3L)
588 self.assertEqual(long("-3"), -3L)
589 if have_unicode:
590 self.assertEqual(long(unicode("-3")), -3L)
591 # Different base:
592 self.assertEqual(long("10",16), 16L)
593 if have_unicode:
594 self.assertEqual(long(unicode("10"),16), 16L)
595 # Check conversions from string (same test set as for int(), and then some)
596 LL = [
597 ('1' + '0'*20, 10L**20),
598 ('1' + '0'*100, 10L**100)
599 ]
600 L2 = L
601 if have_unicode:
602 L2 += [
603 (unicode('1') + unicode('0')*20, 10L**20),
604 (unicode('1') + unicode('0')*100, 10L**100),
605 ]
606 for s, v in L2 + LL:
607 for sign in "", "+", "-":
608 for prefix in "", " ", "\t", " \t\t ":
609 ss = prefix + sign + s
610 vv = v
611 if sign == "-" and v is not ValueError:
612 vv = -v
613 try:
614 self.assertEqual(long(ss), long(vv))
615 except v:
616 pass
617
618 self.assertRaises(ValueError, long, '123\0')
619 self.assertRaises(ValueError, long, '53', 40)
620 self.assertRaises(TypeError, long, 1, 12)
621
622 def test_map(self):
623 self.assertEqual(
624 map(None, 'hello world'),
625 ['h','e','l','l','o',' ','w','o','r','l','d']
626 )
627 self.assertEqual(
628 map(None, 'abcd', 'efg'),
629 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
630 )
631 self.assertEqual(
632 map(None, range(10)),
633 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
634 )
635 self.assertEqual(
636 map(lambda x: x*x, range(1,4)),
637 [1, 4, 9]
638 )
639 try:
640 from math import sqrt
641 except ImportError:
642 def sqrt(x):
643 return pow(x, 0.5)
644 self.assertEqual(
645 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
646 [[4.0, 2.0], [9.0, 3.0]]
647 )
648 self.assertEqual(
649 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
650 [10, 4, 6]
651 )
652
653 def plus(*v):
654 accu = 0
655 for i in v: accu = accu + i
656 return accu
657 self.assertEqual(
658 map(plus, [1, 3, 7]),
659 [1, 3, 7]
660 )
661 self.assertEqual(
662 map(plus, [1, 3, 7], [4, 9, 2]),
663 [1+4, 3+9, 7+2]
664 )
665 self.assertEqual(
666 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
667 [1+4+1, 3+9+1, 7+2+0]
668 )
669 self.assertEqual(
670 map(None, Squares(10)),
671 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
672 )
673 self.assertEqual(
674 map(int, Squares(10)),
675 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
676 )
677 self.assertEqual(
678 map(None, Squares(3), Squares(2)),
679 [(0,0), (1,1), (4,None)]
680 )
681 self.assertEqual(
682 map(max, Squares(3), Squares(2)),
683 [0, 1, 4]
684 )
685 self.assertRaises(TypeError, map)
686 self.assertRaises(TypeError, map, lambda x: x, 42)
687 self.assertEqual(map(None, [42]), [42])
688 class BadSeq:
689 def __getitem__(self, index):
690 raise ValueError
691 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
692
693 def test_max(self):
694 self.assertEqual(max('123123'), '3')
695 self.assertEqual(max(1, 2, 3), 3)
696 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
697 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
698
699 self.assertEqual(max(1, 2L, 3.0), 3.0)
700 self.assertEqual(max(1L, 2.0, 3), 3)
701 self.assertEqual(max(1.0, 2, 3L), 3L)
702
703 def test_min(self):
704 self.assertEqual(min('123123'), '1')
705 self.assertEqual(min(1, 2, 3), 1)
706 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
707 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
708
709 self.assertEqual(min(1, 2L, 3.0), 1)
710 self.assertEqual(min(1L, 2.0, 3), 1L)
711 self.assertEqual(min(1.0, 2, 3L), 1.0)
712
713 self.assertRaises(TypeError, min)
714 self.assertRaises(TypeError, min, 42)
715 self.assertRaises(ValueError, min, ())
716 class BadSeq:
717 def __getitem__(self, index):
718 raise ValueError
719 self.assertRaises(ValueError, min, BadSeq())
720 class BadNumber:
721 def __cmp__(self, other):
722 raise ValueError
723 self.assertRaises(ValueError, min, (42, BadNumber()))
724
725 def test_oct(self):
726 self.assertEqual(oct(100), '0144')
727 self.assertEqual(oct(100L), '0144L')
728 self.assert_(oct(-100) in ('037777777634', '01777777777777777777634'))
729 self.assertEqual(oct(-100L), '-0144L')
730 self.assertRaises(TypeError, oct, ())
731
732 def write_testfile(self):
733 # NB the first 4 lines are also used to test input and raw_input, below
734 fp = open(TESTFN, 'w')
735 try:
736 fp.write('1+1\n')
737 fp.write('1+1\n')
738 fp.write('The quick brown fox jumps over the lazy dog')
739 fp.write('.\n')
740 fp.write('Dear John\n')
741 fp.write('XXX'*100)
742 fp.write('YYY'*100)
743 finally:
744 fp.close()
745
746 def test_open(self):
747 self.write_testfile()
748 fp = open(TESTFN, 'r')
749 try:
750 self.assertEqual(fp.readline(4), '1+1\n')
751 self.assertEqual(fp.readline(4), '1+1\n')
752 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
753 self.assertEqual(fp.readline(4), 'Dear')
754 self.assertEqual(fp.readline(100), ' John\n')
755 self.assertEqual(fp.read(300), 'XXX'*100)
756 self.assertEqual(fp.read(1000), 'YYY'*100)
757 finally:
758 fp.close()
759 unlink(TESTFN)
760
761 def test_ord(self):
762 self.assertEqual(ord(' '), 32)
763 self.assertEqual(ord('A'), 65)
764 self.assertEqual(ord('a'), 97)
765 if have_unicode:
766 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
767 self.assertRaises(TypeError, ord, 42)
768 self.assertRaises(TypeError, ord, unicode("12"))
769
770 def test_pow(self):
771 self.assertEqual(pow(0,0), 1)
772 self.assertEqual(pow(0,1), 0)
773 self.assertEqual(pow(1,0), 1)
774 self.assertEqual(pow(1,1), 1)
775
776 self.assertEqual(pow(2,0), 1)
777 self.assertEqual(pow(2,10), 1024)
778 self.assertEqual(pow(2,20), 1024*1024)
779 self.assertEqual(pow(2,30), 1024*1024*1024)
780
781 self.assertEqual(pow(-2,0), 1)
782 self.assertEqual(pow(-2,1), -2)
783 self.assertEqual(pow(-2,2), 4)
784 self.assertEqual(pow(-2,3), -8)
785
786 self.assertEqual(pow(0L,0), 1)
787 self.assertEqual(pow(0L,1), 0)
788 self.assertEqual(pow(1L,0), 1)
789 self.assertEqual(pow(1L,1), 1)
790
791 self.assertEqual(pow(2L,0), 1)
792 self.assertEqual(pow(2L,10), 1024)
793 self.assertEqual(pow(2L,20), 1024*1024)
794 self.assertEqual(pow(2L,30), 1024*1024*1024)
795
796 self.assertEqual(pow(-2L,0), 1)
797 self.assertEqual(pow(-2L,1), -2)
798 self.assertEqual(pow(-2L,2), 4)
799 self.assertEqual(pow(-2L,3), -8)
800
801 self.assertAlmostEqual(pow(0.,0), 1.)
802 self.assertAlmostEqual(pow(0.,1), 0.)
803 self.assertAlmostEqual(pow(1.,0), 1.)
804 self.assertAlmostEqual(pow(1.,1), 1.)
805
806 self.assertAlmostEqual(pow(2.,0), 1.)
807 self.assertAlmostEqual(pow(2.,10), 1024.)
808 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
809 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
810
811 self.assertAlmostEqual(pow(-2.,0), 1.)
812 self.assertAlmostEqual(pow(-2.,1), -2.)
813 self.assertAlmostEqual(pow(-2.,2), 4.)
814 self.assertAlmostEqual(pow(-2.,3), -8.)
815
816 for x in 2, 2L, 2.0:
817 for y in 10, 10L, 10.0:
818 for z in 1000, 1000L, 1000.0:
819 if isinstance(x, float) or \
820 isinstance(y, float) or \
821 isinstance(z, float):
822 self.assertRaises(TypeError, pow, x, y, z)
823 else:
824 self.assertAlmostEqual(pow(x, y, z), 24.0)
825
826 self.assertRaises(TypeError, pow, -1, -2, 3)
827 self.assertRaises(ValueError, pow, 1, 2, 0)
828 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
829 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
830 self.assertRaises(ValueError, pow, -342.43, 0.234)
831
832 self.assertRaises(TypeError, pow)
833
834 def test_range(self):
835 self.assertEqual(range(3), [0, 1, 2])
836 self.assertEqual(range(1, 5), [1, 2, 3, 4])
837 self.assertEqual(range(0), [])
838 self.assertEqual(range(-3), [])
839 self.assertEqual(range(1, 10, 3), [1, 4, 7])
840 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
841
842 self.assertRaises(TypeError, range)
843 self.assertRaises(TypeError, range, 1, 2, 3, 4)
844 self.assertRaises(ValueError, range, 1, 2, 0)
845
846 def test_input_and_raw_input(self):
847 self.write_testfile()
848 fp = open(TESTFN, 'r')
849 savestdin = sys.stdin
850 savestdout = sys.stdout # Eats the echo
851 try:
852 sys.stdin = fp
853 sys.stdout = BitBucket()
854 self.assertEqual(input(), 2)
855 self.assertEqual(input('testing\n'), 2)
856 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
857 self.assertEqual(raw_input('testing\n'), 'Dear John')
858 sys.stdin = cStringIO.StringIO("NULL\0")
859 self.assertRaises(TypeError, input, 42, 42)
860 sys.stdin = cStringIO.StringIO(" 'whitespace'")
861 self.assertEqual(input(), 'whitespace')
862 sys.stdin = cStringIO.StringIO()
863 self.assertRaises(EOFError, input)
864 del sys.stdout
865 self.assertRaises(RuntimeError, input, 'prompt')
866 del sys.stdin
867 self.assertRaises(RuntimeError, input, 'prompt')
868 finally:
869 sys.stdin = savestdin
870 sys.stdout = savestdout
871 fp.close()
872 unlink(TESTFN)
873
874 def test_reduce(self):
875 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
876 self.assertEqual(
877 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
878 ['a','c','d','w']
879 )
880 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
881 self.assertEqual(
882 reduce(lambda x, y: x*y, range(2,21), 1L),
883 2432902008176640000L
884 )
885 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
886 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
887 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
888 self.assertRaises(TypeError, reduce)
889 self.assertRaises(TypeError, reduce, 42, 42)
890 self.assertRaises(TypeError, reduce, 42, 42, 42)
891 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
892 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
893 self.assertRaises(TypeError, reduce, 42, (42, 42))
894
895 class BadSeq:
896 def __getitem__(self, index):
897 raise ValueError
898 self.assertRaises(ValueError, reduce, 42, BadSeq())
899
900 def test_reload(self):
901 import marshal
902 reload(marshal)
903 import string
904 reload(string)
905 ## import sys
906 ## self.assertRaises(ImportError, reload, sys)
907
908 def test_repr(self):
909 self.assertEqual(repr(''), '\'\'')
910 self.assertEqual(repr(0), '0')
911 self.assertEqual(repr(0L), '0L')
912 self.assertEqual(repr(()), '()')
913 self.assertEqual(repr([]), '[]')
914 self.assertEqual(repr({}), '{}')
915 a = []
916 a.append(a)
917 self.assertEqual(repr(a), '[[...]]')
918 a = {}
919 a[0] = a
920 self.assertEqual(repr(a), '{0: {...}}')
921
922 def test_round(self):
923 self.assertEqual(round(0.0), 0.0)
924 self.assertEqual(round(1.0), 1.0)
925 self.assertEqual(round(10.0), 10.0)
926 self.assertEqual(round(1000000000.0), 1000000000.0)
927 self.assertEqual(round(1e20), 1e20)
928
929 self.assertEqual(round(-1.0), -1.0)
930 self.assertEqual(round(-10.0), -10.0)
931 self.assertEqual(round(-1000000000.0), -1000000000.0)
932 self.assertEqual(round(-1e20), -1e20)
933
934 self.assertEqual(round(0.1), 0.0)
935 self.assertEqual(round(1.1), 1.0)
936 self.assertEqual(round(10.1), 10.0)
937 self.assertEqual(round(1000000000.1), 1000000000.0)
938
939 self.assertEqual(round(-1.1), -1.0)
940 self.assertEqual(round(-10.1), -10.0)
941 self.assertEqual(round(-1000000000.1), -1000000000.0)
942
943 self.assertEqual(round(0.9), 1.0)
944 self.assertEqual(round(9.9), 10.0)
945 self.assertEqual(round(999999999.9), 1000000000.0)
946
947 self.assertEqual(round(-0.9), -1.0)
948 self.assertEqual(round(-9.9), -10.0)
949 self.assertEqual(round(-999999999.9), -1000000000.0)
950
951 self.assertEqual(round(-8.0, -1), -10.0)
952
953 self.assertRaises(TypeError, round)
954
955 def test_setattr(self):
956 setattr(sys, 'spam', 1)
957 self.assertEqual(sys.spam, 1)
958 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
959 self.assertRaises(TypeError, setattr)
960
961 def test_str(self):
962 self.assertEqual(str(''), '')
963 self.assertEqual(str(0), '0')
964 self.assertEqual(str(0L), '0')
965 self.assertEqual(str(()), '()')
966 self.assertEqual(str([]), '[]')
967 self.assertEqual(str({}), '{}')
968 a = []
969 a.append(a)
970 self.assertEqual(str(a), '[[...]]')
971 a = {}
972 a[0] = a
973 self.assertEqual(str(a), '{0: {...}}')
974
975 def test_tuple(self):
976 self.assertEqual(tuple(()), ())
977 t0_3 = (0, 1, 2, 3)
978 t0_3_bis = tuple(t0_3)
979 self.assert_(t0_3 is t0_3_bis)
980 self.assertEqual(tuple([]), ())
981 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
982 self.assertEqual(tuple(''), ())
983 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
984
985 def test_type(self):
986 self.assertEqual(type(''), type('123'))
987 self.assertNotEqual(type(''), type(()))
988
989 def test_unichr(self):
990 if have_unicode:
991 self.assertEqual(unichr(32), unicode(' '))
992 self.assertEqual(unichr(65), unicode('A'))
993 self.assertEqual(unichr(97), unicode('a'))
994 self.assertEqual(
995 unichr(sys.maxunicode),
996 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
997 )
998 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
999 self.assertRaises(TypeError, unichr)
1000
1001 def get_vars_f0():
1002 return vars()
1003 # we don't want self in vars(), so use staticmethod
1004 get_vars_f0 = staticmethod(get_vars_f0)
1005
1006 def get_vars_f2():
1007 BuiltinTest.get_vars_f0()
1008 a = 1
1009 b = 2
1010 return vars()
1011 get_vars_f2 = staticmethod(get_vars_f2)
1012
1013 def test_vars(self):
1014 a = b = None
1015 a = vars().keys()
1016 b = dir()
1017 a.sort()
1018 b.sort()
1019 self.assertEqual(a, b)
1020 import sys
1021 a = vars(sys).keys()
1022 b = dir(sys)
1023 a.sort()
1024 b.sort()
1025 self.assertEqual(a, b)
1026 self.assertEqual(self.get_vars_f0(), {})
1027 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1028 self.assertRaises(TypeError, vars, 42, 42)
1029 self.assertRaises(TypeError, vars, 42)
1030
1031 def test_zip(self):
1032 a = (1, 2, 3)
1033 b = (4, 5, 6)
1034 t = [(1, 4), (2, 5), (3, 6)]
1035 self.assertEqual(zip(a, b), t)
1036 b = [4, 5, 6]
1037 self.assertEqual(zip(a, b), t)
1038 b = (4, 5, 6, 7)
1039 self.assertEqual(zip(a, b), t)
1040 class I:
1041 def __getitem__(self, i):
1042 if i < 0 or i > 2: raise IndexError
1043 return i + 4
1044 self.assertEqual(zip(a, I()), t)
1045 self.assertRaises(TypeError, zip)
1046 self.assertRaises(TypeError, zip, None)
1047 class G:
1048 pass
1049 self.assertRaises(TypeError, zip, a, G())
1050
1051 # Make sure zip doesn't try to allocate a billion elements for the
1052 # result list when one of its arguments doesn't say how long it is.
1053 # A MemoryError is the most likely failure mode.
1054 class SequenceWithoutALength:
1055 def __getitem__(self, i):
1056 if i == 5:
1057 raise IndexError
1058 else:
1059 return i
1060 self.assertEqual(
1061 zip(SequenceWithoutALength(), xrange(2**30)),
1062 list(enumerate(range(5)))
1063 )
1064
1065 class BadSeq:
1066 def __getitem__(self, i):
1067 if i == 5:
1068 raise ValueError
1069 else:
1070 return i
1071 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1072
1073def test_main():
1074 suite = unittest.TestSuite()
1075 suite.addTest(unittest.makeSuite(BuiltinTest))
1076 test.test_support.run_suite(suite)
1077
1078if __name__ == "__main__":
1079 test_main()