blob: 27f659db86ca572b077fbe50c3122b2329a5df89 [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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00004from test.test_support import fcmp, have_unicode, TESTFN, unlink, run_unittest
5from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00006
Raymond Hettinger214b1c32004-07-02 06:41:07 +00007import sys, warnings, cStringIO, random, UserDict
Walter Dörwald919497e2003-01-19 16:23:59 +00008warnings.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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000013# count the number of test runs.
14# used to skip running test_execfile() multiple times
15numruns = 0
16
Walter Dörwald919497e2003-01-19 16:23:59 +000017class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000018
Walter Dörwald919497e2003-01-19 16:23:59 +000019 def __init__(self, max):
20 self.max = max
21 self.sofar = []
22
23 def __len__(self): return len(self.sofar)
24
25 def __getitem__(self, i):
26 if not 0 <= i < self.max: raise IndexError
27 n = len(self.sofar)
28 while n <= i:
29 self.sofar.append(n*n)
30 n += 1
31 return self.sofar[i]
32
33class StrSquares:
34
35 def __init__(self, max):
36 self.max = max
37 self.sofar = []
38
39 def __len__(self):
40 return len(self.sofar)
41
42 def __getitem__(self, i):
43 if not 0 <= i < self.max:
44 raise IndexError
45 n = len(self.sofar)
46 while n <= i:
47 self.sofar.append(str(n*n))
48 n += 1
49 return self.sofar[i]
50
51class BitBucket:
52 def write(self, line):
53 pass
54
55L = [
56 ('0', 0),
57 ('1', 1),
58 ('9', 9),
59 ('10', 10),
60 ('99', 99),
61 ('100', 100),
62 ('314', 314),
63 (' 314', 314),
64 ('314 ', 314),
65 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000066 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000067 (' 1x', ValueError),
68 (' 1 ', 1),
69 (' 1\02 ', ValueError),
70 ('', ValueError),
71 (' ', ValueError),
72 (' \t\t ', ValueError)
73]
74if have_unicode:
75 L += [
76 (unicode('0'), 0),
77 (unicode('1'), 1),
78 (unicode('9'), 9),
79 (unicode('10'), 10),
80 (unicode('99'), 99),
81 (unicode('100'), 100),
82 (unicode('314'), 314),
83 (unicode(' 314'), 314),
84 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
85 (unicode(' \t\t 314 \t\t '), 314),
86 (unicode(' 1x'), ValueError),
87 (unicode(' 1 '), 1),
88 (unicode(' 1\02 '), ValueError),
89 (unicode(''), ValueError),
90 (unicode(' '), ValueError),
91 (unicode(' \t\t '), ValueError),
92 (unichr(0x200), ValueError),
93]
94
Raymond Hettinger96229b12005-03-11 06:49:40 +000095class TestFailingBool:
96 def __nonzero__(self):
97 raise RuntimeError
98
99class TestFailingIter:
100 def __iter__(self):
101 raise RuntimeError
102
Walter Dörwald919497e2003-01-19 16:23:59 +0000103class BuiltinTest(unittest.TestCase):
104
105 def test_import(self):
106 __import__('sys')
107 __import__('time')
108 __import__('string')
109 self.assertRaises(ImportError, __import__, 'spamspam')
110 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +0000111 self.assertRaises(ValueError, __import__, '')
Walter Dörwald919497e2003-01-19 16:23:59 +0000112
113 def test_abs(self):
114 # int
115 self.assertEqual(abs(0), 0)
116 self.assertEqual(abs(1234), 1234)
117 self.assertEqual(abs(-1234), 1234)
118 # float
119 self.assertEqual(abs(0.0), 0.0)
120 self.assertEqual(abs(3.14), 3.14)
121 self.assertEqual(abs(-3.14), 3.14)
122 # long
123 self.assertEqual(abs(0L), 0L)
124 self.assertEqual(abs(1234L), 1234L)
125 self.assertEqual(abs(-1234L), 1234L)
126 # str
127 self.assertRaises(TypeError, abs, 'a')
128
Raymond Hettinger96229b12005-03-11 06:49:40 +0000129 def test_all(self):
130 self.assertEqual(all([2, 4, 6]), True)
131 self.assertEqual(all([2, None, 6]), False)
132 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
133 self.assertRaises(RuntimeError, all, TestFailingIter())
134 self.assertRaises(TypeError, all, 10) # Non-iterable
135 self.assertRaises(TypeError, all) # No args
136 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
137 self.assertEqual(all([]), True) # Empty iterator
138 S = [50, 60]
139 self.assertEqual(all(x > 42 for x in S), True)
140 S = [50, 40, 60]
141 self.assertEqual(all(x > 42 for x in S), False)
142
143 def test_any(self):
144 self.assertEqual(any([None, None, None]), False)
145 self.assertEqual(any([None, 4, None]), True)
146 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
147 self.assertRaises(RuntimeError, all, TestFailingIter())
148 self.assertRaises(TypeError, any, 10) # Non-iterable
149 self.assertRaises(TypeError, any) # No args
150 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
151 self.assertEqual(any([]), False) # Empty iterator
152 S = [40, 60, 30]
153 self.assertEqual(any(x > 42 for x in S), True)
154 S = [10, 20, 30]
155 self.assertEqual(any(x > 42 for x in S), False)
156
Walter Dörwald919497e2003-01-19 16:23:59 +0000157 def test_apply(self):
158 def f0(*args):
159 self.assertEqual(args, ())
160 def f1(a1):
161 self.assertEqual(a1, 1)
162 def f2(a1, a2):
163 self.assertEqual(a1, 1)
164 self.assertEqual(a2, 2)
165 def f3(a1, a2, a3):
166 self.assertEqual(a1, 1)
167 self.assertEqual(a2, 2)
168 self.assertEqual(a3, 3)
169 apply(f0, ())
170 apply(f1, (1,))
171 apply(f2, (1, 2))
172 apply(f3, (1, 2, 3))
173
174 # A PyCFunction that takes only positional parameters should allow an
175 # empty keyword dictionary to pass without a complaint, but raise a
176 # TypeError if the dictionary is non-empty.
177 apply(id, (1,), {})
178 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
179 self.assertRaises(TypeError, apply)
180 self.assertRaises(TypeError, apply, id, 42)
181 self.assertRaises(TypeError, apply, id, (42,), 42)
182
183 def test_callable(self):
184 self.assert_(callable(len))
185 def f(): pass
186 self.assert_(callable(f))
187 class C:
188 def meth(self): pass
189 self.assert_(callable(C))
190 x = C()
191 self.assert_(callable(x.meth))
192 self.assert_(not callable(x))
193 class D(C):
194 def __call__(self): pass
195 y = D()
196 self.assert_(callable(y))
197 y()
198
199 def test_chr(self):
200 self.assertEqual(chr(32), ' ')
201 self.assertEqual(chr(65), 'A')
202 self.assertEqual(chr(97), 'a')
203 self.assertEqual(chr(0xff), '\xff')
204 self.assertRaises(ValueError, chr, 256)
205 self.assertRaises(TypeError, chr)
206
207 def test_cmp(self):
208 self.assertEqual(cmp(-1, 1), -1)
209 self.assertEqual(cmp(1, -1), 1)
210 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000211 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000212 a = []; a.append(a)
213 b = []; b.append(b)
214 from UserList import UserList
215 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000216 self.assertRaises(RuntimeError, cmp, a, b)
217 self.assertRaises(RuntimeError, cmp, b, c)
218 self.assertRaises(RuntimeError, cmp, c, a)
219 self.assertRaises(RuntimeError, cmp, a, c)
220 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000221 a.pop(); b.pop(); c.pop()
222 self.assertRaises(TypeError, cmp)
223
224 def test_coerce(self):
225 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
226 self.assertEqual(coerce(1, 1L), (1L, 1L))
227 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
228 self.assertRaises(TypeError, coerce)
229 class BadNumber:
230 def __coerce__(self, other):
231 raise ValueError
232 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000233 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000234
235 def test_compile(self):
236 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000237 bom = '\xef\xbb\xbf'
238 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000239 self.assertRaises(TypeError, compile)
240 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
241 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000242 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000243 if have_unicode:
244 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000245 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
246 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000247
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 def test_delattr(self):
249 import sys
250 sys.spam = 1
251 delattr(sys, 'spam')
252 self.assertRaises(TypeError, delattr)
253
254 def test_dir(self):
255 x = 1
256 self.assert_('x' in dir())
257 import sys
258 self.assert_('modules' in dir(sys))
259 self.assertRaises(TypeError, dir, 42, 42)
260
261 def test_divmod(self):
262 self.assertEqual(divmod(12, 7), (1, 5))
263 self.assertEqual(divmod(-12, 7), (-2, 2))
264 self.assertEqual(divmod(12, -7), (-2, -2))
265 self.assertEqual(divmod(-12, -7), (1, -5))
266
267 self.assertEqual(divmod(12L, 7L), (1L, 5L))
268 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
269 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
270 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
271
272 self.assertEqual(divmod(12, 7L), (1, 5L))
273 self.assertEqual(divmod(-12, 7L), (-2, 2L))
274 self.assertEqual(divmod(12L, -7), (-2L, -2))
275 self.assertEqual(divmod(-12L, -7), (1L, -5))
276
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000277 self.assertEqual(divmod(-sys.maxint-1, -1),
278 (sys.maxint+1, 0))
279
Walter Dörwald919497e2003-01-19 16:23:59 +0000280 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
281 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
282 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
283 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
284
285 self.assertRaises(TypeError, divmod)
286
287 def test_eval(self):
288 self.assertEqual(eval('1+1'), 2)
289 self.assertEqual(eval(' 1+1\n'), 2)
290 globals = {'a': 1, 'b': 2}
291 locals = {'b': 200, 'c': 300}
292 self.assertEqual(eval('a', globals) , 1)
293 self.assertEqual(eval('a', globals, locals), 1)
294 self.assertEqual(eval('b', globals, locals), 200)
295 self.assertEqual(eval('c', globals, locals), 300)
296 if have_unicode:
297 self.assertEqual(eval(unicode('1+1')), 2)
298 self.assertEqual(eval(unicode(' 1+1\n')), 2)
299 globals = {'a': 1, 'b': 2}
300 locals = {'b': 200, 'c': 300}
301 if have_unicode:
302 self.assertEqual(eval(unicode('a'), globals), 1)
303 self.assertEqual(eval(unicode('a'), globals, locals), 1)
304 self.assertEqual(eval(unicode('b'), globals, locals), 200)
305 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000306 bom = '\xef\xbb\xbf'
307 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000308 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
309 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000310 self.assertRaises(TypeError, eval)
311 self.assertRaises(TypeError, eval, ())
312
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000313 def test_general_eval(self):
314 # Tests that general mappings can be used for the locals argument
315
316 class M:
317 "Test mapping interface versus possible calls from eval()."
318 def __getitem__(self, key):
319 if key == 'a':
320 return 12
321 raise KeyError
322 def keys(self):
323 return list('xyz')
324
325 m = M()
326 g = globals()
327 self.assertEqual(eval('a', g, m), 12)
328 self.assertRaises(NameError, eval, 'b', g, m)
329 self.assertEqual(eval('dir()', g, m), list('xyz'))
330 self.assertEqual(eval('globals()', g, m), g)
331 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000332 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000333 class A:
334 "Non-mapping"
335 pass
336 m = A()
337 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000338
339 # Verify that dict subclasses work as well
340 class D(dict):
341 def __getitem__(self, key):
342 if key == 'a':
343 return 12
344 return dict.__getitem__(self, key)
345 def keys(self):
346 return list('xyz')
347
348 d = D()
349 self.assertEqual(eval('a', g, d), 12)
350 self.assertRaises(NameError, eval, 'b', g, d)
351 self.assertEqual(eval('dir()', g, d), list('xyz'))
352 self.assertEqual(eval('globals()', g, d), g)
353 self.assertEqual(eval('locals()', g, d), d)
354
355 # Verify locals stores (used by list comps)
356 eval('[locals() for i in (2,3)]', g, d)
357 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
358
359 class SpreadSheet:
360 "Sample application showing nested, calculated lookups."
361 _cells = {}
362 def __setitem__(self, key, formula):
363 self._cells[key] = formula
364 def __getitem__(self, key ):
365 return eval(self._cells[key], globals(), self)
366
367 ss = SpreadSheet()
368 ss['a1'] = '5'
369 ss['a2'] = 'a1*6'
370 ss['a3'] = 'a2*7'
371 self.assertEqual(ss['a3'], 210)
372
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000373 # Verify that dir() catches a non-list returned by eval
374 # SF bug #1004669
375 class C:
376 def __getitem__(self, item):
377 raise KeyError(item)
378 def keys(self):
379 return 'a'
380 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
381
Walter Dörwald919497e2003-01-19 16:23:59 +0000382 # Done outside of the method test_z to get the correct scope
383 z = 0
384 f = open(TESTFN, 'w')
385 f.write('z = z+1\n')
386 f.write('z = z*2\n')
387 f.close()
388 execfile(TESTFN)
389
390 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000391 global numruns
392 if numruns:
393 return
394 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000395
Walter Dörwald919497e2003-01-19 16:23:59 +0000396 globals = {'a': 1, 'b': 2}
397 locals = {'b': 200, 'c': 300}
398
399 self.assertEqual(self.__class__.z, 2)
400 globals['z'] = 0
401 execfile(TESTFN, globals)
402 self.assertEqual(globals['z'], 2)
403 locals['z'] = 0
404 execfile(TESTFN, globals, locals)
405 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000406
407 class M:
408 "Test mapping interface versus possible calls from execfile()."
409 def __init__(self):
410 self.z = 10
411 def __getitem__(self, key):
412 if key == 'z':
413 return self.z
414 raise KeyError
415 def __setitem__(self, key, value):
416 if key == 'z':
417 self.z = value
418 return
419 raise KeyError
420
421 locals = M()
422 locals['z'] = 0
423 execfile(TESTFN, globals, locals)
424 self.assertEqual(locals['z'], 2)
425
Walter Dörwald919497e2003-01-19 16:23:59 +0000426 unlink(TESTFN)
427 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000428 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000429 import os
430 self.assertRaises(IOError, execfile, os.curdir)
431 self.assertRaises(IOError, execfile, "I_dont_exist")
432
433 def test_filter(self):
434 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
435 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
436 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
437 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
438 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
439 def identity(item):
440 return 1
441 filter(identity, Squares(5))
442 self.assertRaises(TypeError, filter)
443 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000444 def __getitem__(self, index):
445 if index<4:
446 return 42
447 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000448 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
449 def badfunc():
450 pass
451 self.assertRaises(TypeError, filter, badfunc, range(5))
452
Walter Dörwaldbf517072003-01-27 15:57:14 +0000453 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000454 self.assertEqual(filter(None, (1, 2)), (1, 2))
455 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
456 self.assertRaises(TypeError, filter, 42, (1, 2))
457
Walter Dörwaldbf517072003-01-27 15:57:14 +0000458 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000459 self.assertEqual(filter(None, "12"), "12")
460 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
461 self.assertRaises(TypeError, filter, 42, "12")
462 class badstr(str):
463 def __getitem__(self, index):
464 raise ValueError
465 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000466
Walter Dörwald903f1e02003-02-04 16:28:00 +0000467 class badstr2(str):
468 def __getitem__(self, index):
469 return 42
470 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
471
472 class weirdstr(str):
473 def __getitem__(self, index):
474 return weirdstr(2*str.__getitem__(self, index))
475 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
476
Walter Dörwald5e61e242003-02-04 17:04:01 +0000477 class shiftstr(str):
478 def __getitem__(self, index):
479 return chr(ord(str.__getitem__(self, index))+1)
480 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
481
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000482 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000483 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000484 self.assertEqual(filter(None, unicode("12")), unicode("12"))
485 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
486 self.assertRaises(TypeError, filter, 42, unicode("12"))
487 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000488
Walter Dörwald903f1e02003-02-04 16:28:00 +0000489 class badunicode(unicode):
490 def __getitem__(self, index):
491 return 42
492 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
493
494 class weirdunicode(unicode):
495 def __getitem__(self, index):
496 return weirdunicode(2*unicode.__getitem__(self, index))
497 self.assertEqual(
498 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
499
Walter Dörwald5e61e242003-02-04 17:04:01 +0000500 class shiftunicode(unicode):
501 def __getitem__(self, index):
502 return unichr(ord(unicode.__getitem__(self, index))+1)
503 self.assertEqual(
504 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
505 unicode("345")
506 )
507
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000508 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000509 # test that filter() never returns tuple, str or unicode subclasses
510 # and that the result always goes through __getitem__
511 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000512 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000513 def __getitem__(self, index):
514 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000515 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000516 def __getitem__(self, index):
517 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000518 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000519 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000520 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000521 }
522 if have_unicode:
523 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000524 def __getitem__(self, index):
525 return 2*unicode.__getitem__(self, index)
526 inputs[unicode2] = {
527 unicode(): unicode(),
528 unicode("123"): unicode("112233")
529 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000530
Walter Dörwald1918f772003-02-10 13:19:13 +0000531 for (cls, inps) in inputs.iteritems():
532 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000533 # make sure the output goes through __getitem__
534 # even if func is None
535 self.assertEqual(
536 filter(funcs[0], cls(inp)),
537 filter(funcs[1], cls(inp))
538 )
539 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000540 outp = filter(func, cls(inp))
541 self.assertEqual(outp, exp)
542 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000543
Walter Dörwald919497e2003-01-19 16:23:59 +0000544 def test_float(self):
545 self.assertEqual(float(3.14), 3.14)
546 self.assertEqual(float(314), 314.0)
547 self.assertEqual(float(314L), 314.0)
548 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000549 self.assertRaises(ValueError, float, " 0x3.1 ")
550 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000551 if have_unicode:
552 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
553 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000554 # Implementation limitation in PyFloat_FromString()
555 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000556
Neal Norwitz5898fa22005-11-22 05:17:40 +0000557 def test_float_with_comma(self):
558 # set locale to something that doesn't use '.' for the decimal point
559 try:
560 import locale
Georg Brandled1e4972006-01-09 22:36:58 +0000561 orig_locale = locale.setlocale(locale.LC_NUMERIC)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000562 locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
563 except:
564 # if we can't set the locale, just ignore this test
565 return
566
567 try:
568 self.assertEqual(locale.localeconv()['decimal_point'], ',')
569 except:
570 # this test is worthless, just skip it and reset the locale
571 locale.setlocale(locale.LC_NUMERIC, orig_locale)
572 return
573
574 try:
575 self.assertEqual(float(" 3,14 "), 3.14)
576 self.assertEqual(float(" +3,14 "), 3.14)
577 self.assertEqual(float(" -3,14 "), -3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000578 self.assertRaises(ValueError, float, " 0x3.1 ")
579 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Neal Norwitz5898fa22005-11-22 05:17:40 +0000580 self.assertEqual(float(" 25.e-1 "), 2.5)
581 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
582 finally:
583 locale.setlocale(locale.LC_NUMERIC, orig_locale)
584
Brett Cannonc3647ac2005-04-26 03:45:26 +0000585 def test_floatconversion(self):
586 # Make sure that calls to __float__() work properly
587 class Foo0:
588 def __float__(self):
589 return 42.
590
591 class Foo1(object):
592 def __float__(self):
593 return 42.
594
595 class Foo2(float):
596 def __float__(self):
597 return 42.
598
599 class Foo3(float):
600 def __new__(cls, value=0.):
601 return float.__new__(cls, 2*value)
602
603 def __float__(self):
604 return self
605
606 class Foo4(float):
607 def __float__(self):
608 return 42
609
610 self.assertAlmostEqual(float(Foo0()), 42.)
611 self.assertAlmostEqual(float(Foo1()), 42.)
612 self.assertAlmostEqual(float(Foo2()), 42.)
613 self.assertAlmostEqual(float(Foo3(21)), 42.)
614 self.assertRaises(TypeError, float, Foo4(42))
615
Walter Dörwald919497e2003-01-19 16:23:59 +0000616 def test_getattr(self):
617 import sys
618 self.assert_(getattr(sys, 'stdout') is sys.stdout)
619 self.assertRaises(TypeError, getattr, sys, 1)
620 self.assertRaises(TypeError, getattr, sys, 1, "foo")
621 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000622 if have_unicode:
623 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000624
625 def test_hasattr(self):
626 import sys
627 self.assert_(hasattr(sys, 'stdout'))
628 self.assertRaises(TypeError, hasattr, sys, 1)
629 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000630 if have_unicode:
631 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000632
633 def test_hash(self):
634 hash(None)
635 self.assertEqual(hash(1), hash(1L))
636 self.assertEqual(hash(1), hash(1.0))
637 hash('spam')
638 if have_unicode:
639 self.assertEqual(hash('spam'), hash(unicode('spam')))
640 hash((0,1,2,3))
641 def f(): pass
642 self.assertRaises(TypeError, hash, [])
643 self.assertRaises(TypeError, hash, {})
644
645 def test_hex(self):
646 self.assertEqual(hex(16), '0x10')
647 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000648 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 self.assertEqual(hex(-16L), '-0x10L')
650 self.assertRaises(TypeError, hex, {})
651
652 def test_id(self):
653 id(None)
654 id(1)
655 id(1L)
656 id(1.0)
657 id('spam')
658 id((0,1,2,3))
659 id([0,1,2,3])
660 id({'spam': 1, 'eggs': 2, 'ham': 3})
661
662 # Test input() later, together with raw_input
663
664 def test_int(self):
665 self.assertEqual(int(314), 314)
666 self.assertEqual(int(3.14), 3)
667 self.assertEqual(int(314L), 314)
668 # Check that conversion from float truncates towards zero
669 self.assertEqual(int(-3.14), -3)
670 self.assertEqual(int(3.9), 3)
671 self.assertEqual(int(-3.9), -3)
672 self.assertEqual(int(3.5), 3)
673 self.assertEqual(int(-3.5), -3)
674 # Different base:
675 self.assertEqual(int("10",16), 16L)
676 if have_unicode:
677 self.assertEqual(int(unicode("10"),16), 16L)
678 # Test conversion from strings and various anomalies
679 for s, v in L:
680 for sign in "", "+", "-":
681 for prefix in "", " ", "\t", " \t\t ":
682 ss = prefix + sign + s
683 vv = v
684 if sign == "-" and v is not ValueError:
685 vv = -v
686 try:
687 self.assertEqual(int(ss), vv)
688 except v:
689 pass
690
Walter Dörwald70a6b492004-02-12 17:35:32 +0000691 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000692 self.assertEqual(int(s)+1, -sys.maxint)
693 # should return long
694 int(s[1:])
695
696 # should return long
697 x = int(1e100)
698 self.assert_(isinstance(x, long))
699 x = int(-1e100)
700 self.assert_(isinstance(x, long))
701
702
703 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
704 # Worked by accident in Windows release build, but failed in debug build.
705 # Failed in all Linux builds.
706 x = -1-sys.maxint
707 self.assertEqual(x >> 1, x//2)
708
709 self.assertRaises(ValueError, int, '123\0')
710 self.assertRaises(ValueError, int, '53', 40)
711
712 x = int('1' * 600)
713 self.assert_(isinstance(x, long))
714
715 if have_unicode:
716 x = int(unichr(0x661) * 600)
717 self.assert_(isinstance(x, long))
718
719 self.assertRaises(TypeError, int, 1, 12)
720
721 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000722 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000723
Brett Cannonc3647ac2005-04-26 03:45:26 +0000724 def test_intconversion(self):
725 # Test __int__()
726 class Foo0:
727 def __int__(self):
728 return 42
729
730 class Foo1(object):
731 def __int__(self):
732 return 42
733
734 class Foo2(int):
735 def __int__(self):
736 return 42
737
738 class Foo3(int):
739 def __int__(self):
740 return self
741
742 class Foo4(int):
743 def __int__(self):
744 return 42L
745
746 class Foo5(int):
747 def __int__(self):
748 return 42.
749
750 self.assertEqual(int(Foo0()), 42)
751 self.assertEqual(int(Foo1()), 42)
752 self.assertEqual(int(Foo2()), 42)
753 self.assertEqual(int(Foo3()), 0)
754 self.assertEqual(int(Foo4()), 42L)
755 self.assertRaises(TypeError, int, Foo5())
756
Walter Dörwald919497e2003-01-19 16:23:59 +0000757 def test_intern(self):
758 self.assertRaises(TypeError, intern)
759 s = "never interned before"
760 self.assert_(intern(s) is s)
761 s2 = s.swapcase().swapcase()
762 self.assert_(intern(s2) is s)
763
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000764 # Subclasses of string can't be interned, because they
765 # provide too much opportunity for insane things to happen.
766 # We don't want them in the interned dict and if they aren't
767 # actually interned, we don't want to create the appearance
768 # that they are by allowing intern() to succeeed.
769 class S(str):
770 def __hash__(self):
771 return 123
772
773 self.assertRaises(TypeError, intern, S("abc"))
774
775 # It's still safe to pass these strings to routines that
776 # call intern internally, e.g. PyObject_SetAttr().
777 s = S("abc")
778 setattr(s, s, s)
779 self.assertEqual(getattr(s, s), s)
780
Walter Dörwald919497e2003-01-19 16:23:59 +0000781 def test_iter(self):
782 self.assertRaises(TypeError, iter)
783 self.assertRaises(TypeError, iter, 42, 42)
784 lists = [("1", "2"), ["1", "2"], "12"]
785 if have_unicode:
786 lists.append(unicode("12"))
787 for l in lists:
788 i = iter(l)
789 self.assertEqual(i.next(), '1')
790 self.assertEqual(i.next(), '2')
791 self.assertRaises(StopIteration, i.next)
792
793 def test_isinstance(self):
794 class C:
795 pass
796 class D(C):
797 pass
798 class E:
799 pass
800 c = C()
801 d = D()
802 e = E()
803 self.assert_(isinstance(c, C))
804 self.assert_(isinstance(d, C))
805 self.assert_(not isinstance(e, C))
806 self.assert_(not isinstance(c, D))
807 self.assert_(not isinstance('foo', E))
808 self.assertRaises(TypeError, isinstance, E, 'foo')
809 self.assertRaises(TypeError, isinstance)
810
811 def test_issubclass(self):
812 class C:
813 pass
814 class D(C):
815 pass
816 class E:
817 pass
818 c = C()
819 d = D()
820 e = E()
821 self.assert_(issubclass(D, C))
822 self.assert_(issubclass(C, C))
823 self.assert_(not issubclass(C, D))
824 self.assertRaises(TypeError, issubclass, 'foo', E)
825 self.assertRaises(TypeError, issubclass, E, 'foo')
826 self.assertRaises(TypeError, issubclass)
827
828 def test_len(self):
829 self.assertEqual(len('123'), 3)
830 self.assertEqual(len(()), 0)
831 self.assertEqual(len((1, 2, 3, 4)), 4)
832 self.assertEqual(len([1, 2, 3, 4]), 4)
833 self.assertEqual(len({}), 0)
834 self.assertEqual(len({'a':1, 'b': 2}), 2)
835 class BadSeq:
836 def __len__(self):
837 raise ValueError
838 self.assertRaises(ValueError, len, BadSeq())
839
840 def test_list(self):
841 self.assertEqual(list([]), [])
842 l0_3 = [0, 1, 2, 3]
843 l0_3_bis = list(l0_3)
844 self.assertEqual(l0_3, l0_3_bis)
845 self.assert_(l0_3 is not l0_3_bis)
846 self.assertEqual(list(()), [])
847 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
848 self.assertEqual(list(''), [])
849 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
850
851 if sys.maxint == 0x7fffffff:
852 # This test can currently only work on 32-bit machines.
853 # XXX If/when PySequence_Length() returns a ssize_t, it should be
854 # XXX re-enabled.
855 # Verify clearing of bug #556025.
856 # This assumes that the max data size (sys.maxint) == max
857 # address size this also assumes that the address size is at
858 # least 4 bytes with 8 byte addresses, the bug is not well
859 # tested
860 #
861 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
862 # earlier due to a newlib bug. See the following mailing list
863 # thread for the details:
864
865 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
866 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
867
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000868 # This code used to segfault in Py2.4a3
869 x = []
870 x.extend(-y for y in x)
871 self.assertEqual(x, [])
872
Walter Dörwald919497e2003-01-19 16:23:59 +0000873 def test_long(self):
874 self.assertEqual(long(314), 314L)
875 self.assertEqual(long(3.14), 3L)
876 self.assertEqual(long(314L), 314L)
877 # Check that conversion from float truncates towards zero
878 self.assertEqual(long(-3.14), -3L)
879 self.assertEqual(long(3.9), 3L)
880 self.assertEqual(long(-3.9), -3L)
881 self.assertEqual(long(3.5), 3L)
882 self.assertEqual(long(-3.5), -3L)
883 self.assertEqual(long("-3"), -3L)
884 if have_unicode:
885 self.assertEqual(long(unicode("-3")), -3L)
886 # Different base:
887 self.assertEqual(long("10",16), 16L)
888 if have_unicode:
889 self.assertEqual(long(unicode("10"),16), 16L)
890 # Check conversions from string (same test set as for int(), and then some)
891 LL = [
892 ('1' + '0'*20, 10L**20),
893 ('1' + '0'*100, 10L**100)
894 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000895 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000896 if have_unicode:
897 L2 += [
898 (unicode('1') + unicode('0')*20, 10L**20),
899 (unicode('1') + unicode('0')*100, 10L**100),
900 ]
901 for s, v in L2 + LL:
902 for sign in "", "+", "-":
903 for prefix in "", " ", "\t", " \t\t ":
904 ss = prefix + sign + s
905 vv = v
906 if sign == "-" and v is not ValueError:
907 vv = -v
908 try:
909 self.assertEqual(long(ss), long(vv))
910 except v:
911 pass
912
913 self.assertRaises(ValueError, long, '123\0')
914 self.assertRaises(ValueError, long, '53', 40)
915 self.assertRaises(TypeError, long, 1, 12)
916
Brett Cannonc3647ac2005-04-26 03:45:26 +0000917 def test_longconversion(self):
918 # Test __long__()
919 class Foo0:
920 def __long__(self):
921 return 42L
922
923 class Foo1(object):
924 def __long__(self):
925 return 42L
926
927 class Foo2(long):
928 def __long__(self):
929 return 42L
930
931 class Foo3(long):
932 def __long__(self):
933 return self
934
935 class Foo4(long):
936 def __long__(self):
937 return 42
938
939 class Foo5(long):
940 def __long__(self):
941 return 42.
942
943 self.assertEqual(long(Foo0()), 42L)
944 self.assertEqual(long(Foo1()), 42L)
945 self.assertEqual(long(Foo2()), 42L)
946 self.assertEqual(long(Foo3()), 0)
947 self.assertEqual(long(Foo4()), 42)
948 self.assertRaises(TypeError, long, Foo5())
949
Walter Dörwald919497e2003-01-19 16:23:59 +0000950 def test_map(self):
951 self.assertEqual(
952 map(None, 'hello world'),
953 ['h','e','l','l','o',' ','w','o','r','l','d']
954 )
955 self.assertEqual(
956 map(None, 'abcd', 'efg'),
957 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
958 )
959 self.assertEqual(
960 map(None, range(10)),
961 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
962 )
963 self.assertEqual(
964 map(lambda x: x*x, range(1,4)),
965 [1, 4, 9]
966 )
967 try:
968 from math import sqrt
969 except ImportError:
970 def sqrt(x):
971 return pow(x, 0.5)
972 self.assertEqual(
973 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
974 [[4.0, 2.0], [9.0, 3.0]]
975 )
976 self.assertEqual(
977 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
978 [10, 4, 6]
979 )
980
981 def plus(*v):
982 accu = 0
983 for i in v: accu = accu + i
984 return accu
985 self.assertEqual(
986 map(plus, [1, 3, 7]),
987 [1, 3, 7]
988 )
989 self.assertEqual(
990 map(plus, [1, 3, 7], [4, 9, 2]),
991 [1+4, 3+9, 7+2]
992 )
993 self.assertEqual(
994 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
995 [1+4+1, 3+9+1, 7+2+0]
996 )
997 self.assertEqual(
998 map(None, Squares(10)),
999 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1000 )
1001 self.assertEqual(
1002 map(int, Squares(10)),
1003 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1004 )
1005 self.assertEqual(
1006 map(None, Squares(3), Squares(2)),
1007 [(0,0), (1,1), (4,None)]
1008 )
1009 self.assertEqual(
1010 map(max, Squares(3), Squares(2)),
1011 [0, 1, 4]
1012 )
1013 self.assertRaises(TypeError, map)
1014 self.assertRaises(TypeError, map, lambda x: x, 42)
1015 self.assertEqual(map(None, [42]), [42])
1016 class BadSeq:
1017 def __getitem__(self, index):
1018 raise ValueError
1019 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001020 def badfunc(x):
1021 raise RuntimeError
1022 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001023
1024 def test_max(self):
1025 self.assertEqual(max('123123'), '3')
1026 self.assertEqual(max(1, 2, 3), 3)
1027 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1028 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1029
1030 self.assertEqual(max(1, 2L, 3.0), 3.0)
1031 self.assertEqual(max(1L, 2.0, 3), 3)
1032 self.assertEqual(max(1.0, 2, 3L), 3L)
1033
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001034 for stmt in (
1035 "max(key=int)", # no args
1036 "max(1, key=int)", # single arg not iterable
1037 "max(1, 2, keystone=int)", # wrong keyword
1038 "max(1, 2, key=int, abc=int)", # two many keywords
1039 "max(1, 2, key=1)", # keyfunc is not callable
1040 ):
Tim Peters7f061872004-12-07 21:17:46 +00001041 try:
1042 exec(stmt) in globals()
1043 except TypeError:
1044 pass
1045 else:
1046 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001047
1048 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1049 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1050 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1051
1052 data = [random.randrange(200) for i in range(100)]
1053 keys = dict((elem, random.randrange(50)) for elem in data)
1054 f = keys.__getitem__
1055 self.assertEqual(max(data, key=f),
1056 sorted(reversed(data), key=f)[-1])
1057
Walter Dörwald919497e2003-01-19 16:23:59 +00001058 def test_min(self):
1059 self.assertEqual(min('123123'), '1')
1060 self.assertEqual(min(1, 2, 3), 1)
1061 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1062 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1063
1064 self.assertEqual(min(1, 2L, 3.0), 1)
1065 self.assertEqual(min(1L, 2.0, 3), 1L)
1066 self.assertEqual(min(1.0, 2, 3L), 1.0)
1067
1068 self.assertRaises(TypeError, min)
1069 self.assertRaises(TypeError, min, 42)
1070 self.assertRaises(ValueError, min, ())
1071 class BadSeq:
1072 def __getitem__(self, index):
1073 raise ValueError
1074 self.assertRaises(ValueError, min, BadSeq())
1075 class BadNumber:
1076 def __cmp__(self, other):
1077 raise ValueError
1078 self.assertRaises(ValueError, min, (42, BadNumber()))
1079
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001080 for stmt in (
1081 "min(key=int)", # no args
1082 "min(1, key=int)", # single arg not iterable
1083 "min(1, 2, keystone=int)", # wrong keyword
1084 "min(1, 2, key=int, abc=int)", # two many keywords
1085 "min(1, 2, key=1)", # keyfunc is not callable
1086 ):
Tim Peters7f061872004-12-07 21:17:46 +00001087 try:
1088 exec(stmt) in globals()
1089 except TypeError:
1090 pass
1091 else:
1092 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001093
1094 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1095 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1096 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1097
1098 data = [random.randrange(200) for i in range(100)]
1099 keys = dict((elem, random.randrange(50)) for elem in data)
1100 f = keys.__getitem__
1101 self.assertEqual(min(data, key=f),
1102 sorted(data, key=f)[0])
1103
Walter Dörwald919497e2003-01-19 16:23:59 +00001104 def test_oct(self):
1105 self.assertEqual(oct(100), '0144')
1106 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001107 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001108 self.assertEqual(oct(-100L), '-0144L')
1109 self.assertRaises(TypeError, oct, ())
1110
1111 def write_testfile(self):
1112 # NB the first 4 lines are also used to test input and raw_input, below
1113 fp = open(TESTFN, 'w')
1114 try:
1115 fp.write('1+1\n')
1116 fp.write('1+1\n')
1117 fp.write('The quick brown fox jumps over the lazy dog')
1118 fp.write('.\n')
1119 fp.write('Dear John\n')
1120 fp.write('XXX'*100)
1121 fp.write('YYY'*100)
1122 finally:
1123 fp.close()
1124
1125 def test_open(self):
1126 self.write_testfile()
1127 fp = open(TESTFN, 'r')
1128 try:
1129 self.assertEqual(fp.readline(4), '1+1\n')
1130 self.assertEqual(fp.readline(4), '1+1\n')
1131 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1132 self.assertEqual(fp.readline(4), 'Dear')
1133 self.assertEqual(fp.readline(100), ' John\n')
1134 self.assertEqual(fp.read(300), 'XXX'*100)
1135 self.assertEqual(fp.read(1000), 'YYY'*100)
1136 finally:
1137 fp.close()
1138 unlink(TESTFN)
1139
1140 def test_ord(self):
1141 self.assertEqual(ord(' '), 32)
1142 self.assertEqual(ord('A'), 65)
1143 self.assertEqual(ord('a'), 97)
1144 if have_unicode:
1145 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1146 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001147 if have_unicode:
1148 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
1150 def test_pow(self):
1151 self.assertEqual(pow(0,0), 1)
1152 self.assertEqual(pow(0,1), 0)
1153 self.assertEqual(pow(1,0), 1)
1154 self.assertEqual(pow(1,1), 1)
1155
1156 self.assertEqual(pow(2,0), 1)
1157 self.assertEqual(pow(2,10), 1024)
1158 self.assertEqual(pow(2,20), 1024*1024)
1159 self.assertEqual(pow(2,30), 1024*1024*1024)
1160
1161 self.assertEqual(pow(-2,0), 1)
1162 self.assertEqual(pow(-2,1), -2)
1163 self.assertEqual(pow(-2,2), 4)
1164 self.assertEqual(pow(-2,3), -8)
1165
1166 self.assertEqual(pow(0L,0), 1)
1167 self.assertEqual(pow(0L,1), 0)
1168 self.assertEqual(pow(1L,0), 1)
1169 self.assertEqual(pow(1L,1), 1)
1170
1171 self.assertEqual(pow(2L,0), 1)
1172 self.assertEqual(pow(2L,10), 1024)
1173 self.assertEqual(pow(2L,20), 1024*1024)
1174 self.assertEqual(pow(2L,30), 1024*1024*1024)
1175
1176 self.assertEqual(pow(-2L,0), 1)
1177 self.assertEqual(pow(-2L,1), -2)
1178 self.assertEqual(pow(-2L,2), 4)
1179 self.assertEqual(pow(-2L,3), -8)
1180
1181 self.assertAlmostEqual(pow(0.,0), 1.)
1182 self.assertAlmostEqual(pow(0.,1), 0.)
1183 self.assertAlmostEqual(pow(1.,0), 1.)
1184 self.assertAlmostEqual(pow(1.,1), 1.)
1185
1186 self.assertAlmostEqual(pow(2.,0), 1.)
1187 self.assertAlmostEqual(pow(2.,10), 1024.)
1188 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1189 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1190
1191 self.assertAlmostEqual(pow(-2.,0), 1.)
1192 self.assertAlmostEqual(pow(-2.,1), -2.)
1193 self.assertAlmostEqual(pow(-2.,2), 4.)
1194 self.assertAlmostEqual(pow(-2.,3), -8.)
1195
1196 for x in 2, 2L, 2.0:
1197 for y in 10, 10L, 10.0:
1198 for z in 1000, 1000L, 1000.0:
1199 if isinstance(x, float) or \
1200 isinstance(y, float) or \
1201 isinstance(z, float):
1202 self.assertRaises(TypeError, pow, x, y, z)
1203 else:
1204 self.assertAlmostEqual(pow(x, y, z), 24.0)
1205
1206 self.assertRaises(TypeError, pow, -1, -2, 3)
1207 self.assertRaises(ValueError, pow, 1, 2, 0)
1208 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1209 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1210 self.assertRaises(ValueError, pow, -342.43, 0.234)
1211
1212 self.assertRaises(TypeError, pow)
1213
1214 def test_range(self):
1215 self.assertEqual(range(3), [0, 1, 2])
1216 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1217 self.assertEqual(range(0), [])
1218 self.assertEqual(range(-3), [])
1219 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1220 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1221
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001222 # Now test range() with longs
1223 self.assertEqual(range(-2**100), [])
1224 self.assertEqual(range(0, -2**100), [])
1225 self.assertEqual(range(0, 2**100, -1), [])
1226 self.assertEqual(range(0, 2**100, -1), [])
1227
1228 a = long(10 * sys.maxint)
1229 b = long(100 * sys.maxint)
1230 c = long(50 * sys.maxint)
1231
1232 self.assertEqual(range(a, a+2), [a, a+1])
1233 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1234 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1235
1236 seq = range(a, b, c)
1237 self.assert_(a in seq)
1238 self.assert_(b not in seq)
1239 self.assertEqual(len(seq), 2)
1240
1241 seq = range(b, a, -c)
1242 self.assert_(b in seq)
1243 self.assert_(a not in seq)
1244 self.assertEqual(len(seq), 2)
1245
1246 seq = range(-a, -b, -c)
1247 self.assert_(-a in seq)
1248 self.assert_(-b not in seq)
1249 self.assertEqual(len(seq), 2)
1250
Walter Dörwald919497e2003-01-19 16:23:59 +00001251 self.assertRaises(TypeError, range)
1252 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1253 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001254 self.assertRaises(ValueError, range, a, a + 1, long(0))
1255
1256 class badzero(int):
1257 def __cmp__(self, other):
1258 raise RuntimeError
1259 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001260
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001261 # Reject floats when it would require PyLongs to represent.
1262 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001263 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001264
Walter Dörwald357981e2003-04-15 18:59:28 +00001265 self.assertRaises(TypeError, range, 0, "spam")
1266 self.assertRaises(TypeError, range, 0, 42, "spam")
1267
1268 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1269 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1270
Walter Dörwald919497e2003-01-19 16:23:59 +00001271 def test_input_and_raw_input(self):
1272 self.write_testfile()
1273 fp = open(TESTFN, 'r')
1274 savestdin = sys.stdin
1275 savestdout = sys.stdout # Eats the echo
1276 try:
1277 sys.stdin = fp
1278 sys.stdout = BitBucket()
1279 self.assertEqual(input(), 2)
1280 self.assertEqual(input('testing\n'), 2)
1281 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1282 self.assertEqual(raw_input('testing\n'), 'Dear John')
1283 sys.stdin = cStringIO.StringIO("NULL\0")
1284 self.assertRaises(TypeError, input, 42, 42)
1285 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1286 self.assertEqual(input(), 'whitespace')
1287 sys.stdin = cStringIO.StringIO()
1288 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001289
1290 # SF 876178: make sure input() respect future options.
1291 sys.stdin = cStringIO.StringIO('1/2')
1292 sys.stdout = cStringIO.StringIO()
1293 exec compile('print input()', 'test_builtin_tmp', 'exec')
1294 sys.stdin.seek(0, 0)
1295 exec compile('from __future__ import division;print input()',
1296 'test_builtin_tmp', 'exec')
1297 sys.stdin.seek(0, 0)
1298 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001299 # The result we expect depends on whether new division semantics
1300 # are already in effect.
1301 if 1/2 == 0:
1302 # This test was compiled with old semantics.
1303 expected = ['0', '0.5', '0']
1304 else:
1305 # This test was compiled with new semantics (e.g., -Qnew
1306 # was given on the command line.
1307 expected = ['0.5', '0.5', '0.5']
1308 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001309
Walter Dörwald919497e2003-01-19 16:23:59 +00001310 del sys.stdout
1311 self.assertRaises(RuntimeError, input, 'prompt')
1312 del sys.stdin
1313 self.assertRaises(RuntimeError, input, 'prompt')
1314 finally:
1315 sys.stdin = savestdin
1316 sys.stdout = savestdout
1317 fp.close()
1318 unlink(TESTFN)
1319
1320 def test_reduce(self):
1321 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1322 self.assertEqual(
1323 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1324 ['a','c','d','w']
1325 )
1326 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1327 self.assertEqual(
1328 reduce(lambda x, y: x*y, range(2,21), 1L),
1329 2432902008176640000L
1330 )
1331 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1332 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1333 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1334 self.assertRaises(TypeError, reduce)
1335 self.assertRaises(TypeError, reduce, 42, 42)
1336 self.assertRaises(TypeError, reduce, 42, 42, 42)
1337 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1338 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1339 self.assertRaises(TypeError, reduce, 42, (42, 42))
1340
1341 class BadSeq:
1342 def __getitem__(self, index):
1343 raise ValueError
1344 self.assertRaises(ValueError, reduce, 42, BadSeq())
1345
1346 def test_reload(self):
1347 import marshal
1348 reload(marshal)
1349 import string
1350 reload(string)
1351 ## import sys
1352 ## self.assertRaises(ImportError, reload, sys)
1353
1354 def test_repr(self):
1355 self.assertEqual(repr(''), '\'\'')
1356 self.assertEqual(repr(0), '0')
1357 self.assertEqual(repr(0L), '0L')
1358 self.assertEqual(repr(()), '()')
1359 self.assertEqual(repr([]), '[]')
1360 self.assertEqual(repr({}), '{}')
1361 a = []
1362 a.append(a)
1363 self.assertEqual(repr(a), '[[...]]')
1364 a = {}
1365 a[0] = a
1366 self.assertEqual(repr(a), '{0: {...}}')
1367
1368 def test_round(self):
1369 self.assertEqual(round(0.0), 0.0)
1370 self.assertEqual(round(1.0), 1.0)
1371 self.assertEqual(round(10.0), 10.0)
1372 self.assertEqual(round(1000000000.0), 1000000000.0)
1373 self.assertEqual(round(1e20), 1e20)
1374
1375 self.assertEqual(round(-1.0), -1.0)
1376 self.assertEqual(round(-10.0), -10.0)
1377 self.assertEqual(round(-1000000000.0), -1000000000.0)
1378 self.assertEqual(round(-1e20), -1e20)
1379
1380 self.assertEqual(round(0.1), 0.0)
1381 self.assertEqual(round(1.1), 1.0)
1382 self.assertEqual(round(10.1), 10.0)
1383 self.assertEqual(round(1000000000.1), 1000000000.0)
1384
1385 self.assertEqual(round(-1.1), -1.0)
1386 self.assertEqual(round(-10.1), -10.0)
1387 self.assertEqual(round(-1000000000.1), -1000000000.0)
1388
1389 self.assertEqual(round(0.9), 1.0)
1390 self.assertEqual(round(9.9), 10.0)
1391 self.assertEqual(round(999999999.9), 1000000000.0)
1392
1393 self.assertEqual(round(-0.9), -1.0)
1394 self.assertEqual(round(-9.9), -10.0)
1395 self.assertEqual(round(-999999999.9), -1000000000.0)
1396
1397 self.assertEqual(round(-8.0, -1), -10.0)
1398
Georg Brandlccadf842006-03-31 18:54:53 +00001399 # test new kwargs
1400 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1401
Walter Dörwald919497e2003-01-19 16:23:59 +00001402 self.assertRaises(TypeError, round)
1403
1404 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001405 setattr(sys, 'spam', 1)
1406 self.assertEqual(sys.spam, 1)
1407 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1408 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001409
1410 def test_str(self):
1411 self.assertEqual(str(''), '')
1412 self.assertEqual(str(0), '0')
1413 self.assertEqual(str(0L), '0')
1414 self.assertEqual(str(()), '()')
1415 self.assertEqual(str([]), '[]')
1416 self.assertEqual(str({}), '{}')
1417 a = []
1418 a.append(a)
1419 self.assertEqual(str(a), '[[...]]')
1420 a = {}
1421 a[0] = a
1422 self.assertEqual(str(a), '{0: {...}}')
1423
Alex Martellia70b1912003-04-22 08:12:33 +00001424 def test_sum(self):
1425 self.assertEqual(sum([]), 0)
1426 self.assertEqual(sum(range(2,8)), 27)
1427 self.assertEqual(sum(iter(range(2,8))), 27)
1428 self.assertEqual(sum(Squares(10)), 285)
1429 self.assertEqual(sum(iter(Squares(10))), 285)
1430 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1431
1432 self.assertRaises(TypeError, sum)
1433 self.assertRaises(TypeError, sum, 42)
1434 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1435 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1436 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1437 self.assertRaises(TypeError, sum, [{2:3}])
1438 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1439
1440 class BadSeq:
1441 def __getitem__(self, index):
1442 raise ValueError
1443 self.assertRaises(ValueError, sum, BadSeq())
1444
Walter Dörwald919497e2003-01-19 16:23:59 +00001445 def test_tuple(self):
1446 self.assertEqual(tuple(()), ())
1447 t0_3 = (0, 1, 2, 3)
1448 t0_3_bis = tuple(t0_3)
1449 self.assert_(t0_3 is t0_3_bis)
1450 self.assertEqual(tuple([]), ())
1451 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1452 self.assertEqual(tuple(''), ())
1453 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1454
1455 def test_type(self):
1456 self.assertEqual(type(''), type('123'))
1457 self.assertNotEqual(type(''), type(()))
1458
1459 def test_unichr(self):
1460 if have_unicode:
1461 self.assertEqual(unichr(32), unicode(' '))
1462 self.assertEqual(unichr(65), unicode('A'))
1463 self.assertEqual(unichr(97), unicode('a'))
1464 self.assertEqual(
1465 unichr(sys.maxunicode),
1466 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1467 )
1468 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1469 self.assertRaises(TypeError, unichr)
1470
Guido van Rossumfee7b932005-01-16 00:21:28 +00001471 # We don't want self in vars(), so these are static methods
1472
1473 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001474 def get_vars_f0():
1475 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001476
Guido van Rossumfee7b932005-01-16 00:21:28 +00001477 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001478 def get_vars_f2():
1479 BuiltinTest.get_vars_f0()
1480 a = 1
1481 b = 2
1482 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001483
1484 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001485 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001486 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001487 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001488 self.assertEqual(self.get_vars_f0(), {})
1489 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1490 self.assertRaises(TypeError, vars, 42, 42)
1491 self.assertRaises(TypeError, vars, 42)
1492
1493 def test_zip(self):
1494 a = (1, 2, 3)
1495 b = (4, 5, 6)
1496 t = [(1, 4), (2, 5), (3, 6)]
1497 self.assertEqual(zip(a, b), t)
1498 b = [4, 5, 6]
1499 self.assertEqual(zip(a, b), t)
1500 b = (4, 5, 6, 7)
1501 self.assertEqual(zip(a, b), t)
1502 class I:
1503 def __getitem__(self, i):
1504 if i < 0 or i > 2: raise IndexError
1505 return i + 4
1506 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001507 self.assertEqual(zip(), [])
1508 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001509 self.assertRaises(TypeError, zip, None)
1510 class G:
1511 pass
1512 self.assertRaises(TypeError, zip, a, G())
1513
1514 # Make sure zip doesn't try to allocate a billion elements for the
1515 # result list when one of its arguments doesn't say how long it is.
1516 # A MemoryError is the most likely failure mode.
1517 class SequenceWithoutALength:
1518 def __getitem__(self, i):
1519 if i == 5:
1520 raise IndexError
1521 else:
1522 return i
1523 self.assertEqual(
1524 zip(SequenceWithoutALength(), xrange(2**30)),
1525 list(enumerate(range(5)))
1526 )
1527
1528 class BadSeq:
1529 def __getitem__(self, i):
1530 if i == 5:
1531 raise ValueError
1532 else:
1533 return i
1534 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1535
Raymond Hettinger64958a12003-12-17 20:43:33 +00001536class TestSorted(unittest.TestCase):
1537
1538 def test_basic(self):
1539 data = range(100)
1540 copy = data[:]
1541 random.shuffle(copy)
1542 self.assertEqual(data, sorted(copy))
1543 self.assertNotEqual(data, copy)
1544
1545 data.reverse()
1546 random.shuffle(copy)
1547 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1548 self.assertNotEqual(data, copy)
1549 random.shuffle(copy)
1550 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1551 self.assertNotEqual(data, copy)
1552 random.shuffle(copy)
1553 self.assertEqual(data, sorted(copy, reverse=1))
1554 self.assertNotEqual(data, copy)
1555
1556 def test_inputtypes(self):
1557 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001558 types = [list, tuple]
1559 if have_unicode:
1560 types.insert(0, unicode)
1561 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001562 self.assertEqual(sorted(s), sorted(T(s)))
1563
1564 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001565 types = [set, frozenset, list, tuple, dict.fromkeys]
1566 if have_unicode:
1567 types.insert(0, unicode)
1568 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001569 self.assertEqual(sorted(s), sorted(T(s)))
1570
1571 def test_baddecorator(self):
1572 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1573 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1574
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001575def test_main(verbose=None):
1576 test_classes = (BuiltinTest, TestSorted)
1577
1578 run_unittest(*test_classes)
1579
1580 # verify reference counting
1581 if verbose and hasattr(sys, "gettotalrefcount"):
1582 import gc
1583 counts = [None] * 5
1584 for i in xrange(len(counts)):
1585 run_unittest(*test_classes)
1586 gc.collect()
1587 counts[i] = sys.gettotalrefcount()
1588 print counts
1589
Walter Dörwald919497e2003-01-19 16:23:59 +00001590
1591if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001592 test_main(verbose=True)