blob: 52c1fe0eeee5be269c1ee75c2b9bd9f5531399bd [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)
111
112 def test_abs(self):
113 # int
114 self.assertEqual(abs(0), 0)
115 self.assertEqual(abs(1234), 1234)
116 self.assertEqual(abs(-1234), 1234)
117 # float
118 self.assertEqual(abs(0.0), 0.0)
119 self.assertEqual(abs(3.14), 3.14)
120 self.assertEqual(abs(-3.14), 3.14)
121 # long
122 self.assertEqual(abs(0L), 0L)
123 self.assertEqual(abs(1234L), 1234L)
124 self.assertEqual(abs(-1234L), 1234L)
125 # str
126 self.assertRaises(TypeError, abs, 'a')
127
Raymond Hettinger96229b12005-03-11 06:49:40 +0000128 def test_all(self):
129 self.assertEqual(all([2, 4, 6]), True)
130 self.assertEqual(all([2, None, 6]), False)
131 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
132 self.assertRaises(RuntimeError, all, TestFailingIter())
133 self.assertRaises(TypeError, all, 10) # Non-iterable
134 self.assertRaises(TypeError, all) # No args
135 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
136 self.assertEqual(all([]), True) # Empty iterator
137 S = [50, 60]
138 self.assertEqual(all(x > 42 for x in S), True)
139 S = [50, 40, 60]
140 self.assertEqual(all(x > 42 for x in S), False)
141
142 def test_any(self):
143 self.assertEqual(any([None, None, None]), False)
144 self.assertEqual(any([None, 4, None]), True)
145 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
146 self.assertRaises(RuntimeError, all, TestFailingIter())
147 self.assertRaises(TypeError, any, 10) # Non-iterable
148 self.assertRaises(TypeError, any) # No args
149 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
150 self.assertEqual(any([]), False) # Empty iterator
151 S = [40, 60, 30]
152 self.assertEqual(any(x > 42 for x in S), True)
153 S = [10, 20, 30]
154 self.assertEqual(any(x > 42 for x in S), False)
155
Walter Dörwald919497e2003-01-19 16:23:59 +0000156 def test_apply(self):
157 def f0(*args):
158 self.assertEqual(args, ())
159 def f1(a1):
160 self.assertEqual(a1, 1)
161 def f2(a1, a2):
162 self.assertEqual(a1, 1)
163 self.assertEqual(a2, 2)
164 def f3(a1, a2, a3):
165 self.assertEqual(a1, 1)
166 self.assertEqual(a2, 2)
167 self.assertEqual(a3, 3)
168 apply(f0, ())
169 apply(f1, (1,))
170 apply(f2, (1, 2))
171 apply(f3, (1, 2, 3))
172
173 # A PyCFunction that takes only positional parameters should allow an
174 # empty keyword dictionary to pass without a complaint, but raise a
175 # TypeError if the dictionary is non-empty.
176 apply(id, (1,), {})
177 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
178 self.assertRaises(TypeError, apply)
179 self.assertRaises(TypeError, apply, id, 42)
180 self.assertRaises(TypeError, apply, id, (42,), 42)
181
182 def test_callable(self):
183 self.assert_(callable(len))
184 def f(): pass
185 self.assert_(callable(f))
186 class C:
187 def meth(self): pass
188 self.assert_(callable(C))
189 x = C()
190 self.assert_(callable(x.meth))
191 self.assert_(not callable(x))
192 class D(C):
193 def __call__(self): pass
194 y = D()
195 self.assert_(callable(y))
196 y()
197
198 def test_chr(self):
199 self.assertEqual(chr(32), ' ')
200 self.assertEqual(chr(65), 'A')
201 self.assertEqual(chr(97), 'a')
202 self.assertEqual(chr(0xff), '\xff')
203 self.assertRaises(ValueError, chr, 256)
204 self.assertRaises(TypeError, chr)
205
206 def test_cmp(self):
207 self.assertEqual(cmp(-1, 1), -1)
208 self.assertEqual(cmp(1, -1), 1)
209 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000210 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 a = []; a.append(a)
212 b = []; b.append(b)
213 from UserList import UserList
214 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000215 self.assertRaises(RuntimeError, cmp, a, b)
216 self.assertRaises(RuntimeError, cmp, b, c)
217 self.assertRaises(RuntimeError, cmp, c, a)
218 self.assertRaises(RuntimeError, cmp, a, c)
219 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 a.pop(); b.pop(); c.pop()
221 self.assertRaises(TypeError, cmp)
222
223 def test_coerce(self):
224 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
225 self.assertEqual(coerce(1, 1L), (1L, 1L))
226 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
227 self.assertRaises(TypeError, coerce)
228 class BadNumber:
229 def __coerce__(self, other):
230 raise ValueError
231 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000232 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000233
234 def test_compile(self):
235 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000236 bom = '\xef\xbb\xbf'
237 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000238 self.assertRaises(TypeError, compile)
239 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
240 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000241 if have_unicode:
242 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000243
Walter Dörwald919497e2003-01-19 16:23:59 +0000244 def test_delattr(self):
245 import sys
246 sys.spam = 1
247 delattr(sys, 'spam')
248 self.assertRaises(TypeError, delattr)
249
250 def test_dir(self):
251 x = 1
252 self.assert_('x' in dir())
253 import sys
254 self.assert_('modules' in dir(sys))
255 self.assertRaises(TypeError, dir, 42, 42)
256
257 def test_divmod(self):
258 self.assertEqual(divmod(12, 7), (1, 5))
259 self.assertEqual(divmod(-12, 7), (-2, 2))
260 self.assertEqual(divmod(12, -7), (-2, -2))
261 self.assertEqual(divmod(-12, -7), (1, -5))
262
263 self.assertEqual(divmod(12L, 7L), (1L, 5L))
264 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
265 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
266 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
267
268 self.assertEqual(divmod(12, 7L), (1, 5L))
269 self.assertEqual(divmod(-12, 7L), (-2, 2L))
270 self.assertEqual(divmod(12L, -7), (-2L, -2))
271 self.assertEqual(divmod(-12L, -7), (1L, -5))
272
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000273 self.assertEqual(divmod(-sys.maxint-1, -1),
274 (sys.maxint+1, 0))
275
Walter Dörwald919497e2003-01-19 16:23:59 +0000276 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
277 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
278 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
279 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
280
281 self.assertRaises(TypeError, divmod)
282
283 def test_eval(self):
284 self.assertEqual(eval('1+1'), 2)
285 self.assertEqual(eval(' 1+1\n'), 2)
286 globals = {'a': 1, 'b': 2}
287 locals = {'b': 200, 'c': 300}
288 self.assertEqual(eval('a', globals) , 1)
289 self.assertEqual(eval('a', globals, locals), 1)
290 self.assertEqual(eval('b', globals, locals), 200)
291 self.assertEqual(eval('c', globals, locals), 300)
292 if have_unicode:
293 self.assertEqual(eval(unicode('1+1')), 2)
294 self.assertEqual(eval(unicode(' 1+1\n')), 2)
295 globals = {'a': 1, 'b': 2}
296 locals = {'b': 200, 'c': 300}
297 if have_unicode:
298 self.assertEqual(eval(unicode('a'), globals), 1)
299 self.assertEqual(eval(unicode('a'), globals, locals), 1)
300 self.assertEqual(eval(unicode('b'), globals, locals), 200)
301 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000302 bom = '\xef\xbb\xbf'
303 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000304 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
305 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000306 self.assertRaises(TypeError, eval)
307 self.assertRaises(TypeError, eval, ())
308
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000309 def test_general_eval(self):
310 # Tests that general mappings can be used for the locals argument
311
312 class M:
313 "Test mapping interface versus possible calls from eval()."
314 def __getitem__(self, key):
315 if key == 'a':
316 return 12
317 raise KeyError
318 def keys(self):
319 return list('xyz')
320
321 m = M()
322 g = globals()
323 self.assertEqual(eval('a', g, m), 12)
324 self.assertRaises(NameError, eval, 'b', g, m)
325 self.assertEqual(eval('dir()', g, m), list('xyz'))
326 self.assertEqual(eval('globals()', g, m), g)
327 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000328 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000329 class A:
330 "Non-mapping"
331 pass
332 m = A()
333 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000334
335 # Verify that dict subclasses work as well
336 class D(dict):
337 def __getitem__(self, key):
338 if key == 'a':
339 return 12
340 return dict.__getitem__(self, key)
341 def keys(self):
342 return list('xyz')
343
344 d = D()
345 self.assertEqual(eval('a', g, d), 12)
346 self.assertRaises(NameError, eval, 'b', g, d)
347 self.assertEqual(eval('dir()', g, d), list('xyz'))
348 self.assertEqual(eval('globals()', g, d), g)
349 self.assertEqual(eval('locals()', g, d), d)
350
351 # Verify locals stores (used by list comps)
352 eval('[locals() for i in (2,3)]', g, d)
353 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
354
355 class SpreadSheet:
356 "Sample application showing nested, calculated lookups."
357 _cells = {}
358 def __setitem__(self, key, formula):
359 self._cells[key] = formula
360 def __getitem__(self, key ):
361 return eval(self._cells[key], globals(), self)
362
363 ss = SpreadSheet()
364 ss['a1'] = '5'
365 ss['a2'] = 'a1*6'
366 ss['a3'] = 'a2*7'
367 self.assertEqual(ss['a3'], 210)
368
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000369 # Verify that dir() catches a non-list returned by eval
370 # SF bug #1004669
371 class C:
372 def __getitem__(self, item):
373 raise KeyError(item)
374 def keys(self):
375 return 'a'
376 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
377
Walter Dörwald919497e2003-01-19 16:23:59 +0000378 # Done outside of the method test_z to get the correct scope
379 z = 0
380 f = open(TESTFN, 'w')
381 f.write('z = z+1\n')
382 f.write('z = z*2\n')
383 f.close()
384 execfile(TESTFN)
385
386 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000387 global numruns
388 if numruns:
389 return
390 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000391
Walter Dörwald919497e2003-01-19 16:23:59 +0000392 globals = {'a': 1, 'b': 2}
393 locals = {'b': 200, 'c': 300}
394
395 self.assertEqual(self.__class__.z, 2)
396 globals['z'] = 0
397 execfile(TESTFN, globals)
398 self.assertEqual(globals['z'], 2)
399 locals['z'] = 0
400 execfile(TESTFN, globals, locals)
401 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000402
403 class M:
404 "Test mapping interface versus possible calls from execfile()."
405 def __init__(self):
406 self.z = 10
407 def __getitem__(self, key):
408 if key == 'z':
409 return self.z
410 raise KeyError
411 def __setitem__(self, key, value):
412 if key == 'z':
413 self.z = value
414 return
415 raise KeyError
416
417 locals = M()
418 locals['z'] = 0
419 execfile(TESTFN, globals, locals)
420 self.assertEqual(locals['z'], 2)
421
Walter Dörwald919497e2003-01-19 16:23:59 +0000422 unlink(TESTFN)
423 self.assertRaises(TypeError, execfile)
424 import os
425 self.assertRaises(IOError, execfile, os.curdir)
426 self.assertRaises(IOError, execfile, "I_dont_exist")
427
428 def test_filter(self):
429 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
430 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
431 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
432 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
433 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
434 def identity(item):
435 return 1
436 filter(identity, Squares(5))
437 self.assertRaises(TypeError, filter)
438 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000439 def __getitem__(self, index):
440 if index<4:
441 return 42
442 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000443 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
444 def badfunc():
445 pass
446 self.assertRaises(TypeError, filter, badfunc, range(5))
447
Walter Dörwaldbf517072003-01-27 15:57:14 +0000448 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000449 self.assertEqual(filter(None, (1, 2)), (1, 2))
450 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
451 self.assertRaises(TypeError, filter, 42, (1, 2))
452
Walter Dörwaldbf517072003-01-27 15:57:14 +0000453 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000454 self.assertEqual(filter(None, "12"), "12")
455 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
456 self.assertRaises(TypeError, filter, 42, "12")
457 class badstr(str):
458 def __getitem__(self, index):
459 raise ValueError
460 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000461
Walter Dörwald903f1e02003-02-04 16:28:00 +0000462 class badstr2(str):
463 def __getitem__(self, index):
464 return 42
465 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
466
467 class weirdstr(str):
468 def __getitem__(self, index):
469 return weirdstr(2*str.__getitem__(self, index))
470 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
471
Walter Dörwald5e61e242003-02-04 17:04:01 +0000472 class shiftstr(str):
473 def __getitem__(self, index):
474 return chr(ord(str.__getitem__(self, index))+1)
475 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
476
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000477 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000478 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000479 self.assertEqual(filter(None, unicode("12")), unicode("12"))
480 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
481 self.assertRaises(TypeError, filter, 42, unicode("12"))
482 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000483
Walter Dörwald903f1e02003-02-04 16:28:00 +0000484 class badunicode(unicode):
485 def __getitem__(self, index):
486 return 42
487 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
488
489 class weirdunicode(unicode):
490 def __getitem__(self, index):
491 return weirdunicode(2*unicode.__getitem__(self, index))
492 self.assertEqual(
493 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
494
Walter Dörwald5e61e242003-02-04 17:04:01 +0000495 class shiftunicode(unicode):
496 def __getitem__(self, index):
497 return unichr(ord(unicode.__getitem__(self, index))+1)
498 self.assertEqual(
499 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
500 unicode("345")
501 )
502
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000503 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000504 # test that filter() never returns tuple, str or unicode subclasses
505 # and that the result always goes through __getitem__
506 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000507 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000508 def __getitem__(self, index):
509 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000510 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000511 def __getitem__(self, index):
512 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000513 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000514 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000515 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000516 }
517 if have_unicode:
518 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000519 def __getitem__(self, index):
520 return 2*unicode.__getitem__(self, index)
521 inputs[unicode2] = {
522 unicode(): unicode(),
523 unicode("123"): unicode("112233")
524 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000525
Walter Dörwald1918f772003-02-10 13:19:13 +0000526 for (cls, inps) in inputs.iteritems():
527 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000528 # make sure the output goes through __getitem__
529 # even if func is None
530 self.assertEqual(
531 filter(funcs[0], cls(inp)),
532 filter(funcs[1], cls(inp))
533 )
534 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000535 outp = filter(func, cls(inp))
536 self.assertEqual(outp, exp)
537 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000538
Walter Dörwald919497e2003-01-19 16:23:59 +0000539 def test_float(self):
540 self.assertEqual(float(3.14), 3.14)
541 self.assertEqual(float(314), 314.0)
542 self.assertEqual(float(314L), 314.0)
543 self.assertEqual(float(" 3.14 "), 3.14)
544 if have_unicode:
545 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
546 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
547
Brett Cannonc3647ac2005-04-26 03:45:26 +0000548 def test_floatconversion(self):
549 # Make sure that calls to __float__() work properly
550 class Foo0:
551 def __float__(self):
552 return 42.
553
554 class Foo1(object):
555 def __float__(self):
556 return 42.
557
558 class Foo2(float):
559 def __float__(self):
560 return 42.
561
562 class Foo3(float):
563 def __new__(cls, value=0.):
564 return float.__new__(cls, 2*value)
565
566 def __float__(self):
567 return self
568
569 class Foo4(float):
570 def __float__(self):
571 return 42
572
573 self.assertAlmostEqual(float(Foo0()), 42.)
574 self.assertAlmostEqual(float(Foo1()), 42.)
575 self.assertAlmostEqual(float(Foo2()), 42.)
576 self.assertAlmostEqual(float(Foo3(21)), 42.)
577 self.assertRaises(TypeError, float, Foo4(42))
578
Walter Dörwald919497e2003-01-19 16:23:59 +0000579 def test_getattr(self):
580 import sys
581 self.assert_(getattr(sys, 'stdout') is sys.stdout)
582 self.assertRaises(TypeError, getattr, sys, 1)
583 self.assertRaises(TypeError, getattr, sys, 1, "foo")
584 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000585 if have_unicode:
586 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000587
588 def test_hasattr(self):
589 import sys
590 self.assert_(hasattr(sys, 'stdout'))
591 self.assertRaises(TypeError, hasattr, sys, 1)
592 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000593 if have_unicode:
594 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000595
596 def test_hash(self):
597 hash(None)
598 self.assertEqual(hash(1), hash(1L))
599 self.assertEqual(hash(1), hash(1.0))
600 hash('spam')
601 if have_unicode:
602 self.assertEqual(hash('spam'), hash(unicode('spam')))
603 hash((0,1,2,3))
604 def f(): pass
605 self.assertRaises(TypeError, hash, [])
606 self.assertRaises(TypeError, hash, {})
607
608 def test_hex(self):
609 self.assertEqual(hex(16), '0x10')
610 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000611 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000612 self.assertEqual(hex(-16L), '-0x10L')
613 self.assertRaises(TypeError, hex, {})
614
615 def test_id(self):
616 id(None)
617 id(1)
618 id(1L)
619 id(1.0)
620 id('spam')
621 id((0,1,2,3))
622 id([0,1,2,3])
623 id({'spam': 1, 'eggs': 2, 'ham': 3})
624
625 # Test input() later, together with raw_input
626
627 def test_int(self):
628 self.assertEqual(int(314), 314)
629 self.assertEqual(int(3.14), 3)
630 self.assertEqual(int(314L), 314)
631 # Check that conversion from float truncates towards zero
632 self.assertEqual(int(-3.14), -3)
633 self.assertEqual(int(3.9), 3)
634 self.assertEqual(int(-3.9), -3)
635 self.assertEqual(int(3.5), 3)
636 self.assertEqual(int(-3.5), -3)
637 # Different base:
638 self.assertEqual(int("10",16), 16L)
639 if have_unicode:
640 self.assertEqual(int(unicode("10"),16), 16L)
641 # Test conversion from strings and various anomalies
642 for s, v in L:
643 for sign in "", "+", "-":
644 for prefix in "", " ", "\t", " \t\t ":
645 ss = prefix + sign + s
646 vv = v
647 if sign == "-" and v is not ValueError:
648 vv = -v
649 try:
650 self.assertEqual(int(ss), vv)
651 except v:
652 pass
653
Walter Dörwald70a6b492004-02-12 17:35:32 +0000654 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 self.assertEqual(int(s)+1, -sys.maxint)
656 # should return long
657 int(s[1:])
658
659 # should return long
660 x = int(1e100)
661 self.assert_(isinstance(x, long))
662 x = int(-1e100)
663 self.assert_(isinstance(x, long))
664
665
666 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
667 # Worked by accident in Windows release build, but failed in debug build.
668 # Failed in all Linux builds.
669 x = -1-sys.maxint
670 self.assertEqual(x >> 1, x//2)
671
672 self.assertRaises(ValueError, int, '123\0')
673 self.assertRaises(ValueError, int, '53', 40)
674
675 x = int('1' * 600)
676 self.assert_(isinstance(x, long))
677
678 if have_unicode:
679 x = int(unichr(0x661) * 600)
680 self.assert_(isinstance(x, long))
681
682 self.assertRaises(TypeError, int, 1, 12)
683
684 self.assertEqual(int('0123', 0), 83)
685
Brett Cannonc3647ac2005-04-26 03:45:26 +0000686 def test_intconversion(self):
687 # Test __int__()
688 class Foo0:
689 def __int__(self):
690 return 42
691
692 class Foo1(object):
693 def __int__(self):
694 return 42
695
696 class Foo2(int):
697 def __int__(self):
698 return 42
699
700 class Foo3(int):
701 def __int__(self):
702 return self
703
704 class Foo4(int):
705 def __int__(self):
706 return 42L
707
708 class Foo5(int):
709 def __int__(self):
710 return 42.
711
712 self.assertEqual(int(Foo0()), 42)
713 self.assertEqual(int(Foo1()), 42)
714 self.assertEqual(int(Foo2()), 42)
715 self.assertEqual(int(Foo3()), 0)
716 self.assertEqual(int(Foo4()), 42L)
717 self.assertRaises(TypeError, int, Foo5())
718
Walter Dörwald919497e2003-01-19 16:23:59 +0000719 def test_intern(self):
720 self.assertRaises(TypeError, intern)
721 s = "never interned before"
722 self.assert_(intern(s) is s)
723 s2 = s.swapcase().swapcase()
724 self.assert_(intern(s2) is s)
725
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000726 # Subclasses of string can't be interned, because they
727 # provide too much opportunity for insane things to happen.
728 # We don't want them in the interned dict and if they aren't
729 # actually interned, we don't want to create the appearance
730 # that they are by allowing intern() to succeeed.
731 class S(str):
732 def __hash__(self):
733 return 123
734
735 self.assertRaises(TypeError, intern, S("abc"))
736
737 # It's still safe to pass these strings to routines that
738 # call intern internally, e.g. PyObject_SetAttr().
739 s = S("abc")
740 setattr(s, s, s)
741 self.assertEqual(getattr(s, s), s)
742
Walter Dörwald919497e2003-01-19 16:23:59 +0000743 def test_iter(self):
744 self.assertRaises(TypeError, iter)
745 self.assertRaises(TypeError, iter, 42, 42)
746 lists = [("1", "2"), ["1", "2"], "12"]
747 if have_unicode:
748 lists.append(unicode("12"))
749 for l in lists:
750 i = iter(l)
751 self.assertEqual(i.next(), '1')
752 self.assertEqual(i.next(), '2')
753 self.assertRaises(StopIteration, i.next)
754
755 def test_isinstance(self):
756 class C:
757 pass
758 class D(C):
759 pass
760 class E:
761 pass
762 c = C()
763 d = D()
764 e = E()
765 self.assert_(isinstance(c, C))
766 self.assert_(isinstance(d, C))
767 self.assert_(not isinstance(e, C))
768 self.assert_(not isinstance(c, D))
769 self.assert_(not isinstance('foo', E))
770 self.assertRaises(TypeError, isinstance, E, 'foo')
771 self.assertRaises(TypeError, isinstance)
772
773 def test_issubclass(self):
774 class C:
775 pass
776 class D(C):
777 pass
778 class E:
779 pass
780 c = C()
781 d = D()
782 e = E()
783 self.assert_(issubclass(D, C))
784 self.assert_(issubclass(C, C))
785 self.assert_(not issubclass(C, D))
786 self.assertRaises(TypeError, issubclass, 'foo', E)
787 self.assertRaises(TypeError, issubclass, E, 'foo')
788 self.assertRaises(TypeError, issubclass)
789
790 def test_len(self):
791 self.assertEqual(len('123'), 3)
792 self.assertEqual(len(()), 0)
793 self.assertEqual(len((1, 2, 3, 4)), 4)
794 self.assertEqual(len([1, 2, 3, 4]), 4)
795 self.assertEqual(len({}), 0)
796 self.assertEqual(len({'a':1, 'b': 2}), 2)
797 class BadSeq:
798 def __len__(self):
799 raise ValueError
800 self.assertRaises(ValueError, len, BadSeq())
801
802 def test_list(self):
803 self.assertEqual(list([]), [])
804 l0_3 = [0, 1, 2, 3]
805 l0_3_bis = list(l0_3)
806 self.assertEqual(l0_3, l0_3_bis)
807 self.assert_(l0_3 is not l0_3_bis)
808 self.assertEqual(list(()), [])
809 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
810 self.assertEqual(list(''), [])
811 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
812
813 if sys.maxint == 0x7fffffff:
814 # This test can currently only work on 32-bit machines.
815 # XXX If/when PySequence_Length() returns a ssize_t, it should be
816 # XXX re-enabled.
817 # Verify clearing of bug #556025.
818 # This assumes that the max data size (sys.maxint) == max
819 # address size this also assumes that the address size is at
820 # least 4 bytes with 8 byte addresses, the bug is not well
821 # tested
822 #
823 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
824 # earlier due to a newlib bug. See the following mailing list
825 # thread for the details:
826
827 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
828 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
829
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000830 # This code used to segfault in Py2.4a3
831 x = []
832 x.extend(-y for y in x)
833 self.assertEqual(x, [])
834
Walter Dörwald919497e2003-01-19 16:23:59 +0000835 def test_long(self):
836 self.assertEqual(long(314), 314L)
837 self.assertEqual(long(3.14), 3L)
838 self.assertEqual(long(314L), 314L)
839 # Check that conversion from float truncates towards zero
840 self.assertEqual(long(-3.14), -3L)
841 self.assertEqual(long(3.9), 3L)
842 self.assertEqual(long(-3.9), -3L)
843 self.assertEqual(long(3.5), 3L)
844 self.assertEqual(long(-3.5), -3L)
845 self.assertEqual(long("-3"), -3L)
846 if have_unicode:
847 self.assertEqual(long(unicode("-3")), -3L)
848 # Different base:
849 self.assertEqual(long("10",16), 16L)
850 if have_unicode:
851 self.assertEqual(long(unicode("10"),16), 16L)
852 # Check conversions from string (same test set as for int(), and then some)
853 LL = [
854 ('1' + '0'*20, 10L**20),
855 ('1' + '0'*100, 10L**100)
856 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000857 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000858 if have_unicode:
859 L2 += [
860 (unicode('1') + unicode('0')*20, 10L**20),
861 (unicode('1') + unicode('0')*100, 10L**100),
862 ]
863 for s, v in L2 + LL:
864 for sign in "", "+", "-":
865 for prefix in "", " ", "\t", " \t\t ":
866 ss = prefix + sign + s
867 vv = v
868 if sign == "-" and v is not ValueError:
869 vv = -v
870 try:
871 self.assertEqual(long(ss), long(vv))
872 except v:
873 pass
874
875 self.assertRaises(ValueError, long, '123\0')
876 self.assertRaises(ValueError, long, '53', 40)
877 self.assertRaises(TypeError, long, 1, 12)
878
Brett Cannonc3647ac2005-04-26 03:45:26 +0000879 def test_longconversion(self):
880 # Test __long__()
881 class Foo0:
882 def __long__(self):
883 return 42L
884
885 class Foo1(object):
886 def __long__(self):
887 return 42L
888
889 class Foo2(long):
890 def __long__(self):
891 return 42L
892
893 class Foo3(long):
894 def __long__(self):
895 return self
896
897 class Foo4(long):
898 def __long__(self):
899 return 42
900
901 class Foo5(long):
902 def __long__(self):
903 return 42.
904
905 self.assertEqual(long(Foo0()), 42L)
906 self.assertEqual(long(Foo1()), 42L)
907 self.assertEqual(long(Foo2()), 42L)
908 self.assertEqual(long(Foo3()), 0)
909 self.assertEqual(long(Foo4()), 42)
910 self.assertRaises(TypeError, long, Foo5())
911
Walter Dörwald919497e2003-01-19 16:23:59 +0000912 def test_map(self):
913 self.assertEqual(
914 map(None, 'hello world'),
915 ['h','e','l','l','o',' ','w','o','r','l','d']
916 )
917 self.assertEqual(
918 map(None, 'abcd', 'efg'),
919 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
920 )
921 self.assertEqual(
922 map(None, range(10)),
923 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
924 )
925 self.assertEqual(
926 map(lambda x: x*x, range(1,4)),
927 [1, 4, 9]
928 )
929 try:
930 from math import sqrt
931 except ImportError:
932 def sqrt(x):
933 return pow(x, 0.5)
934 self.assertEqual(
935 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
936 [[4.0, 2.0], [9.0, 3.0]]
937 )
938 self.assertEqual(
939 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
940 [10, 4, 6]
941 )
942
943 def plus(*v):
944 accu = 0
945 for i in v: accu = accu + i
946 return accu
947 self.assertEqual(
948 map(plus, [1, 3, 7]),
949 [1, 3, 7]
950 )
951 self.assertEqual(
952 map(plus, [1, 3, 7], [4, 9, 2]),
953 [1+4, 3+9, 7+2]
954 )
955 self.assertEqual(
956 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
957 [1+4+1, 3+9+1, 7+2+0]
958 )
959 self.assertEqual(
960 map(None, Squares(10)),
961 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
962 )
963 self.assertEqual(
964 map(int, Squares(10)),
965 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
966 )
967 self.assertEqual(
968 map(None, Squares(3), Squares(2)),
969 [(0,0), (1,1), (4,None)]
970 )
971 self.assertEqual(
972 map(max, Squares(3), Squares(2)),
973 [0, 1, 4]
974 )
975 self.assertRaises(TypeError, map)
976 self.assertRaises(TypeError, map, lambda x: x, 42)
977 self.assertEqual(map(None, [42]), [42])
978 class BadSeq:
979 def __getitem__(self, index):
980 raise ValueError
981 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
982
983 def test_max(self):
984 self.assertEqual(max('123123'), '3')
985 self.assertEqual(max(1, 2, 3), 3)
986 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
987 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
988
989 self.assertEqual(max(1, 2L, 3.0), 3.0)
990 self.assertEqual(max(1L, 2.0, 3), 3)
991 self.assertEqual(max(1.0, 2, 3L), 3L)
992
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000993 for stmt in (
994 "max(key=int)", # no args
995 "max(1, key=int)", # single arg not iterable
996 "max(1, 2, keystone=int)", # wrong keyword
997 "max(1, 2, key=int, abc=int)", # two many keywords
998 "max(1, 2, key=1)", # keyfunc is not callable
999 ):
Tim Peters7f061872004-12-07 21:17:46 +00001000 try:
1001 exec(stmt) in globals()
1002 except TypeError:
1003 pass
1004 else:
1005 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001006
1007 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1008 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1009 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1010
1011 data = [random.randrange(200) for i in range(100)]
1012 keys = dict((elem, random.randrange(50)) for elem in data)
1013 f = keys.__getitem__
1014 self.assertEqual(max(data, key=f),
1015 sorted(reversed(data), key=f)[-1])
1016
Walter Dörwald919497e2003-01-19 16:23:59 +00001017 def test_min(self):
1018 self.assertEqual(min('123123'), '1')
1019 self.assertEqual(min(1, 2, 3), 1)
1020 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1021 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1022
1023 self.assertEqual(min(1, 2L, 3.0), 1)
1024 self.assertEqual(min(1L, 2.0, 3), 1L)
1025 self.assertEqual(min(1.0, 2, 3L), 1.0)
1026
1027 self.assertRaises(TypeError, min)
1028 self.assertRaises(TypeError, min, 42)
1029 self.assertRaises(ValueError, min, ())
1030 class BadSeq:
1031 def __getitem__(self, index):
1032 raise ValueError
1033 self.assertRaises(ValueError, min, BadSeq())
1034 class BadNumber:
1035 def __cmp__(self, other):
1036 raise ValueError
1037 self.assertRaises(ValueError, min, (42, BadNumber()))
1038
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001039 for stmt in (
1040 "min(key=int)", # no args
1041 "min(1, key=int)", # single arg not iterable
1042 "min(1, 2, keystone=int)", # wrong keyword
1043 "min(1, 2, key=int, abc=int)", # two many keywords
1044 "min(1, 2, key=1)", # keyfunc is not callable
1045 ):
Tim Peters7f061872004-12-07 21:17:46 +00001046 try:
1047 exec(stmt) in globals()
1048 except TypeError:
1049 pass
1050 else:
1051 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001052
1053 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1054 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1055 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1056
1057 data = [random.randrange(200) for i in range(100)]
1058 keys = dict((elem, random.randrange(50)) for elem in data)
1059 f = keys.__getitem__
1060 self.assertEqual(min(data, key=f),
1061 sorted(data, key=f)[0])
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 def test_oct(self):
1064 self.assertEqual(oct(100), '0144')
1065 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001066 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001067 self.assertEqual(oct(-100L), '-0144L')
1068 self.assertRaises(TypeError, oct, ())
1069
1070 def write_testfile(self):
1071 # NB the first 4 lines are also used to test input and raw_input, below
1072 fp = open(TESTFN, 'w')
1073 try:
1074 fp.write('1+1\n')
1075 fp.write('1+1\n')
1076 fp.write('The quick brown fox jumps over the lazy dog')
1077 fp.write('.\n')
1078 fp.write('Dear John\n')
1079 fp.write('XXX'*100)
1080 fp.write('YYY'*100)
1081 finally:
1082 fp.close()
1083
1084 def test_open(self):
1085 self.write_testfile()
1086 fp = open(TESTFN, 'r')
1087 try:
1088 self.assertEqual(fp.readline(4), '1+1\n')
1089 self.assertEqual(fp.readline(4), '1+1\n')
1090 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1091 self.assertEqual(fp.readline(4), 'Dear')
1092 self.assertEqual(fp.readline(100), ' John\n')
1093 self.assertEqual(fp.read(300), 'XXX'*100)
1094 self.assertEqual(fp.read(1000), 'YYY'*100)
1095 finally:
1096 fp.close()
1097 unlink(TESTFN)
1098
1099 def test_ord(self):
1100 self.assertEqual(ord(' '), 32)
1101 self.assertEqual(ord('A'), 65)
1102 self.assertEqual(ord('a'), 97)
1103 if have_unicode:
1104 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1105 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001106 if have_unicode:
1107 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001108
1109 def test_pow(self):
1110 self.assertEqual(pow(0,0), 1)
1111 self.assertEqual(pow(0,1), 0)
1112 self.assertEqual(pow(1,0), 1)
1113 self.assertEqual(pow(1,1), 1)
1114
1115 self.assertEqual(pow(2,0), 1)
1116 self.assertEqual(pow(2,10), 1024)
1117 self.assertEqual(pow(2,20), 1024*1024)
1118 self.assertEqual(pow(2,30), 1024*1024*1024)
1119
1120 self.assertEqual(pow(-2,0), 1)
1121 self.assertEqual(pow(-2,1), -2)
1122 self.assertEqual(pow(-2,2), 4)
1123 self.assertEqual(pow(-2,3), -8)
1124
1125 self.assertEqual(pow(0L,0), 1)
1126 self.assertEqual(pow(0L,1), 0)
1127 self.assertEqual(pow(1L,0), 1)
1128 self.assertEqual(pow(1L,1), 1)
1129
1130 self.assertEqual(pow(2L,0), 1)
1131 self.assertEqual(pow(2L,10), 1024)
1132 self.assertEqual(pow(2L,20), 1024*1024)
1133 self.assertEqual(pow(2L,30), 1024*1024*1024)
1134
1135 self.assertEqual(pow(-2L,0), 1)
1136 self.assertEqual(pow(-2L,1), -2)
1137 self.assertEqual(pow(-2L,2), 4)
1138 self.assertEqual(pow(-2L,3), -8)
1139
1140 self.assertAlmostEqual(pow(0.,0), 1.)
1141 self.assertAlmostEqual(pow(0.,1), 0.)
1142 self.assertAlmostEqual(pow(1.,0), 1.)
1143 self.assertAlmostEqual(pow(1.,1), 1.)
1144
1145 self.assertAlmostEqual(pow(2.,0), 1.)
1146 self.assertAlmostEqual(pow(2.,10), 1024.)
1147 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1148 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1149
1150 self.assertAlmostEqual(pow(-2.,0), 1.)
1151 self.assertAlmostEqual(pow(-2.,1), -2.)
1152 self.assertAlmostEqual(pow(-2.,2), 4.)
1153 self.assertAlmostEqual(pow(-2.,3), -8.)
1154
1155 for x in 2, 2L, 2.0:
1156 for y in 10, 10L, 10.0:
1157 for z in 1000, 1000L, 1000.0:
1158 if isinstance(x, float) or \
1159 isinstance(y, float) or \
1160 isinstance(z, float):
1161 self.assertRaises(TypeError, pow, x, y, z)
1162 else:
1163 self.assertAlmostEqual(pow(x, y, z), 24.0)
1164
1165 self.assertRaises(TypeError, pow, -1, -2, 3)
1166 self.assertRaises(ValueError, pow, 1, 2, 0)
1167 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1168 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1169 self.assertRaises(ValueError, pow, -342.43, 0.234)
1170
1171 self.assertRaises(TypeError, pow)
1172
1173 def test_range(self):
1174 self.assertEqual(range(3), [0, 1, 2])
1175 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1176 self.assertEqual(range(0), [])
1177 self.assertEqual(range(-3), [])
1178 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1179 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1180
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001181 # Now test range() with longs
1182 self.assertEqual(range(-2**100), [])
1183 self.assertEqual(range(0, -2**100), [])
1184 self.assertEqual(range(0, 2**100, -1), [])
1185 self.assertEqual(range(0, 2**100, -1), [])
1186
1187 a = long(10 * sys.maxint)
1188 b = long(100 * sys.maxint)
1189 c = long(50 * sys.maxint)
1190
1191 self.assertEqual(range(a, a+2), [a, a+1])
1192 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1193 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1194
1195 seq = range(a, b, c)
1196 self.assert_(a in seq)
1197 self.assert_(b not in seq)
1198 self.assertEqual(len(seq), 2)
1199
1200 seq = range(b, a, -c)
1201 self.assert_(b in seq)
1202 self.assert_(a not in seq)
1203 self.assertEqual(len(seq), 2)
1204
1205 seq = range(-a, -b, -c)
1206 self.assert_(-a in seq)
1207 self.assert_(-b not in seq)
1208 self.assertEqual(len(seq), 2)
1209
Walter Dörwald919497e2003-01-19 16:23:59 +00001210 self.assertRaises(TypeError, range)
1211 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1212 self.assertRaises(ValueError, range, 1, 2, 0)
1213
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001214 # Reject floats when it would require PyLongs to represent.
1215 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001216 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001217
Walter Dörwald357981e2003-04-15 18:59:28 +00001218 self.assertRaises(TypeError, range, 0, "spam")
1219 self.assertRaises(TypeError, range, 0, 42, "spam")
1220
1221 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1222 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1223
Walter Dörwald919497e2003-01-19 16:23:59 +00001224 def test_input_and_raw_input(self):
1225 self.write_testfile()
1226 fp = open(TESTFN, 'r')
1227 savestdin = sys.stdin
1228 savestdout = sys.stdout # Eats the echo
1229 try:
1230 sys.stdin = fp
1231 sys.stdout = BitBucket()
1232 self.assertEqual(input(), 2)
1233 self.assertEqual(input('testing\n'), 2)
1234 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1235 self.assertEqual(raw_input('testing\n'), 'Dear John')
1236 sys.stdin = cStringIO.StringIO("NULL\0")
1237 self.assertRaises(TypeError, input, 42, 42)
1238 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1239 self.assertEqual(input(), 'whitespace')
1240 sys.stdin = cStringIO.StringIO()
1241 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001242
1243 # SF 876178: make sure input() respect future options.
1244 sys.stdin = cStringIO.StringIO('1/2')
1245 sys.stdout = cStringIO.StringIO()
1246 exec compile('print input()', 'test_builtin_tmp', 'exec')
1247 sys.stdin.seek(0, 0)
1248 exec compile('from __future__ import division;print input()',
1249 'test_builtin_tmp', 'exec')
1250 sys.stdin.seek(0, 0)
1251 exec compile('print input()', 'test_builtin_tmp', 'exec')
1252 self.assertEqual(sys.stdout.getvalue().splitlines(),
1253 ['0', '0.5', '0'])
1254
Walter Dörwald919497e2003-01-19 16:23:59 +00001255 del sys.stdout
1256 self.assertRaises(RuntimeError, input, 'prompt')
1257 del sys.stdin
1258 self.assertRaises(RuntimeError, input, 'prompt')
1259 finally:
1260 sys.stdin = savestdin
1261 sys.stdout = savestdout
1262 fp.close()
1263 unlink(TESTFN)
1264
1265 def test_reduce(self):
1266 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1267 self.assertEqual(
1268 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1269 ['a','c','d','w']
1270 )
1271 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1272 self.assertEqual(
1273 reduce(lambda x, y: x*y, range(2,21), 1L),
1274 2432902008176640000L
1275 )
1276 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1277 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1278 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1279 self.assertRaises(TypeError, reduce)
1280 self.assertRaises(TypeError, reduce, 42, 42)
1281 self.assertRaises(TypeError, reduce, 42, 42, 42)
1282 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1283 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1284 self.assertRaises(TypeError, reduce, 42, (42, 42))
1285
1286 class BadSeq:
1287 def __getitem__(self, index):
1288 raise ValueError
1289 self.assertRaises(ValueError, reduce, 42, BadSeq())
1290
1291 def test_reload(self):
1292 import marshal
1293 reload(marshal)
1294 import string
1295 reload(string)
1296 ## import sys
1297 ## self.assertRaises(ImportError, reload, sys)
1298
1299 def test_repr(self):
1300 self.assertEqual(repr(''), '\'\'')
1301 self.assertEqual(repr(0), '0')
1302 self.assertEqual(repr(0L), '0L')
1303 self.assertEqual(repr(()), '()')
1304 self.assertEqual(repr([]), '[]')
1305 self.assertEqual(repr({}), '{}')
1306 a = []
1307 a.append(a)
1308 self.assertEqual(repr(a), '[[...]]')
1309 a = {}
1310 a[0] = a
1311 self.assertEqual(repr(a), '{0: {...}}')
1312
1313 def test_round(self):
1314 self.assertEqual(round(0.0), 0.0)
1315 self.assertEqual(round(1.0), 1.0)
1316 self.assertEqual(round(10.0), 10.0)
1317 self.assertEqual(round(1000000000.0), 1000000000.0)
1318 self.assertEqual(round(1e20), 1e20)
1319
1320 self.assertEqual(round(-1.0), -1.0)
1321 self.assertEqual(round(-10.0), -10.0)
1322 self.assertEqual(round(-1000000000.0), -1000000000.0)
1323 self.assertEqual(round(-1e20), -1e20)
1324
1325 self.assertEqual(round(0.1), 0.0)
1326 self.assertEqual(round(1.1), 1.0)
1327 self.assertEqual(round(10.1), 10.0)
1328 self.assertEqual(round(1000000000.1), 1000000000.0)
1329
1330 self.assertEqual(round(-1.1), -1.0)
1331 self.assertEqual(round(-10.1), -10.0)
1332 self.assertEqual(round(-1000000000.1), -1000000000.0)
1333
1334 self.assertEqual(round(0.9), 1.0)
1335 self.assertEqual(round(9.9), 10.0)
1336 self.assertEqual(round(999999999.9), 1000000000.0)
1337
1338 self.assertEqual(round(-0.9), -1.0)
1339 self.assertEqual(round(-9.9), -10.0)
1340 self.assertEqual(round(-999999999.9), -1000000000.0)
1341
1342 self.assertEqual(round(-8.0, -1), -10.0)
1343
1344 self.assertRaises(TypeError, round)
1345
1346 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001347 setattr(sys, 'spam', 1)
1348 self.assertEqual(sys.spam, 1)
1349 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1350 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001351
1352 def test_str(self):
1353 self.assertEqual(str(''), '')
1354 self.assertEqual(str(0), '0')
1355 self.assertEqual(str(0L), '0')
1356 self.assertEqual(str(()), '()')
1357 self.assertEqual(str([]), '[]')
1358 self.assertEqual(str({}), '{}')
1359 a = []
1360 a.append(a)
1361 self.assertEqual(str(a), '[[...]]')
1362 a = {}
1363 a[0] = a
1364 self.assertEqual(str(a), '{0: {...}}')
1365
Alex Martellia70b1912003-04-22 08:12:33 +00001366 def test_sum(self):
1367 self.assertEqual(sum([]), 0)
1368 self.assertEqual(sum(range(2,8)), 27)
1369 self.assertEqual(sum(iter(range(2,8))), 27)
1370 self.assertEqual(sum(Squares(10)), 285)
1371 self.assertEqual(sum(iter(Squares(10))), 285)
1372 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1373
1374 self.assertRaises(TypeError, sum)
1375 self.assertRaises(TypeError, sum, 42)
1376 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1377 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1378 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1379 self.assertRaises(TypeError, sum, [{2:3}])
1380 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1381
1382 class BadSeq:
1383 def __getitem__(self, index):
1384 raise ValueError
1385 self.assertRaises(ValueError, sum, BadSeq())
1386
Walter Dörwald919497e2003-01-19 16:23:59 +00001387 def test_tuple(self):
1388 self.assertEqual(tuple(()), ())
1389 t0_3 = (0, 1, 2, 3)
1390 t0_3_bis = tuple(t0_3)
1391 self.assert_(t0_3 is t0_3_bis)
1392 self.assertEqual(tuple([]), ())
1393 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1394 self.assertEqual(tuple(''), ())
1395 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1396
1397 def test_type(self):
1398 self.assertEqual(type(''), type('123'))
1399 self.assertNotEqual(type(''), type(()))
1400
1401 def test_unichr(self):
1402 if have_unicode:
1403 self.assertEqual(unichr(32), unicode(' '))
1404 self.assertEqual(unichr(65), unicode('A'))
1405 self.assertEqual(unichr(97), unicode('a'))
1406 self.assertEqual(
1407 unichr(sys.maxunicode),
1408 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1409 )
1410 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1411 self.assertRaises(TypeError, unichr)
1412
Guido van Rossumfee7b932005-01-16 00:21:28 +00001413 # We don't want self in vars(), so these are static methods
1414
1415 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001416 def get_vars_f0():
1417 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001418
Guido van Rossumfee7b932005-01-16 00:21:28 +00001419 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001420 def get_vars_f2():
1421 BuiltinTest.get_vars_f0()
1422 a = 1
1423 b = 2
1424 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001425
1426 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001427 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001428 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001429 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001430 self.assertEqual(self.get_vars_f0(), {})
1431 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1432 self.assertRaises(TypeError, vars, 42, 42)
1433 self.assertRaises(TypeError, vars, 42)
1434
1435 def test_zip(self):
1436 a = (1, 2, 3)
1437 b = (4, 5, 6)
1438 t = [(1, 4), (2, 5), (3, 6)]
1439 self.assertEqual(zip(a, b), t)
1440 b = [4, 5, 6]
1441 self.assertEqual(zip(a, b), t)
1442 b = (4, 5, 6, 7)
1443 self.assertEqual(zip(a, b), t)
1444 class I:
1445 def __getitem__(self, i):
1446 if i < 0 or i > 2: raise IndexError
1447 return i + 4
1448 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001449 self.assertEqual(zip(), [])
1450 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001451 self.assertRaises(TypeError, zip, None)
1452 class G:
1453 pass
1454 self.assertRaises(TypeError, zip, a, G())
1455
1456 # Make sure zip doesn't try to allocate a billion elements for the
1457 # result list when one of its arguments doesn't say how long it is.
1458 # A MemoryError is the most likely failure mode.
1459 class SequenceWithoutALength:
1460 def __getitem__(self, i):
1461 if i == 5:
1462 raise IndexError
1463 else:
1464 return i
1465 self.assertEqual(
1466 zip(SequenceWithoutALength(), xrange(2**30)),
1467 list(enumerate(range(5)))
1468 )
1469
1470 class BadSeq:
1471 def __getitem__(self, i):
1472 if i == 5:
1473 raise ValueError
1474 else:
1475 return i
1476 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1477
Raymond Hettinger64958a12003-12-17 20:43:33 +00001478class TestSorted(unittest.TestCase):
1479
1480 def test_basic(self):
1481 data = range(100)
1482 copy = data[:]
1483 random.shuffle(copy)
1484 self.assertEqual(data, sorted(copy))
1485 self.assertNotEqual(data, copy)
1486
1487 data.reverse()
1488 random.shuffle(copy)
1489 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1490 self.assertNotEqual(data, copy)
1491 random.shuffle(copy)
1492 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1493 self.assertNotEqual(data, copy)
1494 random.shuffle(copy)
1495 self.assertEqual(data, sorted(copy, reverse=1))
1496 self.assertNotEqual(data, copy)
1497
1498 def test_inputtypes(self):
1499 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001500 types = [list, tuple]
1501 if have_unicode:
1502 types.insert(0, unicode)
1503 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001504 self.assertEqual(sorted(s), sorted(T(s)))
1505
1506 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001507 types = [set, frozenset, list, tuple, dict.fromkeys]
1508 if have_unicode:
1509 types.insert(0, unicode)
1510 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001511 self.assertEqual(sorted(s), sorted(T(s)))
1512
1513 def test_baddecorator(self):
1514 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1515 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1516
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001517def test_main(verbose=None):
1518 test_classes = (BuiltinTest, TestSorted)
1519
1520 run_unittest(*test_classes)
1521
1522 # verify reference counting
1523 if verbose and hasattr(sys, "gettotalrefcount"):
1524 import gc
1525 counts = [None] * 5
1526 for i in xrange(len(counts)):
1527 run_unittest(*test_classes)
1528 gc.collect()
1529 counts[i] = sys.gettotalrefcount()
1530 print counts
1531
Walter Dörwald919497e2003-01-19 16:23:59 +00001532
1533if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001534 test_main(verbose=True)