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