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