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