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