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