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