blob: 103d1a3ac626ab5e9ff0f97d222a11be60dfa4a8 [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)
585 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
586
587 def test_hasattr(self):
588 import sys
589 self.assert_(hasattr(sys, 'stdout'))
590 self.assertRaises(TypeError, hasattr, sys, 1)
591 self.assertRaises(TypeError, hasattr)
592 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
593
594 def test_hash(self):
595 hash(None)
596 self.assertEqual(hash(1), hash(1L))
597 self.assertEqual(hash(1), hash(1.0))
598 hash('spam')
599 if have_unicode:
600 self.assertEqual(hash('spam'), hash(unicode('spam')))
601 hash((0,1,2,3))
602 def f(): pass
603 self.assertRaises(TypeError, hash, [])
604 self.assertRaises(TypeError, hash, {})
605
606 def test_hex(self):
607 self.assertEqual(hex(16), '0x10')
608 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000609 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000610 self.assertEqual(hex(-16L), '-0x10L')
611 self.assertRaises(TypeError, hex, {})
612
613 def test_id(self):
614 id(None)
615 id(1)
616 id(1L)
617 id(1.0)
618 id('spam')
619 id((0,1,2,3))
620 id([0,1,2,3])
621 id({'spam': 1, 'eggs': 2, 'ham': 3})
622
623 # Test input() later, together with raw_input
624
625 def test_int(self):
626 self.assertEqual(int(314), 314)
627 self.assertEqual(int(3.14), 3)
628 self.assertEqual(int(314L), 314)
629 # Check that conversion from float truncates towards zero
630 self.assertEqual(int(-3.14), -3)
631 self.assertEqual(int(3.9), 3)
632 self.assertEqual(int(-3.9), -3)
633 self.assertEqual(int(3.5), 3)
634 self.assertEqual(int(-3.5), -3)
635 # Different base:
636 self.assertEqual(int("10",16), 16L)
637 if have_unicode:
638 self.assertEqual(int(unicode("10"),16), 16L)
639 # Test conversion from strings and various anomalies
640 for s, v in L:
641 for sign in "", "+", "-":
642 for prefix in "", " ", "\t", " \t\t ":
643 ss = prefix + sign + s
644 vv = v
645 if sign == "-" and v is not ValueError:
646 vv = -v
647 try:
648 self.assertEqual(int(ss), vv)
649 except v:
650 pass
651
Walter Dörwald70a6b492004-02-12 17:35:32 +0000652 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000653 self.assertEqual(int(s)+1, -sys.maxint)
654 # should return long
655 int(s[1:])
656
657 # should return long
658 x = int(1e100)
659 self.assert_(isinstance(x, long))
660 x = int(-1e100)
661 self.assert_(isinstance(x, long))
662
663
664 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
665 # Worked by accident in Windows release build, but failed in debug build.
666 # Failed in all Linux builds.
667 x = -1-sys.maxint
668 self.assertEqual(x >> 1, x//2)
669
670 self.assertRaises(ValueError, int, '123\0')
671 self.assertRaises(ValueError, int, '53', 40)
672
673 x = int('1' * 600)
674 self.assert_(isinstance(x, long))
675
676 if have_unicode:
677 x = int(unichr(0x661) * 600)
678 self.assert_(isinstance(x, long))
679
680 self.assertRaises(TypeError, int, 1, 12)
681
682 self.assertEqual(int('0123', 0), 83)
683
Brett Cannonc3647ac2005-04-26 03:45:26 +0000684 def test_intconversion(self):
685 # Test __int__()
686 class Foo0:
687 def __int__(self):
688 return 42
689
690 class Foo1(object):
691 def __int__(self):
692 return 42
693
694 class Foo2(int):
695 def __int__(self):
696 return 42
697
698 class Foo3(int):
699 def __int__(self):
700 return self
701
702 class Foo4(int):
703 def __int__(self):
704 return 42L
705
706 class Foo5(int):
707 def __int__(self):
708 return 42.
709
710 self.assertEqual(int(Foo0()), 42)
711 self.assertEqual(int(Foo1()), 42)
712 self.assertEqual(int(Foo2()), 42)
713 self.assertEqual(int(Foo3()), 0)
714 self.assertEqual(int(Foo4()), 42L)
715 self.assertRaises(TypeError, int, Foo5())
716
Walter Dörwald919497e2003-01-19 16:23:59 +0000717 def test_intern(self):
718 self.assertRaises(TypeError, intern)
719 s = "never interned before"
720 self.assert_(intern(s) is s)
721 s2 = s.swapcase().swapcase()
722 self.assert_(intern(s2) is s)
723
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000724 # Subclasses of string can't be interned, because they
725 # provide too much opportunity for insane things to happen.
726 # We don't want them in the interned dict and if they aren't
727 # actually interned, we don't want to create the appearance
728 # that they are by allowing intern() to succeeed.
729 class S(str):
730 def __hash__(self):
731 return 123
732
733 self.assertRaises(TypeError, intern, S("abc"))
734
735 # It's still safe to pass these strings to routines that
736 # call intern internally, e.g. PyObject_SetAttr().
737 s = S("abc")
738 setattr(s, s, s)
739 self.assertEqual(getattr(s, s), s)
740
Walter Dörwald919497e2003-01-19 16:23:59 +0000741 def test_iter(self):
742 self.assertRaises(TypeError, iter)
743 self.assertRaises(TypeError, iter, 42, 42)
744 lists = [("1", "2"), ["1", "2"], "12"]
745 if have_unicode:
746 lists.append(unicode("12"))
747 for l in lists:
748 i = iter(l)
749 self.assertEqual(i.next(), '1')
750 self.assertEqual(i.next(), '2')
751 self.assertRaises(StopIteration, i.next)
752
753 def test_isinstance(self):
754 class C:
755 pass
756 class D(C):
757 pass
758 class E:
759 pass
760 c = C()
761 d = D()
762 e = E()
763 self.assert_(isinstance(c, C))
764 self.assert_(isinstance(d, C))
765 self.assert_(not isinstance(e, C))
766 self.assert_(not isinstance(c, D))
767 self.assert_(not isinstance('foo', E))
768 self.assertRaises(TypeError, isinstance, E, 'foo')
769 self.assertRaises(TypeError, isinstance)
770
771 def test_issubclass(self):
772 class C:
773 pass
774 class D(C):
775 pass
776 class E:
777 pass
778 c = C()
779 d = D()
780 e = E()
781 self.assert_(issubclass(D, C))
782 self.assert_(issubclass(C, C))
783 self.assert_(not issubclass(C, D))
784 self.assertRaises(TypeError, issubclass, 'foo', E)
785 self.assertRaises(TypeError, issubclass, E, 'foo')
786 self.assertRaises(TypeError, issubclass)
787
788 def test_len(self):
789 self.assertEqual(len('123'), 3)
790 self.assertEqual(len(()), 0)
791 self.assertEqual(len((1, 2, 3, 4)), 4)
792 self.assertEqual(len([1, 2, 3, 4]), 4)
793 self.assertEqual(len({}), 0)
794 self.assertEqual(len({'a':1, 'b': 2}), 2)
795 class BadSeq:
796 def __len__(self):
797 raise ValueError
798 self.assertRaises(ValueError, len, BadSeq())
799
800 def test_list(self):
801 self.assertEqual(list([]), [])
802 l0_3 = [0, 1, 2, 3]
803 l0_3_bis = list(l0_3)
804 self.assertEqual(l0_3, l0_3_bis)
805 self.assert_(l0_3 is not l0_3_bis)
806 self.assertEqual(list(()), [])
807 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
808 self.assertEqual(list(''), [])
809 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
810
811 if sys.maxint == 0x7fffffff:
812 # This test can currently only work on 32-bit machines.
813 # XXX If/when PySequence_Length() returns a ssize_t, it should be
814 # XXX re-enabled.
815 # Verify clearing of bug #556025.
816 # This assumes that the max data size (sys.maxint) == max
817 # address size this also assumes that the address size is at
818 # least 4 bytes with 8 byte addresses, the bug is not well
819 # tested
820 #
821 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
822 # earlier due to a newlib bug. See the following mailing list
823 # thread for the details:
824
825 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
826 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
827
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000828 # This code used to segfault in Py2.4a3
829 x = []
830 x.extend(-y for y in x)
831 self.assertEqual(x, [])
832
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 def test_long(self):
834 self.assertEqual(long(314), 314L)
835 self.assertEqual(long(3.14), 3L)
836 self.assertEqual(long(314L), 314L)
837 # Check that conversion from float truncates towards zero
838 self.assertEqual(long(-3.14), -3L)
839 self.assertEqual(long(3.9), 3L)
840 self.assertEqual(long(-3.9), -3L)
841 self.assertEqual(long(3.5), 3L)
842 self.assertEqual(long(-3.5), -3L)
843 self.assertEqual(long("-3"), -3L)
844 if have_unicode:
845 self.assertEqual(long(unicode("-3")), -3L)
846 # Different base:
847 self.assertEqual(long("10",16), 16L)
848 if have_unicode:
849 self.assertEqual(long(unicode("10"),16), 16L)
850 # Check conversions from string (same test set as for int(), and then some)
851 LL = [
852 ('1' + '0'*20, 10L**20),
853 ('1' + '0'*100, 10L**100)
854 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000855 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000856 if have_unicode:
857 L2 += [
858 (unicode('1') + unicode('0')*20, 10L**20),
859 (unicode('1') + unicode('0')*100, 10L**100),
860 ]
861 for s, v in L2 + LL:
862 for sign in "", "+", "-":
863 for prefix in "", " ", "\t", " \t\t ":
864 ss = prefix + sign + s
865 vv = v
866 if sign == "-" and v is not ValueError:
867 vv = -v
868 try:
869 self.assertEqual(long(ss), long(vv))
870 except v:
871 pass
872
873 self.assertRaises(ValueError, long, '123\0')
874 self.assertRaises(ValueError, long, '53', 40)
875 self.assertRaises(TypeError, long, 1, 12)
876
Brett Cannonc3647ac2005-04-26 03:45:26 +0000877 def test_longconversion(self):
878 # Test __long__()
879 class Foo0:
880 def __long__(self):
881 return 42L
882
883 class Foo1(object):
884 def __long__(self):
885 return 42L
886
887 class Foo2(long):
888 def __long__(self):
889 return 42L
890
891 class Foo3(long):
892 def __long__(self):
893 return self
894
895 class Foo4(long):
896 def __long__(self):
897 return 42
898
899 class Foo5(long):
900 def __long__(self):
901 return 42.
902
903 self.assertEqual(long(Foo0()), 42L)
904 self.assertEqual(long(Foo1()), 42L)
905 self.assertEqual(long(Foo2()), 42L)
906 self.assertEqual(long(Foo3()), 0)
907 self.assertEqual(long(Foo4()), 42)
908 self.assertRaises(TypeError, long, Foo5())
909
Walter Dörwald919497e2003-01-19 16:23:59 +0000910 def test_map(self):
911 self.assertEqual(
912 map(None, 'hello world'),
913 ['h','e','l','l','o',' ','w','o','r','l','d']
914 )
915 self.assertEqual(
916 map(None, 'abcd', 'efg'),
917 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
918 )
919 self.assertEqual(
920 map(None, range(10)),
921 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
922 )
923 self.assertEqual(
924 map(lambda x: x*x, range(1,4)),
925 [1, 4, 9]
926 )
927 try:
928 from math import sqrt
929 except ImportError:
930 def sqrt(x):
931 return pow(x, 0.5)
932 self.assertEqual(
933 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
934 [[4.0, 2.0], [9.0, 3.0]]
935 )
936 self.assertEqual(
937 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
938 [10, 4, 6]
939 )
940
941 def plus(*v):
942 accu = 0
943 for i in v: accu = accu + i
944 return accu
945 self.assertEqual(
946 map(plus, [1, 3, 7]),
947 [1, 3, 7]
948 )
949 self.assertEqual(
950 map(plus, [1, 3, 7], [4, 9, 2]),
951 [1+4, 3+9, 7+2]
952 )
953 self.assertEqual(
954 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
955 [1+4+1, 3+9+1, 7+2+0]
956 )
957 self.assertEqual(
958 map(None, Squares(10)),
959 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
960 )
961 self.assertEqual(
962 map(int, Squares(10)),
963 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
964 )
965 self.assertEqual(
966 map(None, Squares(3), Squares(2)),
967 [(0,0), (1,1), (4,None)]
968 )
969 self.assertEqual(
970 map(max, Squares(3), Squares(2)),
971 [0, 1, 4]
972 )
973 self.assertRaises(TypeError, map)
974 self.assertRaises(TypeError, map, lambda x: x, 42)
975 self.assertEqual(map(None, [42]), [42])
976 class BadSeq:
977 def __getitem__(self, index):
978 raise ValueError
979 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
980
981 def test_max(self):
982 self.assertEqual(max('123123'), '3')
983 self.assertEqual(max(1, 2, 3), 3)
984 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
985 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
986
987 self.assertEqual(max(1, 2L, 3.0), 3.0)
988 self.assertEqual(max(1L, 2.0, 3), 3)
989 self.assertEqual(max(1.0, 2, 3L), 3L)
990
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000991 for stmt in (
992 "max(key=int)", # no args
993 "max(1, key=int)", # single arg not iterable
994 "max(1, 2, keystone=int)", # wrong keyword
995 "max(1, 2, key=int, abc=int)", # two many keywords
996 "max(1, 2, key=1)", # keyfunc is not callable
997 ):
Tim Peters7f061872004-12-07 21:17:46 +0000998 try:
999 exec(stmt) in globals()
1000 except TypeError:
1001 pass
1002 else:
1003 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001004
1005 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1006 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1007 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1008
1009 data = [random.randrange(200) for i in range(100)]
1010 keys = dict((elem, random.randrange(50)) for elem in data)
1011 f = keys.__getitem__
1012 self.assertEqual(max(data, key=f),
1013 sorted(reversed(data), key=f)[-1])
1014
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 def test_min(self):
1016 self.assertEqual(min('123123'), '1')
1017 self.assertEqual(min(1, 2, 3), 1)
1018 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1019 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1020
1021 self.assertEqual(min(1, 2L, 3.0), 1)
1022 self.assertEqual(min(1L, 2.0, 3), 1L)
1023 self.assertEqual(min(1.0, 2, 3L), 1.0)
1024
1025 self.assertRaises(TypeError, min)
1026 self.assertRaises(TypeError, min, 42)
1027 self.assertRaises(ValueError, min, ())
1028 class BadSeq:
1029 def __getitem__(self, index):
1030 raise ValueError
1031 self.assertRaises(ValueError, min, BadSeq())
1032 class BadNumber:
1033 def __cmp__(self, other):
1034 raise ValueError
1035 self.assertRaises(ValueError, min, (42, BadNumber()))
1036
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001037 for stmt in (
1038 "min(key=int)", # no args
1039 "min(1, key=int)", # single arg not iterable
1040 "min(1, 2, keystone=int)", # wrong keyword
1041 "min(1, 2, key=int, abc=int)", # two many keywords
1042 "min(1, 2, key=1)", # keyfunc is not callable
1043 ):
Tim Peters7f061872004-12-07 21:17:46 +00001044 try:
1045 exec(stmt) in globals()
1046 except TypeError:
1047 pass
1048 else:
1049 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001050
1051 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1052 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1053 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1054
1055 data = [random.randrange(200) for i in range(100)]
1056 keys = dict((elem, random.randrange(50)) for elem in data)
1057 f = keys.__getitem__
1058 self.assertEqual(min(data, key=f),
1059 sorted(data, key=f)[0])
1060
Walter Dörwald919497e2003-01-19 16:23:59 +00001061 def test_oct(self):
1062 self.assertEqual(oct(100), '0144')
1063 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001064 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001065 self.assertEqual(oct(-100L), '-0144L')
1066 self.assertRaises(TypeError, oct, ())
1067
1068 def write_testfile(self):
1069 # NB the first 4 lines are also used to test input and raw_input, below
1070 fp = open(TESTFN, 'w')
1071 try:
1072 fp.write('1+1\n')
1073 fp.write('1+1\n')
1074 fp.write('The quick brown fox jumps over the lazy dog')
1075 fp.write('.\n')
1076 fp.write('Dear John\n')
1077 fp.write('XXX'*100)
1078 fp.write('YYY'*100)
1079 finally:
1080 fp.close()
1081
1082 def test_open(self):
1083 self.write_testfile()
1084 fp = open(TESTFN, 'r')
1085 try:
1086 self.assertEqual(fp.readline(4), '1+1\n')
1087 self.assertEqual(fp.readline(4), '1+1\n')
1088 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1089 self.assertEqual(fp.readline(4), 'Dear')
1090 self.assertEqual(fp.readline(100), ' John\n')
1091 self.assertEqual(fp.read(300), 'XXX'*100)
1092 self.assertEqual(fp.read(1000), 'YYY'*100)
1093 finally:
1094 fp.close()
1095 unlink(TESTFN)
1096
1097 def test_ord(self):
1098 self.assertEqual(ord(' '), 32)
1099 self.assertEqual(ord('A'), 65)
1100 self.assertEqual(ord('a'), 97)
1101 if have_unicode:
1102 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1103 self.assertRaises(TypeError, ord, 42)
1104 self.assertRaises(TypeError, ord, unicode("12"))
1105
1106 def test_pow(self):
1107 self.assertEqual(pow(0,0), 1)
1108 self.assertEqual(pow(0,1), 0)
1109 self.assertEqual(pow(1,0), 1)
1110 self.assertEqual(pow(1,1), 1)
1111
1112 self.assertEqual(pow(2,0), 1)
1113 self.assertEqual(pow(2,10), 1024)
1114 self.assertEqual(pow(2,20), 1024*1024)
1115 self.assertEqual(pow(2,30), 1024*1024*1024)
1116
1117 self.assertEqual(pow(-2,0), 1)
1118 self.assertEqual(pow(-2,1), -2)
1119 self.assertEqual(pow(-2,2), 4)
1120 self.assertEqual(pow(-2,3), -8)
1121
1122 self.assertEqual(pow(0L,0), 1)
1123 self.assertEqual(pow(0L,1), 0)
1124 self.assertEqual(pow(1L,0), 1)
1125 self.assertEqual(pow(1L,1), 1)
1126
1127 self.assertEqual(pow(2L,0), 1)
1128 self.assertEqual(pow(2L,10), 1024)
1129 self.assertEqual(pow(2L,20), 1024*1024)
1130 self.assertEqual(pow(2L,30), 1024*1024*1024)
1131
1132 self.assertEqual(pow(-2L,0), 1)
1133 self.assertEqual(pow(-2L,1), -2)
1134 self.assertEqual(pow(-2L,2), 4)
1135 self.assertEqual(pow(-2L,3), -8)
1136
1137 self.assertAlmostEqual(pow(0.,0), 1.)
1138 self.assertAlmostEqual(pow(0.,1), 0.)
1139 self.assertAlmostEqual(pow(1.,0), 1.)
1140 self.assertAlmostEqual(pow(1.,1), 1.)
1141
1142 self.assertAlmostEqual(pow(2.,0), 1.)
1143 self.assertAlmostEqual(pow(2.,10), 1024.)
1144 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1145 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1146
1147 self.assertAlmostEqual(pow(-2.,0), 1.)
1148 self.assertAlmostEqual(pow(-2.,1), -2.)
1149 self.assertAlmostEqual(pow(-2.,2), 4.)
1150 self.assertAlmostEqual(pow(-2.,3), -8.)
1151
1152 for x in 2, 2L, 2.0:
1153 for y in 10, 10L, 10.0:
1154 for z in 1000, 1000L, 1000.0:
1155 if isinstance(x, float) or \
1156 isinstance(y, float) or \
1157 isinstance(z, float):
1158 self.assertRaises(TypeError, pow, x, y, z)
1159 else:
1160 self.assertAlmostEqual(pow(x, y, z), 24.0)
1161
1162 self.assertRaises(TypeError, pow, -1, -2, 3)
1163 self.assertRaises(ValueError, pow, 1, 2, 0)
1164 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1165 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1166 self.assertRaises(ValueError, pow, -342.43, 0.234)
1167
1168 self.assertRaises(TypeError, pow)
1169
1170 def test_range(self):
1171 self.assertEqual(range(3), [0, 1, 2])
1172 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1173 self.assertEqual(range(0), [])
1174 self.assertEqual(range(-3), [])
1175 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1176 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1177
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001178 # Now test range() with longs
1179 self.assertEqual(range(-2**100), [])
1180 self.assertEqual(range(0, -2**100), [])
1181 self.assertEqual(range(0, 2**100, -1), [])
1182 self.assertEqual(range(0, 2**100, -1), [])
1183
1184 a = long(10 * sys.maxint)
1185 b = long(100 * sys.maxint)
1186 c = long(50 * sys.maxint)
1187
1188 self.assertEqual(range(a, a+2), [a, a+1])
1189 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1190 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1191
1192 seq = range(a, b, c)
1193 self.assert_(a in seq)
1194 self.assert_(b not in seq)
1195 self.assertEqual(len(seq), 2)
1196
1197 seq = range(b, a, -c)
1198 self.assert_(b in seq)
1199 self.assert_(a not in seq)
1200 self.assertEqual(len(seq), 2)
1201
1202 seq = range(-a, -b, -c)
1203 self.assert_(-a in seq)
1204 self.assert_(-b not in seq)
1205 self.assertEqual(len(seq), 2)
1206
Walter Dörwald919497e2003-01-19 16:23:59 +00001207 self.assertRaises(TypeError, range)
1208 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1209 self.assertRaises(ValueError, range, 1, 2, 0)
1210
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001211 # Reject floats when it would require PyLongs to represent.
1212 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001213 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001214
Walter Dörwald357981e2003-04-15 18:59:28 +00001215 self.assertRaises(TypeError, range, 0, "spam")
1216 self.assertRaises(TypeError, range, 0, 42, "spam")
1217
1218 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1219 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1220
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 def test_input_and_raw_input(self):
1222 self.write_testfile()
1223 fp = open(TESTFN, 'r')
1224 savestdin = sys.stdin
1225 savestdout = sys.stdout # Eats the echo
1226 try:
1227 sys.stdin = fp
1228 sys.stdout = BitBucket()
1229 self.assertEqual(input(), 2)
1230 self.assertEqual(input('testing\n'), 2)
1231 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1232 self.assertEqual(raw_input('testing\n'), 'Dear John')
1233 sys.stdin = cStringIO.StringIO("NULL\0")
1234 self.assertRaises(TypeError, input, 42, 42)
1235 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1236 self.assertEqual(input(), 'whitespace')
1237 sys.stdin = cStringIO.StringIO()
1238 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001239
1240 # SF 876178: make sure input() respect future options.
1241 sys.stdin = cStringIO.StringIO('1/2')
1242 sys.stdout = cStringIO.StringIO()
1243 exec compile('print input()', 'test_builtin_tmp', 'exec')
1244 sys.stdin.seek(0, 0)
1245 exec compile('from __future__ import division;print input()',
1246 'test_builtin_tmp', 'exec')
1247 sys.stdin.seek(0, 0)
1248 exec compile('print input()', 'test_builtin_tmp', 'exec')
1249 self.assertEqual(sys.stdout.getvalue().splitlines(),
1250 ['0', '0.5', '0'])
1251
Walter Dörwald919497e2003-01-19 16:23:59 +00001252 del sys.stdout
1253 self.assertRaises(RuntimeError, input, 'prompt')
1254 del sys.stdin
1255 self.assertRaises(RuntimeError, input, 'prompt')
1256 finally:
1257 sys.stdin = savestdin
1258 sys.stdout = savestdout
1259 fp.close()
1260 unlink(TESTFN)
1261
1262 def test_reduce(self):
1263 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1264 self.assertEqual(
1265 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1266 ['a','c','d','w']
1267 )
1268 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1269 self.assertEqual(
1270 reduce(lambda x, y: x*y, range(2,21), 1L),
1271 2432902008176640000L
1272 )
1273 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1274 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1275 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1276 self.assertRaises(TypeError, reduce)
1277 self.assertRaises(TypeError, reduce, 42, 42)
1278 self.assertRaises(TypeError, reduce, 42, 42, 42)
1279 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1280 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1281 self.assertRaises(TypeError, reduce, 42, (42, 42))
1282
1283 class BadSeq:
1284 def __getitem__(self, index):
1285 raise ValueError
1286 self.assertRaises(ValueError, reduce, 42, BadSeq())
1287
1288 def test_reload(self):
1289 import marshal
1290 reload(marshal)
1291 import string
1292 reload(string)
1293 ## import sys
1294 ## self.assertRaises(ImportError, reload, sys)
1295
1296 def test_repr(self):
1297 self.assertEqual(repr(''), '\'\'')
1298 self.assertEqual(repr(0), '0')
1299 self.assertEqual(repr(0L), '0L')
1300 self.assertEqual(repr(()), '()')
1301 self.assertEqual(repr([]), '[]')
1302 self.assertEqual(repr({}), '{}')
1303 a = []
1304 a.append(a)
1305 self.assertEqual(repr(a), '[[...]]')
1306 a = {}
1307 a[0] = a
1308 self.assertEqual(repr(a), '{0: {...}}')
1309
1310 def test_round(self):
1311 self.assertEqual(round(0.0), 0.0)
1312 self.assertEqual(round(1.0), 1.0)
1313 self.assertEqual(round(10.0), 10.0)
1314 self.assertEqual(round(1000000000.0), 1000000000.0)
1315 self.assertEqual(round(1e20), 1e20)
1316
1317 self.assertEqual(round(-1.0), -1.0)
1318 self.assertEqual(round(-10.0), -10.0)
1319 self.assertEqual(round(-1000000000.0), -1000000000.0)
1320 self.assertEqual(round(-1e20), -1e20)
1321
1322 self.assertEqual(round(0.1), 0.0)
1323 self.assertEqual(round(1.1), 1.0)
1324 self.assertEqual(round(10.1), 10.0)
1325 self.assertEqual(round(1000000000.1), 1000000000.0)
1326
1327 self.assertEqual(round(-1.1), -1.0)
1328 self.assertEqual(round(-10.1), -10.0)
1329 self.assertEqual(round(-1000000000.1), -1000000000.0)
1330
1331 self.assertEqual(round(0.9), 1.0)
1332 self.assertEqual(round(9.9), 10.0)
1333 self.assertEqual(round(999999999.9), 1000000000.0)
1334
1335 self.assertEqual(round(-0.9), -1.0)
1336 self.assertEqual(round(-9.9), -10.0)
1337 self.assertEqual(round(-999999999.9), -1000000000.0)
1338
1339 self.assertEqual(round(-8.0, -1), -10.0)
1340
1341 self.assertRaises(TypeError, round)
1342
1343 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001344 setattr(sys, 'spam', 1)
1345 self.assertEqual(sys.spam, 1)
1346 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1347 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001348
1349 def test_str(self):
1350 self.assertEqual(str(''), '')
1351 self.assertEqual(str(0), '0')
1352 self.assertEqual(str(0L), '0')
1353 self.assertEqual(str(()), '()')
1354 self.assertEqual(str([]), '[]')
1355 self.assertEqual(str({}), '{}')
1356 a = []
1357 a.append(a)
1358 self.assertEqual(str(a), '[[...]]')
1359 a = {}
1360 a[0] = a
1361 self.assertEqual(str(a), '{0: {...}}')
1362
Alex Martellia70b1912003-04-22 08:12:33 +00001363 def test_sum(self):
1364 self.assertEqual(sum([]), 0)
1365 self.assertEqual(sum(range(2,8)), 27)
1366 self.assertEqual(sum(iter(range(2,8))), 27)
1367 self.assertEqual(sum(Squares(10)), 285)
1368 self.assertEqual(sum(iter(Squares(10))), 285)
1369 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1370
1371 self.assertRaises(TypeError, sum)
1372 self.assertRaises(TypeError, sum, 42)
1373 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1374 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1375 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1376 self.assertRaises(TypeError, sum, [{2:3}])
1377 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1378
1379 class BadSeq:
1380 def __getitem__(self, index):
1381 raise ValueError
1382 self.assertRaises(ValueError, sum, BadSeq())
1383
Walter Dörwald919497e2003-01-19 16:23:59 +00001384 def test_tuple(self):
1385 self.assertEqual(tuple(()), ())
1386 t0_3 = (0, 1, 2, 3)
1387 t0_3_bis = tuple(t0_3)
1388 self.assert_(t0_3 is t0_3_bis)
1389 self.assertEqual(tuple([]), ())
1390 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1391 self.assertEqual(tuple(''), ())
1392 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1393
1394 def test_type(self):
1395 self.assertEqual(type(''), type('123'))
1396 self.assertNotEqual(type(''), type(()))
1397
1398 def test_unichr(self):
1399 if have_unicode:
1400 self.assertEqual(unichr(32), unicode(' '))
1401 self.assertEqual(unichr(65), unicode('A'))
1402 self.assertEqual(unichr(97), unicode('a'))
1403 self.assertEqual(
1404 unichr(sys.maxunicode),
1405 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1406 )
1407 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1408 self.assertRaises(TypeError, unichr)
1409
Guido van Rossumfee7b932005-01-16 00:21:28 +00001410 # We don't want self in vars(), so these are static methods
1411
1412 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001413 def get_vars_f0():
1414 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001415
Guido van Rossumfee7b932005-01-16 00:21:28 +00001416 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001417 def get_vars_f2():
1418 BuiltinTest.get_vars_f0()
1419 a = 1
1420 b = 2
1421 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001422
1423 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001424 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001425 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001426 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001427 self.assertEqual(self.get_vars_f0(), {})
1428 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1429 self.assertRaises(TypeError, vars, 42, 42)
1430 self.assertRaises(TypeError, vars, 42)
1431
1432 def test_zip(self):
1433 a = (1, 2, 3)
1434 b = (4, 5, 6)
1435 t = [(1, 4), (2, 5), (3, 6)]
1436 self.assertEqual(zip(a, b), t)
1437 b = [4, 5, 6]
1438 self.assertEqual(zip(a, b), t)
1439 b = (4, 5, 6, 7)
1440 self.assertEqual(zip(a, b), t)
1441 class I:
1442 def __getitem__(self, i):
1443 if i < 0 or i > 2: raise IndexError
1444 return i + 4
1445 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001446 self.assertEqual(zip(), [])
1447 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001448 self.assertRaises(TypeError, zip, None)
1449 class G:
1450 pass
1451 self.assertRaises(TypeError, zip, a, G())
1452
1453 # Make sure zip doesn't try to allocate a billion elements for the
1454 # result list when one of its arguments doesn't say how long it is.
1455 # A MemoryError is the most likely failure mode.
1456 class SequenceWithoutALength:
1457 def __getitem__(self, i):
1458 if i == 5:
1459 raise IndexError
1460 else:
1461 return i
1462 self.assertEqual(
1463 zip(SequenceWithoutALength(), xrange(2**30)),
1464 list(enumerate(range(5)))
1465 )
1466
1467 class BadSeq:
1468 def __getitem__(self, i):
1469 if i == 5:
1470 raise ValueError
1471 else:
1472 return i
1473 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1474
Raymond Hettinger64958a12003-12-17 20:43:33 +00001475class TestSorted(unittest.TestCase):
1476
1477 def test_basic(self):
1478 data = range(100)
1479 copy = data[:]
1480 random.shuffle(copy)
1481 self.assertEqual(data, sorted(copy))
1482 self.assertNotEqual(data, copy)
1483
1484 data.reverse()
1485 random.shuffle(copy)
1486 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1487 self.assertNotEqual(data, copy)
1488 random.shuffle(copy)
1489 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1490 self.assertNotEqual(data, copy)
1491 random.shuffle(copy)
1492 self.assertEqual(data, sorted(copy, reverse=1))
1493 self.assertNotEqual(data, copy)
1494
1495 def test_inputtypes(self):
1496 s = 'abracadabra'
1497 for T in [unicode, list, tuple]:
1498 self.assertEqual(sorted(s), sorted(T(s)))
1499
1500 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1501 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1502 self.assertEqual(sorted(s), sorted(T(s)))
1503
1504 def test_baddecorator(self):
1505 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1506 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1507
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001508def test_main(verbose=None):
1509 test_classes = (BuiltinTest, TestSorted)
1510
1511 run_unittest(*test_classes)
1512
1513 # verify reference counting
1514 if verbose and hasattr(sys, "gettotalrefcount"):
1515 import gc
1516 counts = [None] * 5
1517 for i in xrange(len(counts)):
1518 run_unittest(*test_classes)
1519 gc.collect()
1520 counts[i] = sys.gettotalrefcount()
1521 print counts
1522
Walter Dörwald919497e2003-01-19 16:23:59 +00001523
1524if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001525 test_main(verbose=True)