blob: d47a9da82a7ad37893a556bc4fb0e423523f418a [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 Rossumefbbb1c2003-04-11 18:43:06 +00009warnings.filterwarnings("ignore", "integer argument expected",
10 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Walter Dörwald919497e2003-01-19 16:23:59 +000012class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014 def __init__(self, max):
15 self.max = max
16 self.sofar = []
17
18 def __len__(self): return len(self.sofar)
19
20 def __getitem__(self, i):
21 if not 0 <= i < self.max: raise IndexError
22 n = len(self.sofar)
23 while n <= i:
24 self.sofar.append(n*n)
25 n += 1
26 return self.sofar[i]
27
28class StrSquares:
29
30 def __init__(self, max):
31 self.max = max
32 self.sofar = []
33
34 def __len__(self):
35 return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max:
39 raise IndexError
40 n = len(self.sofar)
41 while n <= i:
42 self.sofar.append(str(n*n))
43 n += 1
44 return self.sofar[i]
45
46class BitBucket:
47 def write(self, line):
48 pass
49
50L = [
51 ('0', 0),
52 ('1', 1),
53 ('9', 9),
54 ('10', 10),
55 ('99', 99),
56 ('100', 100),
57 ('314', 314),
58 (' 314', 314),
59 ('314 ', 314),
60 (' \t\t 314 \t\t ', 314),
61 (`sys.maxint`, sys.maxint),
62 (' 1x', ValueError),
63 (' 1 ', 1),
64 (' 1\02 ', ValueError),
65 ('', ValueError),
66 (' ', ValueError),
67 (' \t\t ', ValueError)
68]
69if have_unicode:
70 L += [
71 (unicode('0'), 0),
72 (unicode('1'), 1),
73 (unicode('9'), 9),
74 (unicode('10'), 10),
75 (unicode('99'), 99),
76 (unicode('100'), 100),
77 (unicode('314'), 314),
78 (unicode(' 314'), 314),
79 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
80 (unicode(' \t\t 314 \t\t '), 314),
81 (unicode(' 1x'), ValueError),
82 (unicode(' 1 '), 1),
83 (unicode(' 1\02 '), ValueError),
84 (unicode(''), ValueError),
85 (unicode(' '), ValueError),
86 (unicode(' \t\t '), ValueError),
87 (unichr(0x200), ValueError),
88]
89
90class BuiltinTest(unittest.TestCase):
91
92 def test_import(self):
93 __import__('sys')
94 __import__('time')
95 __import__('string')
96 self.assertRaises(ImportError, __import__, 'spamspam')
97 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
98
99 def test_abs(self):
100 # int
101 self.assertEqual(abs(0), 0)
102 self.assertEqual(abs(1234), 1234)
103 self.assertEqual(abs(-1234), 1234)
104 # float
105 self.assertEqual(abs(0.0), 0.0)
106 self.assertEqual(abs(3.14), 3.14)
107 self.assertEqual(abs(-3.14), 3.14)
108 # long
109 self.assertEqual(abs(0L), 0L)
110 self.assertEqual(abs(1234L), 1234L)
111 self.assertEqual(abs(-1234L), 1234L)
112 # str
113 self.assertRaises(TypeError, abs, 'a')
114
115 def test_apply(self):
116 def f0(*args):
117 self.assertEqual(args, ())
118 def f1(a1):
119 self.assertEqual(a1, 1)
120 def f2(a1, a2):
121 self.assertEqual(a1, 1)
122 self.assertEqual(a2, 2)
123 def f3(a1, a2, a3):
124 self.assertEqual(a1, 1)
125 self.assertEqual(a2, 2)
126 self.assertEqual(a3, 3)
127 apply(f0, ())
128 apply(f1, (1,))
129 apply(f2, (1, 2))
130 apply(f3, (1, 2, 3))
131
132 # A PyCFunction that takes only positional parameters should allow an
133 # empty keyword dictionary to pass without a complaint, but raise a
134 # TypeError if the dictionary is non-empty.
135 apply(id, (1,), {})
136 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
137 self.assertRaises(TypeError, apply)
138 self.assertRaises(TypeError, apply, id, 42)
139 self.assertRaises(TypeError, apply, id, (42,), 42)
140
141 def test_callable(self):
142 self.assert_(callable(len))
143 def f(): pass
144 self.assert_(callable(f))
145 class C:
146 def meth(self): pass
147 self.assert_(callable(C))
148 x = C()
149 self.assert_(callable(x.meth))
150 self.assert_(not callable(x))
151 class D(C):
152 def __call__(self): pass
153 y = D()
154 self.assert_(callable(y))
155 y()
156
157 def test_chr(self):
158 self.assertEqual(chr(32), ' ')
159 self.assertEqual(chr(65), 'A')
160 self.assertEqual(chr(97), 'a')
161 self.assertEqual(chr(0xff), '\xff')
162 self.assertRaises(ValueError, chr, 256)
163 self.assertRaises(TypeError, chr)
164
165 def test_cmp(self):
166 self.assertEqual(cmp(-1, 1), -1)
167 self.assertEqual(cmp(1, -1), 1)
168 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000169 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 a = []; a.append(a)
171 b = []; b.append(b)
172 from UserList import UserList
173 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000174 self.assertRaises(RuntimeError, cmp, a, b)
175 self.assertRaises(RuntimeError, cmp, b, c)
176 self.assertRaises(RuntimeError, cmp, c, a)
177 self.assertRaises(RuntimeError, cmp, a, c)
178 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 a.pop(); b.pop(); c.pop()
180 self.assertRaises(TypeError, cmp)
181
182 def test_coerce(self):
183 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
184 self.assertEqual(coerce(1, 1L), (1L, 1L))
185 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
186 self.assertRaises(TypeError, coerce)
187 class BadNumber:
188 def __coerce__(self, other):
189 raise ValueError
190 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000191 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000192
193 def test_compile(self):
194 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000195 bom = '\xef\xbb\xbf'
196 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 self.assertRaises(TypeError, compile)
198 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
199 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000200 if have_unicode:
201 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000202
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 def test_delattr(self):
204 import sys
205 sys.spam = 1
206 delattr(sys, 'spam')
207 self.assertRaises(TypeError, delattr)
208
209 def test_dir(self):
210 x = 1
211 self.assert_('x' in dir())
212 import sys
213 self.assert_('modules' in dir(sys))
214 self.assertRaises(TypeError, dir, 42, 42)
215
216 def test_divmod(self):
217 self.assertEqual(divmod(12, 7), (1, 5))
218 self.assertEqual(divmod(-12, 7), (-2, 2))
219 self.assertEqual(divmod(12, -7), (-2, -2))
220 self.assertEqual(divmod(-12, -7), (1, -5))
221
222 self.assertEqual(divmod(12L, 7L), (1L, 5L))
223 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
224 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
225 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
226
227 self.assertEqual(divmod(12, 7L), (1, 5L))
228 self.assertEqual(divmod(-12, 7L), (-2, 2L))
229 self.assertEqual(divmod(12L, -7), (-2L, -2))
230 self.assertEqual(divmod(-12L, -7), (1L, -5))
231
232 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
233 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
234 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
235 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
236
237 self.assertRaises(TypeError, divmod)
238
239 def test_eval(self):
240 self.assertEqual(eval('1+1'), 2)
241 self.assertEqual(eval(' 1+1\n'), 2)
242 globals = {'a': 1, 'b': 2}
243 locals = {'b': 200, 'c': 300}
244 self.assertEqual(eval('a', globals) , 1)
245 self.assertEqual(eval('a', globals, locals), 1)
246 self.assertEqual(eval('b', globals, locals), 200)
247 self.assertEqual(eval('c', globals, locals), 300)
248 if have_unicode:
249 self.assertEqual(eval(unicode('1+1')), 2)
250 self.assertEqual(eval(unicode(' 1+1\n')), 2)
251 globals = {'a': 1, 'b': 2}
252 locals = {'b': 200, 'c': 300}
253 if have_unicode:
254 self.assertEqual(eval(unicode('a'), globals), 1)
255 self.assertEqual(eval(unicode('a'), globals, locals), 1)
256 self.assertEqual(eval(unicode('b'), globals, locals), 200)
257 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000258 bom = '\xef\xbb\xbf'
259 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000260 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
261 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000262 self.assertRaises(TypeError, eval)
263 self.assertRaises(TypeError, eval, ())
264
265 # Done outside of the method test_z to get the correct scope
266 z = 0
267 f = open(TESTFN, 'w')
268 f.write('z = z+1\n')
269 f.write('z = z*2\n')
270 f.close()
271 execfile(TESTFN)
272
273 def test_execfile(self):
274 globals = {'a': 1, 'b': 2}
275 locals = {'b': 200, 'c': 300}
276
277 self.assertEqual(self.__class__.z, 2)
278 globals['z'] = 0
279 execfile(TESTFN, globals)
280 self.assertEqual(globals['z'], 2)
281 locals['z'] = 0
282 execfile(TESTFN, globals, locals)
283 self.assertEqual(locals['z'], 2)
284 unlink(TESTFN)
285 self.assertRaises(TypeError, execfile)
286 import os
287 self.assertRaises(IOError, execfile, os.curdir)
288 self.assertRaises(IOError, execfile, "I_dont_exist")
289
290 def test_filter(self):
291 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
292 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
293 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
294 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
295 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
296 def identity(item):
297 return 1
298 filter(identity, Squares(5))
299 self.assertRaises(TypeError, filter)
300 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000301 def __getitem__(self, index):
302 if index<4:
303 return 42
304 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000305 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
306 def badfunc():
307 pass
308 self.assertRaises(TypeError, filter, badfunc, range(5))
309
Walter Dörwaldbf517072003-01-27 15:57:14 +0000310 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000311 self.assertEqual(filter(None, (1, 2)), (1, 2))
312 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
313 self.assertRaises(TypeError, filter, 42, (1, 2))
314
Walter Dörwaldbf517072003-01-27 15:57:14 +0000315 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000316 self.assertEqual(filter(None, "12"), "12")
317 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
318 self.assertRaises(TypeError, filter, 42, "12")
319 class badstr(str):
320 def __getitem__(self, index):
321 raise ValueError
322 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000323
Walter Dörwald903f1e02003-02-04 16:28:00 +0000324 class badstr2(str):
325 def __getitem__(self, index):
326 return 42
327 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
328
329 class weirdstr(str):
330 def __getitem__(self, index):
331 return weirdstr(2*str.__getitem__(self, index))
332 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
333
Walter Dörwald5e61e242003-02-04 17:04:01 +0000334 class shiftstr(str):
335 def __getitem__(self, index):
336 return chr(ord(str.__getitem__(self, index))+1)
337 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
338
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000339 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000340 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000341 self.assertEqual(filter(None, unicode("12")), unicode("12"))
342 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
343 self.assertRaises(TypeError, filter, 42, unicode("12"))
344 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000345
Walter Dörwald903f1e02003-02-04 16:28:00 +0000346 class badunicode(unicode):
347 def __getitem__(self, index):
348 return 42
349 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
350
351 class weirdunicode(unicode):
352 def __getitem__(self, index):
353 return weirdunicode(2*unicode.__getitem__(self, index))
354 self.assertEqual(
355 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
356
Walter Dörwald5e61e242003-02-04 17:04:01 +0000357 class shiftunicode(unicode):
358 def __getitem__(self, index):
359 return unichr(ord(unicode.__getitem__(self, index))+1)
360 self.assertEqual(
361 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
362 unicode("345")
363 )
364
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000365 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000366 # test that filter() never returns tuple, str or unicode subclasses
367 # and that the result always goes through __getitem__
368 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000369 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000370 def __getitem__(self, index):
371 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000372 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000373 def __getitem__(self, index):
374 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000375 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000376 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000377 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000378 }
379 if have_unicode:
380 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000381 def __getitem__(self, index):
382 return 2*unicode.__getitem__(self, index)
383 inputs[unicode2] = {
384 unicode(): unicode(),
385 unicode("123"): unicode("112233")
386 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000387
Walter Dörwald1918f772003-02-10 13:19:13 +0000388 for (cls, inps) in inputs.iteritems():
389 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000390 # make sure the output goes through __getitem__
391 # even if func is None
392 self.assertEqual(
393 filter(funcs[0], cls(inp)),
394 filter(funcs[1], cls(inp))
395 )
396 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000397 outp = filter(func, cls(inp))
398 self.assertEqual(outp, exp)
399 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000400
Walter Dörwald919497e2003-01-19 16:23:59 +0000401 def test_float(self):
402 self.assertEqual(float(3.14), 3.14)
403 self.assertEqual(float(314), 314.0)
404 self.assertEqual(float(314L), 314.0)
405 self.assertEqual(float(" 3.14 "), 3.14)
406 if have_unicode:
407 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
408 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
409
410 def test_getattr(self):
411 import sys
412 self.assert_(getattr(sys, 'stdout') is sys.stdout)
413 self.assertRaises(TypeError, getattr, sys, 1)
414 self.assertRaises(TypeError, getattr, sys, 1, "foo")
415 self.assertRaises(TypeError, getattr)
416 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
417
418 def test_hasattr(self):
419 import sys
420 self.assert_(hasattr(sys, 'stdout'))
421 self.assertRaises(TypeError, hasattr, sys, 1)
422 self.assertRaises(TypeError, hasattr)
423 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
424
425 def test_hash(self):
426 hash(None)
427 self.assertEqual(hash(1), hash(1L))
428 self.assertEqual(hash(1), hash(1.0))
429 hash('spam')
430 if have_unicode:
431 self.assertEqual(hash('spam'), hash(unicode('spam')))
432 hash((0,1,2,3))
433 def f(): pass
434 self.assertRaises(TypeError, hash, [])
435 self.assertRaises(TypeError, hash, {})
436
437 def test_hex(self):
438 self.assertEqual(hex(16), '0x10')
439 self.assertEqual(hex(16L), '0x10L')
440 self.assertEqual(len(hex(-1)), len(hex(sys.maxint)))
441 self.assert_(hex(-16) in ('0xfffffff0', '0xfffffffffffffff0'))
442 self.assertEqual(hex(-16L), '-0x10L')
443 self.assertRaises(TypeError, hex, {})
444
445 def test_id(self):
446 id(None)
447 id(1)
448 id(1L)
449 id(1.0)
450 id('spam')
451 id((0,1,2,3))
452 id([0,1,2,3])
453 id({'spam': 1, 'eggs': 2, 'ham': 3})
454
455 # Test input() later, together with raw_input
456
457 def test_int(self):
458 self.assertEqual(int(314), 314)
459 self.assertEqual(int(3.14), 3)
460 self.assertEqual(int(314L), 314)
461 # Check that conversion from float truncates towards zero
462 self.assertEqual(int(-3.14), -3)
463 self.assertEqual(int(3.9), 3)
464 self.assertEqual(int(-3.9), -3)
465 self.assertEqual(int(3.5), 3)
466 self.assertEqual(int(-3.5), -3)
467 # Different base:
468 self.assertEqual(int("10",16), 16L)
469 if have_unicode:
470 self.assertEqual(int(unicode("10"),16), 16L)
471 # Test conversion from strings and various anomalies
472 for s, v in L:
473 for sign in "", "+", "-":
474 for prefix in "", " ", "\t", " \t\t ":
475 ss = prefix + sign + s
476 vv = v
477 if sign == "-" and v is not ValueError:
478 vv = -v
479 try:
480 self.assertEqual(int(ss), vv)
481 except v:
482 pass
483
484 s = `-1-sys.maxint`
485 self.assertEqual(int(s)+1, -sys.maxint)
486 # should return long
487 int(s[1:])
488
489 # should return long
490 x = int(1e100)
491 self.assert_(isinstance(x, long))
492 x = int(-1e100)
493 self.assert_(isinstance(x, long))
494
495
496 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
497 # Worked by accident in Windows release build, but failed in debug build.
498 # Failed in all Linux builds.
499 x = -1-sys.maxint
500 self.assertEqual(x >> 1, x//2)
501
502 self.assertRaises(ValueError, int, '123\0')
503 self.assertRaises(ValueError, int, '53', 40)
504
505 x = int('1' * 600)
506 self.assert_(isinstance(x, long))
507
508 if have_unicode:
509 x = int(unichr(0x661) * 600)
510 self.assert_(isinstance(x, long))
511
512 self.assertRaises(TypeError, int, 1, 12)
513
514 self.assertEqual(int('0123', 0), 83)
515
516 def test_intern(self):
517 self.assertRaises(TypeError, intern)
518 s = "never interned before"
519 self.assert_(intern(s) is s)
520 s2 = s.swapcase().swapcase()
521 self.assert_(intern(s2) is s)
522
523 def test_iter(self):
524 self.assertRaises(TypeError, iter)
525 self.assertRaises(TypeError, iter, 42, 42)
526 lists = [("1", "2"), ["1", "2"], "12"]
527 if have_unicode:
528 lists.append(unicode("12"))
529 for l in lists:
530 i = iter(l)
531 self.assertEqual(i.next(), '1')
532 self.assertEqual(i.next(), '2')
533 self.assertRaises(StopIteration, i.next)
534
535 def test_isinstance(self):
536 class C:
537 pass
538 class D(C):
539 pass
540 class E:
541 pass
542 c = C()
543 d = D()
544 e = E()
545 self.assert_(isinstance(c, C))
546 self.assert_(isinstance(d, C))
547 self.assert_(not isinstance(e, C))
548 self.assert_(not isinstance(c, D))
549 self.assert_(not isinstance('foo', E))
550 self.assertRaises(TypeError, isinstance, E, 'foo')
551 self.assertRaises(TypeError, isinstance)
552
553 def test_issubclass(self):
554 class C:
555 pass
556 class D(C):
557 pass
558 class E:
559 pass
560 c = C()
561 d = D()
562 e = E()
563 self.assert_(issubclass(D, C))
564 self.assert_(issubclass(C, C))
565 self.assert_(not issubclass(C, D))
566 self.assertRaises(TypeError, issubclass, 'foo', E)
567 self.assertRaises(TypeError, issubclass, E, 'foo')
568 self.assertRaises(TypeError, issubclass)
569
570 def test_len(self):
571 self.assertEqual(len('123'), 3)
572 self.assertEqual(len(()), 0)
573 self.assertEqual(len((1, 2, 3, 4)), 4)
574 self.assertEqual(len([1, 2, 3, 4]), 4)
575 self.assertEqual(len({}), 0)
576 self.assertEqual(len({'a':1, 'b': 2}), 2)
577 class BadSeq:
578 def __len__(self):
579 raise ValueError
580 self.assertRaises(ValueError, len, BadSeq())
581
582 def test_list(self):
583 self.assertEqual(list([]), [])
584 l0_3 = [0, 1, 2, 3]
585 l0_3_bis = list(l0_3)
586 self.assertEqual(l0_3, l0_3_bis)
587 self.assert_(l0_3 is not l0_3_bis)
588 self.assertEqual(list(()), [])
589 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
590 self.assertEqual(list(''), [])
591 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
592
593 if sys.maxint == 0x7fffffff:
594 # This test can currently only work on 32-bit machines.
595 # XXX If/when PySequence_Length() returns a ssize_t, it should be
596 # XXX re-enabled.
597 # Verify clearing of bug #556025.
598 # This assumes that the max data size (sys.maxint) == max
599 # address size this also assumes that the address size is at
600 # least 4 bytes with 8 byte addresses, the bug is not well
601 # tested
602 #
603 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
604 # earlier due to a newlib bug. See the following mailing list
605 # thread for the details:
606
607 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
608 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
609
610 def test_long(self):
611 self.assertEqual(long(314), 314L)
612 self.assertEqual(long(3.14), 3L)
613 self.assertEqual(long(314L), 314L)
614 # Check that conversion from float truncates towards zero
615 self.assertEqual(long(-3.14), -3L)
616 self.assertEqual(long(3.9), 3L)
617 self.assertEqual(long(-3.9), -3L)
618 self.assertEqual(long(3.5), 3L)
619 self.assertEqual(long(-3.5), -3L)
620 self.assertEqual(long("-3"), -3L)
621 if have_unicode:
622 self.assertEqual(long(unicode("-3")), -3L)
623 # Different base:
624 self.assertEqual(long("10",16), 16L)
625 if have_unicode:
626 self.assertEqual(long(unicode("10"),16), 16L)
627 # Check conversions from string (same test set as for int(), and then some)
628 LL = [
629 ('1' + '0'*20, 10L**20),
630 ('1' + '0'*100, 10L**100)
631 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000632 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 if have_unicode:
634 L2 += [
635 (unicode('1') + unicode('0')*20, 10L**20),
636 (unicode('1') + unicode('0')*100, 10L**100),
637 ]
638 for s, v in L2 + LL:
639 for sign in "", "+", "-":
640 for prefix in "", " ", "\t", " \t\t ":
641 ss = prefix + sign + s
642 vv = v
643 if sign == "-" and v is not ValueError:
644 vv = -v
645 try:
646 self.assertEqual(long(ss), long(vv))
647 except v:
648 pass
649
650 self.assertRaises(ValueError, long, '123\0')
651 self.assertRaises(ValueError, long, '53', 40)
652 self.assertRaises(TypeError, long, 1, 12)
653
654 def test_map(self):
655 self.assertEqual(
656 map(None, 'hello world'),
657 ['h','e','l','l','o',' ','w','o','r','l','d']
658 )
659 self.assertEqual(
660 map(None, 'abcd', 'efg'),
661 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
662 )
663 self.assertEqual(
664 map(None, range(10)),
665 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
666 )
667 self.assertEqual(
668 map(lambda x: x*x, range(1,4)),
669 [1, 4, 9]
670 )
671 try:
672 from math import sqrt
673 except ImportError:
674 def sqrt(x):
675 return pow(x, 0.5)
676 self.assertEqual(
677 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
678 [[4.0, 2.0], [9.0, 3.0]]
679 )
680 self.assertEqual(
681 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
682 [10, 4, 6]
683 )
684
685 def plus(*v):
686 accu = 0
687 for i in v: accu = accu + i
688 return accu
689 self.assertEqual(
690 map(plus, [1, 3, 7]),
691 [1, 3, 7]
692 )
693 self.assertEqual(
694 map(plus, [1, 3, 7], [4, 9, 2]),
695 [1+4, 3+9, 7+2]
696 )
697 self.assertEqual(
698 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
699 [1+4+1, 3+9+1, 7+2+0]
700 )
701 self.assertEqual(
702 map(None, Squares(10)),
703 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
704 )
705 self.assertEqual(
706 map(int, Squares(10)),
707 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
708 )
709 self.assertEqual(
710 map(None, Squares(3), Squares(2)),
711 [(0,0), (1,1), (4,None)]
712 )
713 self.assertEqual(
714 map(max, Squares(3), Squares(2)),
715 [0, 1, 4]
716 )
717 self.assertRaises(TypeError, map)
718 self.assertRaises(TypeError, map, lambda x: x, 42)
719 self.assertEqual(map(None, [42]), [42])
720 class BadSeq:
721 def __getitem__(self, index):
722 raise ValueError
723 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
724
725 def test_max(self):
726 self.assertEqual(max('123123'), '3')
727 self.assertEqual(max(1, 2, 3), 3)
728 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
729 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
730
731 self.assertEqual(max(1, 2L, 3.0), 3.0)
732 self.assertEqual(max(1L, 2.0, 3), 3)
733 self.assertEqual(max(1.0, 2, 3L), 3L)
734
735 def test_min(self):
736 self.assertEqual(min('123123'), '1')
737 self.assertEqual(min(1, 2, 3), 1)
738 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
739 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
740
741 self.assertEqual(min(1, 2L, 3.0), 1)
742 self.assertEqual(min(1L, 2.0, 3), 1L)
743 self.assertEqual(min(1.0, 2, 3L), 1.0)
744
745 self.assertRaises(TypeError, min)
746 self.assertRaises(TypeError, min, 42)
747 self.assertRaises(ValueError, min, ())
748 class BadSeq:
749 def __getitem__(self, index):
750 raise ValueError
751 self.assertRaises(ValueError, min, BadSeq())
752 class BadNumber:
753 def __cmp__(self, other):
754 raise ValueError
755 self.assertRaises(ValueError, min, (42, BadNumber()))
756
757 def test_oct(self):
758 self.assertEqual(oct(100), '0144')
759 self.assertEqual(oct(100L), '0144L')
760 self.assert_(oct(-100) in ('037777777634', '01777777777777777777634'))
761 self.assertEqual(oct(-100L), '-0144L')
762 self.assertRaises(TypeError, oct, ())
763
764 def write_testfile(self):
765 # NB the first 4 lines are also used to test input and raw_input, below
766 fp = open(TESTFN, 'w')
767 try:
768 fp.write('1+1\n')
769 fp.write('1+1\n')
770 fp.write('The quick brown fox jumps over the lazy dog')
771 fp.write('.\n')
772 fp.write('Dear John\n')
773 fp.write('XXX'*100)
774 fp.write('YYY'*100)
775 finally:
776 fp.close()
777
778 def test_open(self):
779 self.write_testfile()
780 fp = open(TESTFN, 'r')
781 try:
782 self.assertEqual(fp.readline(4), '1+1\n')
783 self.assertEqual(fp.readline(4), '1+1\n')
784 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
785 self.assertEqual(fp.readline(4), 'Dear')
786 self.assertEqual(fp.readline(100), ' John\n')
787 self.assertEqual(fp.read(300), 'XXX'*100)
788 self.assertEqual(fp.read(1000), 'YYY'*100)
789 finally:
790 fp.close()
791 unlink(TESTFN)
792
793 def test_ord(self):
794 self.assertEqual(ord(' '), 32)
795 self.assertEqual(ord('A'), 65)
796 self.assertEqual(ord('a'), 97)
797 if have_unicode:
798 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
799 self.assertRaises(TypeError, ord, 42)
800 self.assertRaises(TypeError, ord, unicode("12"))
801
802 def test_pow(self):
803 self.assertEqual(pow(0,0), 1)
804 self.assertEqual(pow(0,1), 0)
805 self.assertEqual(pow(1,0), 1)
806 self.assertEqual(pow(1,1), 1)
807
808 self.assertEqual(pow(2,0), 1)
809 self.assertEqual(pow(2,10), 1024)
810 self.assertEqual(pow(2,20), 1024*1024)
811 self.assertEqual(pow(2,30), 1024*1024*1024)
812
813 self.assertEqual(pow(-2,0), 1)
814 self.assertEqual(pow(-2,1), -2)
815 self.assertEqual(pow(-2,2), 4)
816 self.assertEqual(pow(-2,3), -8)
817
818 self.assertEqual(pow(0L,0), 1)
819 self.assertEqual(pow(0L,1), 0)
820 self.assertEqual(pow(1L,0), 1)
821 self.assertEqual(pow(1L,1), 1)
822
823 self.assertEqual(pow(2L,0), 1)
824 self.assertEqual(pow(2L,10), 1024)
825 self.assertEqual(pow(2L,20), 1024*1024)
826 self.assertEqual(pow(2L,30), 1024*1024*1024)
827
828 self.assertEqual(pow(-2L,0), 1)
829 self.assertEqual(pow(-2L,1), -2)
830 self.assertEqual(pow(-2L,2), 4)
831 self.assertEqual(pow(-2L,3), -8)
832
833 self.assertAlmostEqual(pow(0.,0), 1.)
834 self.assertAlmostEqual(pow(0.,1), 0.)
835 self.assertAlmostEqual(pow(1.,0), 1.)
836 self.assertAlmostEqual(pow(1.,1), 1.)
837
838 self.assertAlmostEqual(pow(2.,0), 1.)
839 self.assertAlmostEqual(pow(2.,10), 1024.)
840 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
841 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
842
843 self.assertAlmostEqual(pow(-2.,0), 1.)
844 self.assertAlmostEqual(pow(-2.,1), -2.)
845 self.assertAlmostEqual(pow(-2.,2), 4.)
846 self.assertAlmostEqual(pow(-2.,3), -8.)
847
848 for x in 2, 2L, 2.0:
849 for y in 10, 10L, 10.0:
850 for z in 1000, 1000L, 1000.0:
851 if isinstance(x, float) or \
852 isinstance(y, float) or \
853 isinstance(z, float):
854 self.assertRaises(TypeError, pow, x, y, z)
855 else:
856 self.assertAlmostEqual(pow(x, y, z), 24.0)
857
858 self.assertRaises(TypeError, pow, -1, -2, 3)
859 self.assertRaises(ValueError, pow, 1, 2, 0)
860 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
861 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
862 self.assertRaises(ValueError, pow, -342.43, 0.234)
863
864 self.assertRaises(TypeError, pow)
865
866 def test_range(self):
867 self.assertEqual(range(3), [0, 1, 2])
868 self.assertEqual(range(1, 5), [1, 2, 3, 4])
869 self.assertEqual(range(0), [])
870 self.assertEqual(range(-3), [])
871 self.assertEqual(range(1, 10, 3), [1, 4, 7])
872 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
873
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000874 # Now test range() with longs
875 self.assertEqual(range(-2**100), [])
876 self.assertEqual(range(0, -2**100), [])
877 self.assertEqual(range(0, 2**100, -1), [])
878 self.assertEqual(range(0, 2**100, -1), [])
879
880 a = long(10 * sys.maxint)
881 b = long(100 * sys.maxint)
882 c = long(50 * sys.maxint)
883
884 self.assertEqual(range(a, a+2), [a, a+1])
885 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
886 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
887
888 seq = range(a, b, c)
889 self.assert_(a in seq)
890 self.assert_(b not in seq)
891 self.assertEqual(len(seq), 2)
892
893 seq = range(b, a, -c)
894 self.assert_(b in seq)
895 self.assert_(a not in seq)
896 self.assertEqual(len(seq), 2)
897
898 seq = range(-a, -b, -c)
899 self.assert_(-a in seq)
900 self.assert_(-b not in seq)
901 self.assertEqual(len(seq), 2)
902
Walter Dörwald919497e2003-01-19 16:23:59 +0000903 self.assertRaises(TypeError, range)
904 self.assertRaises(TypeError, range, 1, 2, 3, 4)
905 self.assertRaises(ValueError, range, 1, 2, 0)
906
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000907 # Reject floats when it would require PyLongs to represent.
908 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000909 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000910
Walter Dörwald357981e2003-04-15 18:59:28 +0000911 self.assertRaises(TypeError, range, 0, "spam")
912 self.assertRaises(TypeError, range, 0, 42, "spam")
913
914 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
915 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
916
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 def test_input_and_raw_input(self):
918 self.write_testfile()
919 fp = open(TESTFN, 'r')
920 savestdin = sys.stdin
921 savestdout = sys.stdout # Eats the echo
922 try:
923 sys.stdin = fp
924 sys.stdout = BitBucket()
925 self.assertEqual(input(), 2)
926 self.assertEqual(input('testing\n'), 2)
927 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
928 self.assertEqual(raw_input('testing\n'), 'Dear John')
929 sys.stdin = cStringIO.StringIO("NULL\0")
930 self.assertRaises(TypeError, input, 42, 42)
931 sys.stdin = cStringIO.StringIO(" 'whitespace'")
932 self.assertEqual(input(), 'whitespace')
933 sys.stdin = cStringIO.StringIO()
934 self.assertRaises(EOFError, input)
935 del sys.stdout
936 self.assertRaises(RuntimeError, input, 'prompt')
937 del sys.stdin
938 self.assertRaises(RuntimeError, input, 'prompt')
939 finally:
940 sys.stdin = savestdin
941 sys.stdout = savestdout
942 fp.close()
943 unlink(TESTFN)
944
945 def test_reduce(self):
946 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
947 self.assertEqual(
948 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
949 ['a','c','d','w']
950 )
951 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
952 self.assertEqual(
953 reduce(lambda x, y: x*y, range(2,21), 1L),
954 2432902008176640000L
955 )
956 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
957 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
958 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
959 self.assertRaises(TypeError, reduce)
960 self.assertRaises(TypeError, reduce, 42, 42)
961 self.assertRaises(TypeError, reduce, 42, 42, 42)
962 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
963 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
964 self.assertRaises(TypeError, reduce, 42, (42, 42))
965
966 class BadSeq:
967 def __getitem__(self, index):
968 raise ValueError
969 self.assertRaises(ValueError, reduce, 42, BadSeq())
970
971 def test_reload(self):
972 import marshal
973 reload(marshal)
974 import string
975 reload(string)
976 ## import sys
977 ## self.assertRaises(ImportError, reload, sys)
978
979 def test_repr(self):
980 self.assertEqual(repr(''), '\'\'')
981 self.assertEqual(repr(0), '0')
982 self.assertEqual(repr(0L), '0L')
983 self.assertEqual(repr(()), '()')
984 self.assertEqual(repr([]), '[]')
985 self.assertEqual(repr({}), '{}')
986 a = []
987 a.append(a)
988 self.assertEqual(repr(a), '[[...]]')
989 a = {}
990 a[0] = a
991 self.assertEqual(repr(a), '{0: {...}}')
992
993 def test_round(self):
994 self.assertEqual(round(0.0), 0.0)
995 self.assertEqual(round(1.0), 1.0)
996 self.assertEqual(round(10.0), 10.0)
997 self.assertEqual(round(1000000000.0), 1000000000.0)
998 self.assertEqual(round(1e20), 1e20)
999
1000 self.assertEqual(round(-1.0), -1.0)
1001 self.assertEqual(round(-10.0), -10.0)
1002 self.assertEqual(round(-1000000000.0), -1000000000.0)
1003 self.assertEqual(round(-1e20), -1e20)
1004
1005 self.assertEqual(round(0.1), 0.0)
1006 self.assertEqual(round(1.1), 1.0)
1007 self.assertEqual(round(10.1), 10.0)
1008 self.assertEqual(round(1000000000.1), 1000000000.0)
1009
1010 self.assertEqual(round(-1.1), -1.0)
1011 self.assertEqual(round(-10.1), -10.0)
1012 self.assertEqual(round(-1000000000.1), -1000000000.0)
1013
1014 self.assertEqual(round(0.9), 1.0)
1015 self.assertEqual(round(9.9), 10.0)
1016 self.assertEqual(round(999999999.9), 1000000000.0)
1017
1018 self.assertEqual(round(-0.9), -1.0)
1019 self.assertEqual(round(-9.9), -10.0)
1020 self.assertEqual(round(-999999999.9), -1000000000.0)
1021
1022 self.assertEqual(round(-8.0, -1), -10.0)
1023
1024 self.assertRaises(TypeError, round)
1025
1026 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001027 setattr(sys, 'spam', 1)
1028 self.assertEqual(sys.spam, 1)
1029 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1030 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001031
1032 def test_str(self):
1033 self.assertEqual(str(''), '')
1034 self.assertEqual(str(0), '0')
1035 self.assertEqual(str(0L), '0')
1036 self.assertEqual(str(()), '()')
1037 self.assertEqual(str([]), '[]')
1038 self.assertEqual(str({}), '{}')
1039 a = []
1040 a.append(a)
1041 self.assertEqual(str(a), '[[...]]')
1042 a = {}
1043 a[0] = a
1044 self.assertEqual(str(a), '{0: {...}}')
1045
Alex Martellia70b1912003-04-22 08:12:33 +00001046 def test_sum(self):
1047 self.assertEqual(sum([]), 0)
1048 self.assertEqual(sum(range(2,8)), 27)
1049 self.assertEqual(sum(iter(range(2,8))), 27)
1050 self.assertEqual(sum(Squares(10)), 285)
1051 self.assertEqual(sum(iter(Squares(10))), 285)
1052 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1053
1054 self.assertRaises(TypeError, sum)
1055 self.assertRaises(TypeError, sum, 42)
1056 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1057 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1058 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1059 self.assertRaises(TypeError, sum, [{2:3}])
1060 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1061
1062 class BadSeq:
1063 def __getitem__(self, index):
1064 raise ValueError
1065 self.assertRaises(ValueError, sum, BadSeq())
1066
Walter Dörwald919497e2003-01-19 16:23:59 +00001067 def test_tuple(self):
1068 self.assertEqual(tuple(()), ())
1069 t0_3 = (0, 1, 2, 3)
1070 t0_3_bis = tuple(t0_3)
1071 self.assert_(t0_3 is t0_3_bis)
1072 self.assertEqual(tuple([]), ())
1073 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1074 self.assertEqual(tuple(''), ())
1075 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1076
1077 def test_type(self):
1078 self.assertEqual(type(''), type('123'))
1079 self.assertNotEqual(type(''), type(()))
1080
1081 def test_unichr(self):
1082 if have_unicode:
1083 self.assertEqual(unichr(32), unicode(' '))
1084 self.assertEqual(unichr(65), unicode('A'))
1085 self.assertEqual(unichr(97), unicode('a'))
1086 self.assertEqual(
1087 unichr(sys.maxunicode),
1088 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1089 )
1090 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1091 self.assertRaises(TypeError, unichr)
1092
1093 def get_vars_f0():
1094 return vars()
1095 # we don't want self in vars(), so use staticmethod
1096 get_vars_f0 = staticmethod(get_vars_f0)
1097
1098 def get_vars_f2():
1099 BuiltinTest.get_vars_f0()
1100 a = 1
1101 b = 2
1102 return vars()
1103 get_vars_f2 = staticmethod(get_vars_f2)
1104
1105 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001106 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001107 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001108 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001109 self.assertEqual(self.get_vars_f0(), {})
1110 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1111 self.assertRaises(TypeError, vars, 42, 42)
1112 self.assertRaises(TypeError, vars, 42)
1113
1114 def test_zip(self):
1115 a = (1, 2, 3)
1116 b = (4, 5, 6)
1117 t = [(1, 4), (2, 5), (3, 6)]
1118 self.assertEqual(zip(a, b), t)
1119 b = [4, 5, 6]
1120 self.assertEqual(zip(a, b), t)
1121 b = (4, 5, 6, 7)
1122 self.assertEqual(zip(a, b), t)
1123 class I:
1124 def __getitem__(self, i):
1125 if i < 0 or i > 2: raise IndexError
1126 return i + 4
1127 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001128 self.assertEqual(zip(), [])
1129 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001130 self.assertRaises(TypeError, zip, None)
1131 class G:
1132 pass
1133 self.assertRaises(TypeError, zip, a, G())
1134
1135 # Make sure zip doesn't try to allocate a billion elements for the
1136 # result list when one of its arguments doesn't say how long it is.
1137 # A MemoryError is the most likely failure mode.
1138 class SequenceWithoutALength:
1139 def __getitem__(self, i):
1140 if i == 5:
1141 raise IndexError
1142 else:
1143 return i
1144 self.assertEqual(
1145 zip(SequenceWithoutALength(), xrange(2**30)),
1146 list(enumerate(range(5)))
1147 )
1148
1149 class BadSeq:
1150 def __getitem__(self, i):
1151 if i == 5:
1152 raise ValueError
1153 else:
1154 return i
1155 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1156
1157def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +00001158 test.test_support.run_unittest(BuiltinTest)
Walter Dörwald919497e2003-01-19 16:23:59 +00001159
1160if __name__ == "__main__":
1161 test_main()