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