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