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