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