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