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