blob: 48d50d88be274168819c4097bbab6606eebc9a94 [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
Georg Brandlde9b6242006-04-30 11:13:56 +00004from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
5 run_unittest, run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Raymond Hettinger214b1c32004-07-02 06:41:07 +00008import sys, warnings, cStringIO, random, UserDict
Walter Dörwald919497e2003-01-19 16:23:59 +00009warnings.filterwarnings("ignore", "hex../oct.. of negative int",
10 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000011warnings.filterwarnings("ignore", "integer argument expected",
12 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000014# count the number of test runs.
15# used to skip running test_execfile() multiple times
16numruns = 0
17
Walter Dörwald919497e2003-01-19 16:23:59 +000018class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000019
Walter Dörwald919497e2003-01-19 16:23:59 +000020 def __init__(self, max):
21 self.max = max
22 self.sofar = []
23
24 def __len__(self): return len(self.sofar)
25
26 def __getitem__(self, i):
27 if not 0 <= i < self.max: raise IndexError
28 n = len(self.sofar)
29 while n <= i:
30 self.sofar.append(n*n)
31 n += 1
32 return self.sofar[i]
33
34class StrSquares:
35
36 def __init__(self, max):
37 self.max = max
38 self.sofar = []
39
40 def __len__(self):
41 return len(self.sofar)
42
43 def __getitem__(self, i):
44 if not 0 <= i < self.max:
45 raise IndexError
46 n = len(self.sofar)
47 while n <= i:
48 self.sofar.append(str(n*n))
49 n += 1
50 return self.sofar[i]
51
52class BitBucket:
53 def write(self, line):
54 pass
55
56L = [
57 ('0', 0),
58 ('1', 1),
59 ('9', 9),
60 ('10', 10),
61 ('99', 99),
62 ('100', 100),
63 ('314', 314),
64 (' 314', 314),
65 ('314 ', 314),
66 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000067 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000068 (' 1x', ValueError),
69 (' 1 ', 1),
70 (' 1\02 ', ValueError),
71 ('', ValueError),
72 (' ', ValueError),
73 (' \t\t ', ValueError)
74]
75if have_unicode:
76 L += [
77 (unicode('0'), 0),
78 (unicode('1'), 1),
79 (unicode('9'), 9),
80 (unicode('10'), 10),
81 (unicode('99'), 99),
82 (unicode('100'), 100),
83 (unicode('314'), 314),
84 (unicode(' 314'), 314),
85 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
86 (unicode(' \t\t 314 \t\t '), 314),
87 (unicode(' 1x'), ValueError),
88 (unicode(' 1 '), 1),
89 (unicode(' 1\02 '), ValueError),
90 (unicode(''), ValueError),
91 (unicode(' '), ValueError),
92 (unicode(' \t\t '), ValueError),
93 (unichr(0x200), ValueError),
94]
95
Raymond Hettinger96229b12005-03-11 06:49:40 +000096class TestFailingBool:
97 def __nonzero__(self):
98 raise RuntimeError
99
100class TestFailingIter:
101 def __iter__(self):
102 raise RuntimeError
103
Walter Dörwald919497e2003-01-19 16:23:59 +0000104class BuiltinTest(unittest.TestCase):
105
106 def test_import(self):
107 __import__('sys')
108 __import__('time')
109 __import__('string')
110 self.assertRaises(ImportError, __import__, 'spamspam')
111 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +0000112 self.assertRaises(ValueError, __import__, '')
Walter Dörwald919497e2003-01-19 16:23:59 +0000113
114 def test_abs(self):
115 # int
116 self.assertEqual(abs(0), 0)
117 self.assertEqual(abs(1234), 1234)
118 self.assertEqual(abs(-1234), 1234)
119 # float
120 self.assertEqual(abs(0.0), 0.0)
121 self.assertEqual(abs(3.14), 3.14)
122 self.assertEqual(abs(-3.14), 3.14)
123 # long
124 self.assertEqual(abs(0L), 0L)
125 self.assertEqual(abs(1234L), 1234L)
126 self.assertEqual(abs(-1234L), 1234L)
127 # str
128 self.assertRaises(TypeError, abs, 'a')
129
Raymond Hettinger96229b12005-03-11 06:49:40 +0000130 def test_all(self):
131 self.assertEqual(all([2, 4, 6]), True)
132 self.assertEqual(all([2, None, 6]), False)
133 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
134 self.assertRaises(RuntimeError, all, TestFailingIter())
135 self.assertRaises(TypeError, all, 10) # Non-iterable
136 self.assertRaises(TypeError, all) # No args
137 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
138 self.assertEqual(all([]), True) # Empty iterator
139 S = [50, 60]
140 self.assertEqual(all(x > 42 for x in S), True)
141 S = [50, 40, 60]
142 self.assertEqual(all(x > 42 for x in S), False)
143
144 def test_any(self):
145 self.assertEqual(any([None, None, None]), False)
146 self.assertEqual(any([None, 4, None]), True)
147 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
148 self.assertRaises(RuntimeError, all, TestFailingIter())
149 self.assertRaises(TypeError, any, 10) # Non-iterable
150 self.assertRaises(TypeError, any) # No args
151 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
152 self.assertEqual(any([]), False) # Empty iterator
153 S = [40, 60, 30]
154 self.assertEqual(any(x > 42 for x in S), True)
155 S = [10, 20, 30]
156 self.assertEqual(any(x > 42 for x in S), False)
157
Walter Dörwald919497e2003-01-19 16:23:59 +0000158 def test_apply(self):
159 def f0(*args):
160 self.assertEqual(args, ())
161 def f1(a1):
162 self.assertEqual(a1, 1)
163 def f2(a1, a2):
164 self.assertEqual(a1, 1)
165 self.assertEqual(a2, 2)
166 def f3(a1, a2, a3):
167 self.assertEqual(a1, 1)
168 self.assertEqual(a2, 2)
169 self.assertEqual(a3, 3)
170 apply(f0, ())
171 apply(f1, (1,))
172 apply(f2, (1, 2))
173 apply(f3, (1, 2, 3))
174
175 # A PyCFunction that takes only positional parameters should allow an
176 # empty keyword dictionary to pass without a complaint, but raise a
177 # TypeError if the dictionary is non-empty.
178 apply(id, (1,), {})
179 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
180 self.assertRaises(TypeError, apply)
181 self.assertRaises(TypeError, apply, id, 42)
182 self.assertRaises(TypeError, apply, id, (42,), 42)
183
184 def test_callable(self):
185 self.assert_(callable(len))
186 def f(): pass
187 self.assert_(callable(f))
188 class C:
189 def meth(self): pass
190 self.assert_(callable(C))
191 x = C()
192 self.assert_(callable(x.meth))
193 self.assert_(not callable(x))
194 class D(C):
195 def __call__(self): pass
196 y = D()
197 self.assert_(callable(y))
198 y()
199
200 def test_chr(self):
201 self.assertEqual(chr(32), ' ')
202 self.assertEqual(chr(65), 'A')
203 self.assertEqual(chr(97), 'a')
204 self.assertEqual(chr(0xff), '\xff')
205 self.assertRaises(ValueError, chr, 256)
206 self.assertRaises(TypeError, chr)
207
208 def test_cmp(self):
209 self.assertEqual(cmp(-1, 1), -1)
210 self.assertEqual(cmp(1, -1), 1)
211 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000212 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 a = []; a.append(a)
214 b = []; b.append(b)
215 from UserList import UserList
216 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000217 self.assertRaises(RuntimeError, cmp, a, b)
218 self.assertRaises(RuntimeError, cmp, b, c)
219 self.assertRaises(RuntimeError, cmp, c, a)
220 self.assertRaises(RuntimeError, cmp, a, c)
221 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000222 a.pop(); b.pop(); c.pop()
223 self.assertRaises(TypeError, cmp)
224
225 def test_coerce(self):
226 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
227 self.assertEqual(coerce(1, 1L), (1L, 1L))
228 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
229 self.assertRaises(TypeError, coerce)
230 class BadNumber:
231 def __coerce__(self, other):
232 raise ValueError
233 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000234 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000235
236 def test_compile(self):
237 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000238 bom = '\xef\xbb\xbf'
239 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000240 self.assertRaises(TypeError, compile)
241 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
242 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000243 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000244 if have_unicode:
245 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000246 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
247 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000248
Walter Dörwald919497e2003-01-19 16:23:59 +0000249 def test_delattr(self):
250 import sys
251 sys.spam = 1
252 delattr(sys, 'spam')
253 self.assertRaises(TypeError, delattr)
254
255 def test_dir(self):
256 x = 1
257 self.assert_('x' in dir())
258 import sys
259 self.assert_('modules' in dir(sys))
260 self.assertRaises(TypeError, dir, 42, 42)
261
262 def test_divmod(self):
263 self.assertEqual(divmod(12, 7), (1, 5))
264 self.assertEqual(divmod(-12, 7), (-2, 2))
265 self.assertEqual(divmod(12, -7), (-2, -2))
266 self.assertEqual(divmod(-12, -7), (1, -5))
267
268 self.assertEqual(divmod(12L, 7L), (1L, 5L))
269 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
270 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
271 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
272
273 self.assertEqual(divmod(12, 7L), (1, 5L))
274 self.assertEqual(divmod(-12, 7L), (-2, 2L))
275 self.assertEqual(divmod(12L, -7), (-2L, -2))
276 self.assertEqual(divmod(-12L, -7), (1L, -5))
277
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000278 self.assertEqual(divmod(-sys.maxint-1, -1),
279 (sys.maxint+1, 0))
280
Walter Dörwald919497e2003-01-19 16:23:59 +0000281 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
282 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
283 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
284 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
285
286 self.assertRaises(TypeError, divmod)
287
288 def test_eval(self):
289 self.assertEqual(eval('1+1'), 2)
290 self.assertEqual(eval(' 1+1\n'), 2)
291 globals = {'a': 1, 'b': 2}
292 locals = {'b': 200, 'c': 300}
293 self.assertEqual(eval('a', globals) , 1)
294 self.assertEqual(eval('a', globals, locals), 1)
295 self.assertEqual(eval('b', globals, locals), 200)
296 self.assertEqual(eval('c', globals, locals), 300)
297 if have_unicode:
298 self.assertEqual(eval(unicode('1+1')), 2)
299 self.assertEqual(eval(unicode(' 1+1\n')), 2)
300 globals = {'a': 1, 'b': 2}
301 locals = {'b': 200, 'c': 300}
302 if have_unicode:
303 self.assertEqual(eval(unicode('a'), globals), 1)
304 self.assertEqual(eval(unicode('a'), globals, locals), 1)
305 self.assertEqual(eval(unicode('b'), globals, locals), 200)
306 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000307 bom = '\xef\xbb\xbf'
308 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000309 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
310 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000311 self.assertRaises(TypeError, eval)
312 self.assertRaises(TypeError, eval, ())
313
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000314 def test_general_eval(self):
315 # Tests that general mappings can be used for the locals argument
316
317 class M:
318 "Test mapping interface versus possible calls from eval()."
319 def __getitem__(self, key):
320 if key == 'a':
321 return 12
322 raise KeyError
323 def keys(self):
324 return list('xyz')
325
326 m = M()
327 g = globals()
328 self.assertEqual(eval('a', g, m), 12)
329 self.assertRaises(NameError, eval, 'b', g, m)
330 self.assertEqual(eval('dir()', g, m), list('xyz'))
331 self.assertEqual(eval('globals()', g, m), g)
332 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000333 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000334 class A:
335 "Non-mapping"
336 pass
337 m = A()
338 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000339
340 # Verify that dict subclasses work as well
341 class D(dict):
342 def __getitem__(self, key):
343 if key == 'a':
344 return 12
345 return dict.__getitem__(self, key)
346 def keys(self):
347 return list('xyz')
348
349 d = D()
350 self.assertEqual(eval('a', g, d), 12)
351 self.assertRaises(NameError, eval, 'b', g, d)
352 self.assertEqual(eval('dir()', g, d), list('xyz'))
353 self.assertEqual(eval('globals()', g, d), g)
354 self.assertEqual(eval('locals()', g, d), d)
355
356 # Verify locals stores (used by list comps)
357 eval('[locals() for i in (2,3)]', g, d)
358 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
359
360 class SpreadSheet:
361 "Sample application showing nested, calculated lookups."
362 _cells = {}
363 def __setitem__(self, key, formula):
364 self._cells[key] = formula
365 def __getitem__(self, key ):
366 return eval(self._cells[key], globals(), self)
367
368 ss = SpreadSheet()
369 ss['a1'] = '5'
370 ss['a2'] = 'a1*6'
371 ss['a3'] = 'a2*7'
372 self.assertEqual(ss['a3'], 210)
373
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000374 # Verify that dir() catches a non-list returned by eval
375 # SF bug #1004669
376 class C:
377 def __getitem__(self, item):
378 raise KeyError(item)
379 def keys(self):
380 return 'a'
381 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
382
Walter Dörwald919497e2003-01-19 16:23:59 +0000383 # Done outside of the method test_z to get the correct scope
384 z = 0
385 f = open(TESTFN, 'w')
386 f.write('z = z+1\n')
387 f.write('z = z*2\n')
388 f.close()
389 execfile(TESTFN)
390
391 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000392 global numruns
393 if numruns:
394 return
395 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000396
Walter Dörwald919497e2003-01-19 16:23:59 +0000397 globals = {'a': 1, 'b': 2}
398 locals = {'b': 200, 'c': 300}
399
400 self.assertEqual(self.__class__.z, 2)
401 globals['z'] = 0
402 execfile(TESTFN, globals)
403 self.assertEqual(globals['z'], 2)
404 locals['z'] = 0
405 execfile(TESTFN, globals, locals)
406 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000407
408 class M:
409 "Test mapping interface versus possible calls from execfile()."
410 def __init__(self):
411 self.z = 10
412 def __getitem__(self, key):
413 if key == 'z':
414 return self.z
415 raise KeyError
416 def __setitem__(self, key, value):
417 if key == 'z':
418 self.z = value
419 return
420 raise KeyError
421
422 locals = M()
423 locals['z'] = 0
424 execfile(TESTFN, globals, locals)
425 self.assertEqual(locals['z'], 2)
426
Walter Dörwald919497e2003-01-19 16:23:59 +0000427 unlink(TESTFN)
428 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000429 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000430 import os
431 self.assertRaises(IOError, execfile, os.curdir)
432 self.assertRaises(IOError, execfile, "I_dont_exist")
433
434 def test_filter(self):
435 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
436 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
437 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
438 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
439 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
440 def identity(item):
441 return 1
442 filter(identity, Squares(5))
443 self.assertRaises(TypeError, filter)
444 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000445 def __getitem__(self, index):
446 if index<4:
447 return 42
448 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000449 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
450 def badfunc():
451 pass
452 self.assertRaises(TypeError, filter, badfunc, range(5))
453
Walter Dörwaldbf517072003-01-27 15:57:14 +0000454 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000455 self.assertEqual(filter(None, (1, 2)), (1, 2))
456 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
457 self.assertRaises(TypeError, filter, 42, (1, 2))
458
Walter Dörwaldbf517072003-01-27 15:57:14 +0000459 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000460 self.assertEqual(filter(None, "12"), "12")
461 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
462 self.assertRaises(TypeError, filter, 42, "12")
463 class badstr(str):
464 def __getitem__(self, index):
465 raise ValueError
466 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000467
Walter Dörwald903f1e02003-02-04 16:28:00 +0000468 class badstr2(str):
469 def __getitem__(self, index):
470 return 42
471 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
472
473 class weirdstr(str):
474 def __getitem__(self, index):
475 return weirdstr(2*str.__getitem__(self, index))
476 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
477
Walter Dörwald5e61e242003-02-04 17:04:01 +0000478 class shiftstr(str):
479 def __getitem__(self, index):
480 return chr(ord(str.__getitem__(self, index))+1)
481 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
482
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000483 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000484 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000485 self.assertEqual(filter(None, unicode("12")), unicode("12"))
486 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
487 self.assertRaises(TypeError, filter, 42, unicode("12"))
488 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000489
Walter Dörwald903f1e02003-02-04 16:28:00 +0000490 class badunicode(unicode):
491 def __getitem__(self, index):
492 return 42
493 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
494
495 class weirdunicode(unicode):
496 def __getitem__(self, index):
497 return weirdunicode(2*unicode.__getitem__(self, index))
498 self.assertEqual(
499 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
500
Walter Dörwald5e61e242003-02-04 17:04:01 +0000501 class shiftunicode(unicode):
502 def __getitem__(self, index):
503 return unichr(ord(unicode.__getitem__(self, index))+1)
504 self.assertEqual(
505 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
506 unicode("345")
507 )
508
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000509 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000510 # test that filter() never returns tuple, str or unicode subclasses
511 # and that the result always goes through __getitem__
512 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000513 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000514 def __getitem__(self, index):
515 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000516 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000517 def __getitem__(self, index):
518 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000519 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000520 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000521 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000522 }
523 if have_unicode:
524 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000525 def __getitem__(self, index):
526 return 2*unicode.__getitem__(self, index)
527 inputs[unicode2] = {
528 unicode(): unicode(),
529 unicode("123"): unicode("112233")
530 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000531
Walter Dörwald1918f772003-02-10 13:19:13 +0000532 for (cls, inps) in inputs.iteritems():
533 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000534 # make sure the output goes through __getitem__
535 # even if func is None
536 self.assertEqual(
537 filter(funcs[0], cls(inp)),
538 filter(funcs[1], cls(inp))
539 )
540 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000541 outp = filter(func, cls(inp))
542 self.assertEqual(outp, exp)
543 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000544
Walter Dörwald919497e2003-01-19 16:23:59 +0000545 def test_float(self):
546 self.assertEqual(float(3.14), 3.14)
547 self.assertEqual(float(314), 314.0)
548 self.assertEqual(float(314L), 314.0)
549 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000550 self.assertRaises(ValueError, float, " 0x3.1 ")
551 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000552 if have_unicode:
553 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
554 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000555 # Implementation limitation in PyFloat_FromString()
556 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000557
Georg Brandlde9b6242006-04-30 11:13:56 +0000558 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000559 def test_float_with_comma(self):
560 # set locale to something that doesn't use '.' for the decimal point
Georg Brandlde9b6242006-04-30 11:13:56 +0000561 import locale
562 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000563 return
564
Georg Brandlde9b6242006-04-30 11:13:56 +0000565 self.assertEqual(float(" 3,14 "), 3.14)
566 self.assertEqual(float(" +3,14 "), 3.14)
567 self.assertEqual(float(" -3,14 "), -3.14)
568 self.assertRaises(ValueError, float, " 0x3.1 ")
569 self.assertRaises(ValueError, float, " -0x3.p-1 ")
570 self.assertEqual(float(" 25.e-1 "), 2.5)
571 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000572
Brett Cannonc3647ac2005-04-26 03:45:26 +0000573 def test_floatconversion(self):
574 # Make sure that calls to __float__() work properly
575 class Foo0:
576 def __float__(self):
577 return 42.
578
579 class Foo1(object):
580 def __float__(self):
581 return 42.
582
583 class Foo2(float):
584 def __float__(self):
585 return 42.
586
587 class Foo3(float):
588 def __new__(cls, value=0.):
589 return float.__new__(cls, 2*value)
590
591 def __float__(self):
592 return self
593
594 class Foo4(float):
595 def __float__(self):
596 return 42
597
598 self.assertAlmostEqual(float(Foo0()), 42.)
599 self.assertAlmostEqual(float(Foo1()), 42.)
600 self.assertAlmostEqual(float(Foo2()), 42.)
601 self.assertAlmostEqual(float(Foo3(21)), 42.)
602 self.assertRaises(TypeError, float, Foo4(42))
603
Walter Dörwald919497e2003-01-19 16:23:59 +0000604 def test_getattr(self):
605 import sys
606 self.assert_(getattr(sys, 'stdout') is sys.stdout)
607 self.assertRaises(TypeError, getattr, sys, 1)
608 self.assertRaises(TypeError, getattr, sys, 1, "foo")
609 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000610 if have_unicode:
611 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000612
613 def test_hasattr(self):
614 import sys
615 self.assert_(hasattr(sys, 'stdout'))
616 self.assertRaises(TypeError, hasattr, sys, 1)
617 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000618 if have_unicode:
619 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000620
621 def test_hash(self):
622 hash(None)
623 self.assertEqual(hash(1), hash(1L))
624 self.assertEqual(hash(1), hash(1.0))
625 hash('spam')
626 if have_unicode:
627 self.assertEqual(hash('spam'), hash(unicode('spam')))
628 hash((0,1,2,3))
629 def f(): pass
630 self.assertRaises(TypeError, hash, [])
631 self.assertRaises(TypeError, hash, {})
632
633 def test_hex(self):
634 self.assertEqual(hex(16), '0x10')
635 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000636 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000637 self.assertEqual(hex(-16L), '-0x10L')
638 self.assertRaises(TypeError, hex, {})
639
640 def test_id(self):
641 id(None)
642 id(1)
643 id(1L)
644 id(1.0)
645 id('spam')
646 id((0,1,2,3))
647 id([0,1,2,3])
648 id({'spam': 1, 'eggs': 2, 'ham': 3})
649
650 # Test input() later, together with raw_input
651
652 def test_int(self):
653 self.assertEqual(int(314), 314)
654 self.assertEqual(int(3.14), 3)
655 self.assertEqual(int(314L), 314)
656 # Check that conversion from float truncates towards zero
657 self.assertEqual(int(-3.14), -3)
658 self.assertEqual(int(3.9), 3)
659 self.assertEqual(int(-3.9), -3)
660 self.assertEqual(int(3.5), 3)
661 self.assertEqual(int(-3.5), -3)
662 # Different base:
663 self.assertEqual(int("10",16), 16L)
664 if have_unicode:
665 self.assertEqual(int(unicode("10"),16), 16L)
666 # Test conversion from strings and various anomalies
667 for s, v in L:
668 for sign in "", "+", "-":
669 for prefix in "", " ", "\t", " \t\t ":
670 ss = prefix + sign + s
671 vv = v
672 if sign == "-" and v is not ValueError:
673 vv = -v
674 try:
675 self.assertEqual(int(ss), vv)
676 except v:
677 pass
678
Walter Dörwald70a6b492004-02-12 17:35:32 +0000679 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 self.assertEqual(int(s)+1, -sys.maxint)
681 # should return long
682 int(s[1:])
683
684 # should return long
685 x = int(1e100)
686 self.assert_(isinstance(x, long))
687 x = int(-1e100)
688 self.assert_(isinstance(x, long))
689
690
691 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
692 # Worked by accident in Windows release build, but failed in debug build.
693 # Failed in all Linux builds.
694 x = -1-sys.maxint
695 self.assertEqual(x >> 1, x//2)
696
697 self.assertRaises(ValueError, int, '123\0')
698 self.assertRaises(ValueError, int, '53', 40)
699
700 x = int('1' * 600)
701 self.assert_(isinstance(x, long))
702
703 if have_unicode:
704 x = int(unichr(0x661) * 600)
705 self.assert_(isinstance(x, long))
706
707 self.assertRaises(TypeError, int, 1, 12)
708
709 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000710 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000711
Tim Petersb713ec22006-05-23 18:45:30 +0000712 # SF bug 1334662: int(string, base) wrong answers
713 # Various representations of 2**32 evaluated to 0
714 # rather than 2**32 in previous versions
715
716 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
717 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
718 self.assertEqual(int('10000000000000000', 4), 4294967296L)
719 self.assertEqual(int('32244002423141', 5), 4294967296L)
720 self.assertEqual(int('1550104015504', 6), 4294967296L)
721 self.assertEqual(int('211301422354', 7), 4294967296L)
722 self.assertEqual(int('40000000000', 8), 4294967296L)
723 self.assertEqual(int('12068657454', 9), 4294967296L)
724 self.assertEqual(int('4294967296', 10), 4294967296L)
725 self.assertEqual(int('1904440554', 11), 4294967296L)
726 self.assertEqual(int('9ba461594', 12), 4294967296L)
727 self.assertEqual(int('535a79889', 13), 4294967296L)
728 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
729 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
730 self.assertEqual(int('100000000', 16), 4294967296L)
731 self.assertEqual(int('a7ffda91', 17), 4294967296L)
732 self.assertEqual(int('704he7g4', 18), 4294967296L)
733 self.assertEqual(int('4f5aff66', 19), 4294967296L)
734 self.assertEqual(int('3723ai4g', 20), 4294967296L)
735 self.assertEqual(int('281d55i4', 21), 4294967296L)
736 self.assertEqual(int('1fj8b184', 22), 4294967296L)
737 self.assertEqual(int('1606k7ic', 23), 4294967296L)
738 self.assertEqual(int('mb994ag', 24), 4294967296L)
739 self.assertEqual(int('hek2mgl', 25), 4294967296L)
740 self.assertEqual(int('dnchbnm', 26), 4294967296L)
741 self.assertEqual(int('b28jpdm', 27), 4294967296L)
742 self.assertEqual(int('8pfgih4', 28), 4294967296L)
743 self.assertEqual(int('76beigg', 29), 4294967296L)
744 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
745 self.assertEqual(int('4q0jto4', 31), 4294967296L)
746 self.assertEqual(int('4000000', 32), 4294967296L)
747 self.assertEqual(int('3aokq94', 33), 4294967296L)
748 self.assertEqual(int('2qhxjli', 34), 4294967296L)
749 self.assertEqual(int('2br45qb', 35), 4294967296L)
750 self.assertEqual(int('1z141z4', 36), 4294967296L)
751
752 # SF bug 1334662: int(string, base) wrong answers
753 # Checks for proper evaluation of 2**32 + 1
754 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
755 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
756 self.assertEqual(int('10000000000000001', 4), 4294967297L)
757 self.assertEqual(int('32244002423142', 5), 4294967297L)
758 self.assertEqual(int('1550104015505', 6), 4294967297L)
759 self.assertEqual(int('211301422355', 7), 4294967297L)
760 self.assertEqual(int('40000000001', 8), 4294967297L)
761 self.assertEqual(int('12068657455', 9), 4294967297L)
762 self.assertEqual(int('4294967297', 10), 4294967297L)
763 self.assertEqual(int('1904440555', 11), 4294967297L)
764 self.assertEqual(int('9ba461595', 12), 4294967297L)
765 self.assertEqual(int('535a7988a', 13), 4294967297L)
766 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
767 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
768 self.assertEqual(int('100000001', 16), 4294967297L)
769 self.assertEqual(int('a7ffda92', 17), 4294967297L)
770 self.assertEqual(int('704he7g5', 18), 4294967297L)
771 self.assertEqual(int('4f5aff67', 19), 4294967297L)
772 self.assertEqual(int('3723ai4h', 20), 4294967297L)
773 self.assertEqual(int('281d55i5', 21), 4294967297L)
774 self.assertEqual(int('1fj8b185', 22), 4294967297L)
775 self.assertEqual(int('1606k7id', 23), 4294967297L)
776 self.assertEqual(int('mb994ah', 24), 4294967297L)
777 self.assertEqual(int('hek2mgm', 25), 4294967297L)
778 self.assertEqual(int('dnchbnn', 26), 4294967297L)
779 self.assertEqual(int('b28jpdn', 27), 4294967297L)
780 self.assertEqual(int('8pfgih5', 28), 4294967297L)
781 self.assertEqual(int('76beigh', 29), 4294967297L)
782 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
783 self.assertEqual(int('4q0jto5', 31), 4294967297L)
784 self.assertEqual(int('4000001', 32), 4294967297L)
785 self.assertEqual(int('3aokq95', 33), 4294967297L)
786 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
787 self.assertEqual(int('2br45qc', 35), 4294967297L)
788 self.assertEqual(int('1z141z5', 36), 4294967297L)
789
Brett Cannonc3647ac2005-04-26 03:45:26 +0000790 def test_intconversion(self):
791 # Test __int__()
792 class Foo0:
793 def __int__(self):
794 return 42
795
796 class Foo1(object):
797 def __int__(self):
798 return 42
799
800 class Foo2(int):
801 def __int__(self):
802 return 42
803
804 class Foo3(int):
805 def __int__(self):
806 return self
807
808 class Foo4(int):
809 def __int__(self):
810 return 42L
811
812 class Foo5(int):
813 def __int__(self):
814 return 42.
815
816 self.assertEqual(int(Foo0()), 42)
817 self.assertEqual(int(Foo1()), 42)
818 self.assertEqual(int(Foo2()), 42)
819 self.assertEqual(int(Foo3()), 0)
820 self.assertEqual(int(Foo4()), 42L)
821 self.assertRaises(TypeError, int, Foo5())
822
Walter Dörwald919497e2003-01-19 16:23:59 +0000823 def test_intern(self):
824 self.assertRaises(TypeError, intern)
825 s = "never interned before"
826 self.assert_(intern(s) is s)
827 s2 = s.swapcase().swapcase()
828 self.assert_(intern(s2) is s)
829
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000830 # Subclasses of string can't be interned, because they
831 # provide too much opportunity for insane things to happen.
832 # We don't want them in the interned dict and if they aren't
833 # actually interned, we don't want to create the appearance
834 # that they are by allowing intern() to succeeed.
835 class S(str):
836 def __hash__(self):
837 return 123
838
839 self.assertRaises(TypeError, intern, S("abc"))
840
841 # It's still safe to pass these strings to routines that
842 # call intern internally, e.g. PyObject_SetAttr().
843 s = S("abc")
844 setattr(s, s, s)
845 self.assertEqual(getattr(s, s), s)
846
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 def test_iter(self):
848 self.assertRaises(TypeError, iter)
849 self.assertRaises(TypeError, iter, 42, 42)
850 lists = [("1", "2"), ["1", "2"], "12"]
851 if have_unicode:
852 lists.append(unicode("12"))
853 for l in lists:
854 i = iter(l)
855 self.assertEqual(i.next(), '1')
856 self.assertEqual(i.next(), '2')
857 self.assertRaises(StopIteration, i.next)
858
859 def test_isinstance(self):
860 class C:
861 pass
862 class D(C):
863 pass
864 class E:
865 pass
866 c = C()
867 d = D()
868 e = E()
869 self.assert_(isinstance(c, C))
870 self.assert_(isinstance(d, C))
871 self.assert_(not isinstance(e, C))
872 self.assert_(not isinstance(c, D))
873 self.assert_(not isinstance('foo', E))
874 self.assertRaises(TypeError, isinstance, E, 'foo')
875 self.assertRaises(TypeError, isinstance)
876
877 def test_issubclass(self):
878 class C:
879 pass
880 class D(C):
881 pass
882 class E:
883 pass
884 c = C()
885 d = D()
886 e = E()
887 self.assert_(issubclass(D, C))
888 self.assert_(issubclass(C, C))
889 self.assert_(not issubclass(C, D))
890 self.assertRaises(TypeError, issubclass, 'foo', E)
891 self.assertRaises(TypeError, issubclass, E, 'foo')
892 self.assertRaises(TypeError, issubclass)
893
894 def test_len(self):
895 self.assertEqual(len('123'), 3)
896 self.assertEqual(len(()), 0)
897 self.assertEqual(len((1, 2, 3, 4)), 4)
898 self.assertEqual(len([1, 2, 3, 4]), 4)
899 self.assertEqual(len({}), 0)
900 self.assertEqual(len({'a':1, 'b': 2}), 2)
901 class BadSeq:
902 def __len__(self):
903 raise ValueError
904 self.assertRaises(ValueError, len, BadSeq())
905
906 def test_list(self):
907 self.assertEqual(list([]), [])
908 l0_3 = [0, 1, 2, 3]
909 l0_3_bis = list(l0_3)
910 self.assertEqual(l0_3, l0_3_bis)
911 self.assert_(l0_3 is not l0_3_bis)
912 self.assertEqual(list(()), [])
913 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
914 self.assertEqual(list(''), [])
915 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
916
917 if sys.maxint == 0x7fffffff:
918 # This test can currently only work on 32-bit machines.
919 # XXX If/when PySequence_Length() returns a ssize_t, it should be
920 # XXX re-enabled.
921 # Verify clearing of bug #556025.
922 # This assumes that the max data size (sys.maxint) == max
923 # address size this also assumes that the address size is at
924 # least 4 bytes with 8 byte addresses, the bug is not well
925 # tested
926 #
927 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
928 # earlier due to a newlib bug. See the following mailing list
929 # thread for the details:
930
931 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
932 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
933
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000934 # This code used to segfault in Py2.4a3
935 x = []
936 x.extend(-y for y in x)
937 self.assertEqual(x, [])
938
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 def test_long(self):
940 self.assertEqual(long(314), 314L)
941 self.assertEqual(long(3.14), 3L)
942 self.assertEqual(long(314L), 314L)
943 # Check that conversion from float truncates towards zero
944 self.assertEqual(long(-3.14), -3L)
945 self.assertEqual(long(3.9), 3L)
946 self.assertEqual(long(-3.9), -3L)
947 self.assertEqual(long(3.5), 3L)
948 self.assertEqual(long(-3.5), -3L)
949 self.assertEqual(long("-3"), -3L)
950 if have_unicode:
951 self.assertEqual(long(unicode("-3")), -3L)
952 # Different base:
953 self.assertEqual(long("10",16), 16L)
954 if have_unicode:
955 self.assertEqual(long(unicode("10"),16), 16L)
956 # Check conversions from string (same test set as for int(), and then some)
957 LL = [
958 ('1' + '0'*20, 10L**20),
959 ('1' + '0'*100, 10L**100)
960 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000961 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 if have_unicode:
963 L2 += [
964 (unicode('1') + unicode('0')*20, 10L**20),
965 (unicode('1') + unicode('0')*100, 10L**100),
966 ]
967 for s, v in L2 + LL:
968 for sign in "", "+", "-":
969 for prefix in "", " ", "\t", " \t\t ":
970 ss = prefix + sign + s
971 vv = v
972 if sign == "-" and v is not ValueError:
973 vv = -v
974 try:
975 self.assertEqual(long(ss), long(vv))
976 except v:
977 pass
978
979 self.assertRaises(ValueError, long, '123\0')
980 self.assertRaises(ValueError, long, '53', 40)
981 self.assertRaises(TypeError, long, 1, 12)
982
Brett Cannonc3647ac2005-04-26 03:45:26 +0000983 def test_longconversion(self):
984 # Test __long__()
985 class Foo0:
986 def __long__(self):
987 return 42L
988
989 class Foo1(object):
990 def __long__(self):
991 return 42L
992
993 class Foo2(long):
994 def __long__(self):
995 return 42L
996
997 class Foo3(long):
998 def __long__(self):
999 return self
1000
1001 class Foo4(long):
1002 def __long__(self):
1003 return 42
1004
1005 class Foo5(long):
1006 def __long__(self):
1007 return 42.
1008
1009 self.assertEqual(long(Foo0()), 42L)
1010 self.assertEqual(long(Foo1()), 42L)
1011 self.assertEqual(long(Foo2()), 42L)
1012 self.assertEqual(long(Foo3()), 0)
1013 self.assertEqual(long(Foo4()), 42)
1014 self.assertRaises(TypeError, long, Foo5())
1015
Walter Dörwald919497e2003-01-19 16:23:59 +00001016 def test_map(self):
1017 self.assertEqual(
1018 map(None, 'hello world'),
1019 ['h','e','l','l','o',' ','w','o','r','l','d']
1020 )
1021 self.assertEqual(
1022 map(None, 'abcd', 'efg'),
1023 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1024 )
1025 self.assertEqual(
1026 map(None, range(10)),
1027 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1028 )
1029 self.assertEqual(
1030 map(lambda x: x*x, range(1,4)),
1031 [1, 4, 9]
1032 )
1033 try:
1034 from math import sqrt
1035 except ImportError:
1036 def sqrt(x):
1037 return pow(x, 0.5)
1038 self.assertEqual(
1039 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1040 [[4.0, 2.0], [9.0, 3.0]]
1041 )
1042 self.assertEqual(
1043 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1044 [10, 4, 6]
1045 )
1046
1047 def plus(*v):
1048 accu = 0
1049 for i in v: accu = accu + i
1050 return accu
1051 self.assertEqual(
1052 map(plus, [1, 3, 7]),
1053 [1, 3, 7]
1054 )
1055 self.assertEqual(
1056 map(plus, [1, 3, 7], [4, 9, 2]),
1057 [1+4, 3+9, 7+2]
1058 )
1059 self.assertEqual(
1060 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1061 [1+4+1, 3+9+1, 7+2+0]
1062 )
1063 self.assertEqual(
1064 map(None, Squares(10)),
1065 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1066 )
1067 self.assertEqual(
1068 map(int, Squares(10)),
1069 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1070 )
1071 self.assertEqual(
1072 map(None, Squares(3), Squares(2)),
1073 [(0,0), (1,1), (4,None)]
1074 )
1075 self.assertEqual(
1076 map(max, Squares(3), Squares(2)),
1077 [0, 1, 4]
1078 )
1079 self.assertRaises(TypeError, map)
1080 self.assertRaises(TypeError, map, lambda x: x, 42)
1081 self.assertEqual(map(None, [42]), [42])
1082 class BadSeq:
1083 def __getitem__(self, index):
1084 raise ValueError
1085 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001086 def badfunc(x):
1087 raise RuntimeError
1088 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001089
1090 def test_max(self):
1091 self.assertEqual(max('123123'), '3')
1092 self.assertEqual(max(1, 2, 3), 3)
1093 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1094 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1095
1096 self.assertEqual(max(1, 2L, 3.0), 3.0)
1097 self.assertEqual(max(1L, 2.0, 3), 3)
1098 self.assertEqual(max(1.0, 2, 3L), 3L)
1099
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001100 for stmt in (
1101 "max(key=int)", # no args
1102 "max(1, key=int)", # single arg not iterable
1103 "max(1, 2, keystone=int)", # wrong keyword
1104 "max(1, 2, key=int, abc=int)", # two many keywords
1105 "max(1, 2, key=1)", # keyfunc is not callable
1106 ):
Tim Peters7f061872004-12-07 21:17:46 +00001107 try:
1108 exec(stmt) in globals()
1109 except TypeError:
1110 pass
1111 else:
1112 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001113
1114 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1115 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1116 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1117
1118 data = [random.randrange(200) for i in range(100)]
1119 keys = dict((elem, random.randrange(50)) for elem in data)
1120 f = keys.__getitem__
1121 self.assertEqual(max(data, key=f),
1122 sorted(reversed(data), key=f)[-1])
1123
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 def test_min(self):
1125 self.assertEqual(min('123123'), '1')
1126 self.assertEqual(min(1, 2, 3), 1)
1127 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1128 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1129
1130 self.assertEqual(min(1, 2L, 3.0), 1)
1131 self.assertEqual(min(1L, 2.0, 3), 1L)
1132 self.assertEqual(min(1.0, 2, 3L), 1.0)
1133
1134 self.assertRaises(TypeError, min)
1135 self.assertRaises(TypeError, min, 42)
1136 self.assertRaises(ValueError, min, ())
1137 class BadSeq:
1138 def __getitem__(self, index):
1139 raise ValueError
1140 self.assertRaises(ValueError, min, BadSeq())
1141 class BadNumber:
1142 def __cmp__(self, other):
1143 raise ValueError
1144 self.assertRaises(ValueError, min, (42, BadNumber()))
1145
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001146 for stmt in (
1147 "min(key=int)", # no args
1148 "min(1, key=int)", # single arg not iterable
1149 "min(1, 2, keystone=int)", # wrong keyword
1150 "min(1, 2, key=int, abc=int)", # two many keywords
1151 "min(1, 2, key=1)", # keyfunc is not callable
1152 ):
Tim Peters7f061872004-12-07 21:17:46 +00001153 try:
1154 exec(stmt) in globals()
1155 except TypeError:
1156 pass
1157 else:
1158 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001159
1160 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1161 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1162 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1163
1164 data = [random.randrange(200) for i in range(100)]
1165 keys = dict((elem, random.randrange(50)) for elem in data)
1166 f = keys.__getitem__
1167 self.assertEqual(min(data, key=f),
1168 sorted(data, key=f)[0])
1169
Walter Dörwald919497e2003-01-19 16:23:59 +00001170 def test_oct(self):
1171 self.assertEqual(oct(100), '0144')
1172 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001173 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001174 self.assertEqual(oct(-100L), '-0144L')
1175 self.assertRaises(TypeError, oct, ())
1176
1177 def write_testfile(self):
1178 # NB the first 4 lines are also used to test input and raw_input, below
1179 fp = open(TESTFN, 'w')
1180 try:
1181 fp.write('1+1\n')
1182 fp.write('1+1\n')
1183 fp.write('The quick brown fox jumps over the lazy dog')
1184 fp.write('.\n')
1185 fp.write('Dear John\n')
1186 fp.write('XXX'*100)
1187 fp.write('YYY'*100)
1188 finally:
1189 fp.close()
1190
1191 def test_open(self):
1192 self.write_testfile()
1193 fp = open(TESTFN, 'r')
1194 try:
1195 self.assertEqual(fp.readline(4), '1+1\n')
1196 self.assertEqual(fp.readline(4), '1+1\n')
1197 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1198 self.assertEqual(fp.readline(4), 'Dear')
1199 self.assertEqual(fp.readline(100), ' John\n')
1200 self.assertEqual(fp.read(300), 'XXX'*100)
1201 self.assertEqual(fp.read(1000), 'YYY'*100)
1202 finally:
1203 fp.close()
1204 unlink(TESTFN)
1205
1206 def test_ord(self):
1207 self.assertEqual(ord(' '), 32)
1208 self.assertEqual(ord('A'), 65)
1209 self.assertEqual(ord('a'), 97)
1210 if have_unicode:
1211 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1212 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001213 if have_unicode:
1214 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001215
1216 def test_pow(self):
1217 self.assertEqual(pow(0,0), 1)
1218 self.assertEqual(pow(0,1), 0)
1219 self.assertEqual(pow(1,0), 1)
1220 self.assertEqual(pow(1,1), 1)
1221
1222 self.assertEqual(pow(2,0), 1)
1223 self.assertEqual(pow(2,10), 1024)
1224 self.assertEqual(pow(2,20), 1024*1024)
1225 self.assertEqual(pow(2,30), 1024*1024*1024)
1226
1227 self.assertEqual(pow(-2,0), 1)
1228 self.assertEqual(pow(-2,1), -2)
1229 self.assertEqual(pow(-2,2), 4)
1230 self.assertEqual(pow(-2,3), -8)
1231
1232 self.assertEqual(pow(0L,0), 1)
1233 self.assertEqual(pow(0L,1), 0)
1234 self.assertEqual(pow(1L,0), 1)
1235 self.assertEqual(pow(1L,1), 1)
1236
1237 self.assertEqual(pow(2L,0), 1)
1238 self.assertEqual(pow(2L,10), 1024)
1239 self.assertEqual(pow(2L,20), 1024*1024)
1240 self.assertEqual(pow(2L,30), 1024*1024*1024)
1241
1242 self.assertEqual(pow(-2L,0), 1)
1243 self.assertEqual(pow(-2L,1), -2)
1244 self.assertEqual(pow(-2L,2), 4)
1245 self.assertEqual(pow(-2L,3), -8)
1246
1247 self.assertAlmostEqual(pow(0.,0), 1.)
1248 self.assertAlmostEqual(pow(0.,1), 0.)
1249 self.assertAlmostEqual(pow(1.,0), 1.)
1250 self.assertAlmostEqual(pow(1.,1), 1.)
1251
1252 self.assertAlmostEqual(pow(2.,0), 1.)
1253 self.assertAlmostEqual(pow(2.,10), 1024.)
1254 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1255 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1256
1257 self.assertAlmostEqual(pow(-2.,0), 1.)
1258 self.assertAlmostEqual(pow(-2.,1), -2.)
1259 self.assertAlmostEqual(pow(-2.,2), 4.)
1260 self.assertAlmostEqual(pow(-2.,3), -8.)
1261
1262 for x in 2, 2L, 2.0:
1263 for y in 10, 10L, 10.0:
1264 for z in 1000, 1000L, 1000.0:
1265 if isinstance(x, float) or \
1266 isinstance(y, float) or \
1267 isinstance(z, float):
1268 self.assertRaises(TypeError, pow, x, y, z)
1269 else:
1270 self.assertAlmostEqual(pow(x, y, z), 24.0)
1271
1272 self.assertRaises(TypeError, pow, -1, -2, 3)
1273 self.assertRaises(ValueError, pow, 1, 2, 0)
1274 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1275 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1276 self.assertRaises(ValueError, pow, -342.43, 0.234)
1277
1278 self.assertRaises(TypeError, pow)
1279
1280 def test_range(self):
1281 self.assertEqual(range(3), [0, 1, 2])
1282 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1283 self.assertEqual(range(0), [])
1284 self.assertEqual(range(-3), [])
1285 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1286 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1287
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001288 # Now test range() with longs
1289 self.assertEqual(range(-2**100), [])
1290 self.assertEqual(range(0, -2**100), [])
1291 self.assertEqual(range(0, 2**100, -1), [])
1292 self.assertEqual(range(0, 2**100, -1), [])
1293
1294 a = long(10 * sys.maxint)
1295 b = long(100 * sys.maxint)
1296 c = long(50 * sys.maxint)
1297
1298 self.assertEqual(range(a, a+2), [a, a+1])
1299 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1300 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1301
1302 seq = range(a, b, c)
1303 self.assert_(a in seq)
1304 self.assert_(b not in seq)
1305 self.assertEqual(len(seq), 2)
1306
1307 seq = range(b, a, -c)
1308 self.assert_(b in seq)
1309 self.assert_(a not in seq)
1310 self.assertEqual(len(seq), 2)
1311
1312 seq = range(-a, -b, -c)
1313 self.assert_(-a in seq)
1314 self.assert_(-b not in seq)
1315 self.assertEqual(len(seq), 2)
1316
Walter Dörwald919497e2003-01-19 16:23:59 +00001317 self.assertRaises(TypeError, range)
1318 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1319 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001320 self.assertRaises(ValueError, range, a, a + 1, long(0))
1321
1322 class badzero(int):
1323 def __cmp__(self, other):
1324 raise RuntimeError
1325 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001326
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001327 # Reject floats when it would require PyLongs to represent.
1328 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001329 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001330
Walter Dörwald357981e2003-04-15 18:59:28 +00001331 self.assertRaises(TypeError, range, 0, "spam")
1332 self.assertRaises(TypeError, range, 0, 42, "spam")
1333
1334 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1335 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1336
Walter Dörwald919497e2003-01-19 16:23:59 +00001337 def test_input_and_raw_input(self):
1338 self.write_testfile()
1339 fp = open(TESTFN, 'r')
1340 savestdin = sys.stdin
1341 savestdout = sys.stdout # Eats the echo
1342 try:
1343 sys.stdin = fp
1344 sys.stdout = BitBucket()
1345 self.assertEqual(input(), 2)
1346 self.assertEqual(input('testing\n'), 2)
1347 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1348 self.assertEqual(raw_input('testing\n'), 'Dear John')
1349 sys.stdin = cStringIO.StringIO("NULL\0")
1350 self.assertRaises(TypeError, input, 42, 42)
1351 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1352 self.assertEqual(input(), 'whitespace')
1353 sys.stdin = cStringIO.StringIO()
1354 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001355
1356 # SF 876178: make sure input() respect future options.
1357 sys.stdin = cStringIO.StringIO('1/2')
1358 sys.stdout = cStringIO.StringIO()
1359 exec compile('print input()', 'test_builtin_tmp', 'exec')
1360 sys.stdin.seek(0, 0)
1361 exec compile('from __future__ import division;print input()',
1362 'test_builtin_tmp', 'exec')
1363 sys.stdin.seek(0, 0)
1364 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001365 # The result we expect depends on whether new division semantics
1366 # are already in effect.
1367 if 1/2 == 0:
1368 # This test was compiled with old semantics.
1369 expected = ['0', '0.5', '0']
1370 else:
1371 # This test was compiled with new semantics (e.g., -Qnew
1372 # was given on the command line.
1373 expected = ['0.5', '0.5', '0.5']
1374 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001375
Walter Dörwald919497e2003-01-19 16:23:59 +00001376 del sys.stdout
1377 self.assertRaises(RuntimeError, input, 'prompt')
1378 del sys.stdin
1379 self.assertRaises(RuntimeError, input, 'prompt')
1380 finally:
1381 sys.stdin = savestdin
1382 sys.stdout = savestdout
1383 fp.close()
1384 unlink(TESTFN)
1385
1386 def test_reduce(self):
1387 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1388 self.assertEqual(
1389 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1390 ['a','c','d','w']
1391 )
1392 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1393 self.assertEqual(
1394 reduce(lambda x, y: x*y, range(2,21), 1L),
1395 2432902008176640000L
1396 )
1397 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1398 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1399 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1400 self.assertRaises(TypeError, reduce)
1401 self.assertRaises(TypeError, reduce, 42, 42)
1402 self.assertRaises(TypeError, reduce, 42, 42, 42)
1403 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1404 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1405 self.assertRaises(TypeError, reduce, 42, (42, 42))
1406
1407 class BadSeq:
1408 def __getitem__(self, index):
1409 raise ValueError
1410 self.assertRaises(ValueError, reduce, 42, BadSeq())
1411
1412 def test_reload(self):
1413 import marshal
1414 reload(marshal)
1415 import string
1416 reload(string)
1417 ## import sys
1418 ## self.assertRaises(ImportError, reload, sys)
1419
1420 def test_repr(self):
1421 self.assertEqual(repr(''), '\'\'')
1422 self.assertEqual(repr(0), '0')
1423 self.assertEqual(repr(0L), '0L')
1424 self.assertEqual(repr(()), '()')
1425 self.assertEqual(repr([]), '[]')
1426 self.assertEqual(repr({}), '{}')
1427 a = []
1428 a.append(a)
1429 self.assertEqual(repr(a), '[[...]]')
1430 a = {}
1431 a[0] = a
1432 self.assertEqual(repr(a), '{0: {...}}')
1433
1434 def test_round(self):
1435 self.assertEqual(round(0.0), 0.0)
1436 self.assertEqual(round(1.0), 1.0)
1437 self.assertEqual(round(10.0), 10.0)
1438 self.assertEqual(round(1000000000.0), 1000000000.0)
1439 self.assertEqual(round(1e20), 1e20)
1440
1441 self.assertEqual(round(-1.0), -1.0)
1442 self.assertEqual(round(-10.0), -10.0)
1443 self.assertEqual(round(-1000000000.0), -1000000000.0)
1444 self.assertEqual(round(-1e20), -1e20)
1445
1446 self.assertEqual(round(0.1), 0.0)
1447 self.assertEqual(round(1.1), 1.0)
1448 self.assertEqual(round(10.1), 10.0)
1449 self.assertEqual(round(1000000000.1), 1000000000.0)
1450
1451 self.assertEqual(round(-1.1), -1.0)
1452 self.assertEqual(round(-10.1), -10.0)
1453 self.assertEqual(round(-1000000000.1), -1000000000.0)
1454
1455 self.assertEqual(round(0.9), 1.0)
1456 self.assertEqual(round(9.9), 10.0)
1457 self.assertEqual(round(999999999.9), 1000000000.0)
1458
1459 self.assertEqual(round(-0.9), -1.0)
1460 self.assertEqual(round(-9.9), -10.0)
1461 self.assertEqual(round(-999999999.9), -1000000000.0)
1462
1463 self.assertEqual(round(-8.0, -1), -10.0)
1464
Georg Brandlccadf842006-03-31 18:54:53 +00001465 # test new kwargs
1466 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1467
Walter Dörwald919497e2003-01-19 16:23:59 +00001468 self.assertRaises(TypeError, round)
1469
1470 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001471 setattr(sys, 'spam', 1)
1472 self.assertEqual(sys.spam, 1)
1473 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1474 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001475
1476 def test_str(self):
1477 self.assertEqual(str(''), '')
1478 self.assertEqual(str(0), '0')
1479 self.assertEqual(str(0L), '0')
1480 self.assertEqual(str(()), '()')
1481 self.assertEqual(str([]), '[]')
1482 self.assertEqual(str({}), '{}')
1483 a = []
1484 a.append(a)
1485 self.assertEqual(str(a), '[[...]]')
1486 a = {}
1487 a[0] = a
1488 self.assertEqual(str(a), '{0: {...}}')
1489
Alex Martellia70b1912003-04-22 08:12:33 +00001490 def test_sum(self):
1491 self.assertEqual(sum([]), 0)
1492 self.assertEqual(sum(range(2,8)), 27)
1493 self.assertEqual(sum(iter(range(2,8))), 27)
1494 self.assertEqual(sum(Squares(10)), 285)
1495 self.assertEqual(sum(iter(Squares(10))), 285)
1496 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1497
1498 self.assertRaises(TypeError, sum)
1499 self.assertRaises(TypeError, sum, 42)
1500 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1501 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1502 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1503 self.assertRaises(TypeError, sum, [{2:3}])
1504 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1505
1506 class BadSeq:
1507 def __getitem__(self, index):
1508 raise ValueError
1509 self.assertRaises(ValueError, sum, BadSeq())
1510
Walter Dörwald919497e2003-01-19 16:23:59 +00001511 def test_tuple(self):
1512 self.assertEqual(tuple(()), ())
1513 t0_3 = (0, 1, 2, 3)
1514 t0_3_bis = tuple(t0_3)
1515 self.assert_(t0_3 is t0_3_bis)
1516 self.assertEqual(tuple([]), ())
1517 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1518 self.assertEqual(tuple(''), ())
1519 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1520
1521 def test_type(self):
1522 self.assertEqual(type(''), type('123'))
1523 self.assertNotEqual(type(''), type(()))
1524
1525 def test_unichr(self):
1526 if have_unicode:
1527 self.assertEqual(unichr(32), unicode(' '))
1528 self.assertEqual(unichr(65), unicode('A'))
1529 self.assertEqual(unichr(97), unicode('a'))
1530 self.assertEqual(
1531 unichr(sys.maxunicode),
1532 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1533 )
1534 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1535 self.assertRaises(TypeError, unichr)
1536
Guido van Rossumfee7b932005-01-16 00:21:28 +00001537 # We don't want self in vars(), so these are static methods
1538
1539 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001540 def get_vars_f0():
1541 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001542
Guido van Rossumfee7b932005-01-16 00:21:28 +00001543 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001544 def get_vars_f2():
1545 BuiltinTest.get_vars_f0()
1546 a = 1
1547 b = 2
1548 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001549
1550 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001551 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001552 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001553 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001554 self.assertEqual(self.get_vars_f0(), {})
1555 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1556 self.assertRaises(TypeError, vars, 42, 42)
1557 self.assertRaises(TypeError, vars, 42)
1558
1559 def test_zip(self):
1560 a = (1, 2, 3)
1561 b = (4, 5, 6)
1562 t = [(1, 4), (2, 5), (3, 6)]
1563 self.assertEqual(zip(a, b), t)
1564 b = [4, 5, 6]
1565 self.assertEqual(zip(a, b), t)
1566 b = (4, 5, 6, 7)
1567 self.assertEqual(zip(a, b), t)
1568 class I:
1569 def __getitem__(self, i):
1570 if i < 0 or i > 2: raise IndexError
1571 return i + 4
1572 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001573 self.assertEqual(zip(), [])
1574 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001575 self.assertRaises(TypeError, zip, None)
1576 class G:
1577 pass
1578 self.assertRaises(TypeError, zip, a, G())
1579
1580 # Make sure zip doesn't try to allocate a billion elements for the
1581 # result list when one of its arguments doesn't say how long it is.
1582 # A MemoryError is the most likely failure mode.
1583 class SequenceWithoutALength:
1584 def __getitem__(self, i):
1585 if i == 5:
1586 raise IndexError
1587 else:
1588 return i
1589 self.assertEqual(
1590 zip(SequenceWithoutALength(), xrange(2**30)),
1591 list(enumerate(range(5)))
1592 )
1593
1594 class BadSeq:
1595 def __getitem__(self, i):
1596 if i == 5:
1597 raise ValueError
1598 else:
1599 return i
1600 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1601
Raymond Hettinger64958a12003-12-17 20:43:33 +00001602class TestSorted(unittest.TestCase):
1603
1604 def test_basic(self):
1605 data = range(100)
1606 copy = data[:]
1607 random.shuffle(copy)
1608 self.assertEqual(data, sorted(copy))
1609 self.assertNotEqual(data, copy)
1610
1611 data.reverse()
1612 random.shuffle(copy)
1613 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1614 self.assertNotEqual(data, copy)
1615 random.shuffle(copy)
1616 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1617 self.assertNotEqual(data, copy)
1618 random.shuffle(copy)
1619 self.assertEqual(data, sorted(copy, reverse=1))
1620 self.assertNotEqual(data, copy)
1621
1622 def test_inputtypes(self):
1623 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001624 types = [list, tuple]
1625 if have_unicode:
1626 types.insert(0, unicode)
1627 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001628 self.assertEqual(sorted(s), sorted(T(s)))
1629
1630 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001631 types = [set, frozenset, list, tuple, dict.fromkeys]
1632 if have_unicode:
1633 types.insert(0, unicode)
1634 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001635 self.assertEqual(sorted(s), sorted(T(s)))
1636
1637 def test_baddecorator(self):
1638 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1639 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1640
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001641def test_main(verbose=None):
1642 test_classes = (BuiltinTest, TestSorted)
1643
1644 run_unittest(*test_classes)
1645
1646 # verify reference counting
1647 if verbose and hasattr(sys, "gettotalrefcount"):
1648 import gc
1649 counts = [None] * 5
1650 for i in xrange(len(counts)):
1651 run_unittest(*test_classes)
1652 gc.collect()
1653 counts[i] = sys.gettotalrefcount()
1654 print counts
1655
Walter Dörwald919497e2003-01-19 16:23:59 +00001656
1657if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001658 test_main(verbose=True)