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