blob: ca7a8f38c0b4ec9b866a16c3f7ff0ecd23c7b1cb [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
Martin Blais215f13d2006-06-06 12:46:55 +0000365 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000366 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
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000561 # float must not accept the locale specific decimal point but
562 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000563 import locale
564 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000565 return
566
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000567 self.assertEqual(float(" 3.14 "), 3.14)
568 self.assertEqual(float("+3.14 "), 3.14)
569 self.assertEqual(float("-3.14 "), -3.14)
570 self.assertEqual(float(".14 "), .14)
571 self.assertEqual(float("3. "), 3.0)
572 self.assertEqual(float("3.e3 "), 3000.0)
573 self.assertEqual(float("3.2e3 "), 3200.0)
574 self.assertEqual(float("2.5e-1 "), 0.25)
575 self.assertEqual(float("5e-1"), 0.5)
576 self.assertRaises(ValueError, float, " 3,14 ")
577 self.assertRaises(ValueError, float, " +3,14 ")
578 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000579 self.assertRaises(ValueError, float, " 0x3.1 ")
580 self.assertRaises(ValueError, float, " -0x3.p-1 ")
581 self.assertEqual(float(" 25.e-1 "), 2.5)
582 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000583
Brett Cannonc3647ac2005-04-26 03:45:26 +0000584 def test_floatconversion(self):
585 # Make sure that calls to __float__() work properly
586 class Foo0:
587 def __float__(self):
588 return 42.
589
590 class Foo1(object):
591 def __float__(self):
592 return 42.
593
594 class Foo2(float):
595 def __float__(self):
596 return 42.
597
598 class Foo3(float):
599 def __new__(cls, value=0.):
600 return float.__new__(cls, 2*value)
601
602 def __float__(self):
603 return self
604
605 class Foo4(float):
606 def __float__(self):
607 return 42
608
609 self.assertAlmostEqual(float(Foo0()), 42.)
610 self.assertAlmostEqual(float(Foo1()), 42.)
611 self.assertAlmostEqual(float(Foo2()), 42.)
612 self.assertAlmostEqual(float(Foo3(21)), 42.)
613 self.assertRaises(TypeError, float, Foo4(42))
614
Walter Dörwald919497e2003-01-19 16:23:59 +0000615 def test_getattr(self):
616 import sys
617 self.assert_(getattr(sys, 'stdout') is sys.stdout)
618 self.assertRaises(TypeError, getattr, sys, 1)
619 self.assertRaises(TypeError, getattr, sys, 1, "foo")
620 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000621 if have_unicode:
622 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000623
624 def test_hasattr(self):
625 import sys
626 self.assert_(hasattr(sys, 'stdout'))
627 self.assertRaises(TypeError, hasattr, sys, 1)
628 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000629 if have_unicode:
630 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000631
632 def test_hash(self):
633 hash(None)
634 self.assertEqual(hash(1), hash(1L))
635 self.assertEqual(hash(1), hash(1.0))
636 hash('spam')
637 if have_unicode:
638 self.assertEqual(hash('spam'), hash(unicode('spam')))
639 hash((0,1,2,3))
640 def f(): pass
641 self.assertRaises(TypeError, hash, [])
642 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000643 # Bug 1536021: Allow hash to return long objects
644 class X:
645 def __hash__(self):
646 return 2**100
647 self.assertEquals(type(hash(X())), int)
648 class Y(object):
649 def __hash__(self):
650 return 2**100
651 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000652 class Z(long):
653 def __hash__(self):
654 return self
655 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000656
657 def test_hex(self):
658 self.assertEqual(hex(16), '0x10')
659 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000660 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 self.assertEqual(hex(-16L), '-0x10L')
662 self.assertRaises(TypeError, hex, {})
663
664 def test_id(self):
665 id(None)
666 id(1)
667 id(1L)
668 id(1.0)
669 id('spam')
670 id((0,1,2,3))
671 id([0,1,2,3])
672 id({'spam': 1, 'eggs': 2, 'ham': 3})
673
674 # Test input() later, together with raw_input
675
676 def test_int(self):
677 self.assertEqual(int(314), 314)
678 self.assertEqual(int(3.14), 3)
679 self.assertEqual(int(314L), 314)
680 # Check that conversion from float truncates towards zero
681 self.assertEqual(int(-3.14), -3)
682 self.assertEqual(int(3.9), 3)
683 self.assertEqual(int(-3.9), -3)
684 self.assertEqual(int(3.5), 3)
685 self.assertEqual(int(-3.5), -3)
686 # Different base:
687 self.assertEqual(int("10",16), 16L)
688 if have_unicode:
689 self.assertEqual(int(unicode("10"),16), 16L)
690 # Test conversion from strings and various anomalies
691 for s, v in L:
692 for sign in "", "+", "-":
693 for prefix in "", " ", "\t", " \t\t ":
694 ss = prefix + sign + s
695 vv = v
696 if sign == "-" and v is not ValueError:
697 vv = -v
698 try:
699 self.assertEqual(int(ss), vv)
700 except v:
701 pass
702
Walter Dörwald70a6b492004-02-12 17:35:32 +0000703 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000704 self.assertEqual(int(s)+1, -sys.maxint)
705 # should return long
706 int(s[1:])
707
708 # should return long
709 x = int(1e100)
710 self.assert_(isinstance(x, long))
711 x = int(-1e100)
712 self.assert_(isinstance(x, long))
713
714
715 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
716 # Worked by accident in Windows release build, but failed in debug build.
717 # Failed in all Linux builds.
718 x = -1-sys.maxint
719 self.assertEqual(x >> 1, x//2)
720
721 self.assertRaises(ValueError, int, '123\0')
722 self.assertRaises(ValueError, int, '53', 40)
723
724 x = int('1' * 600)
725 self.assert_(isinstance(x, long))
726
727 if have_unicode:
728 x = int(unichr(0x661) * 600)
729 self.assert_(isinstance(x, long))
730
731 self.assertRaises(TypeError, int, 1, 12)
732
733 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000734 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000735
Tim Petersb713ec22006-05-23 18:45:30 +0000736 # SF bug 1334662: int(string, base) wrong answers
737 # Various representations of 2**32 evaluated to 0
738 # rather than 2**32 in previous versions
739
740 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
741 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
742 self.assertEqual(int('10000000000000000', 4), 4294967296L)
743 self.assertEqual(int('32244002423141', 5), 4294967296L)
744 self.assertEqual(int('1550104015504', 6), 4294967296L)
745 self.assertEqual(int('211301422354', 7), 4294967296L)
746 self.assertEqual(int('40000000000', 8), 4294967296L)
747 self.assertEqual(int('12068657454', 9), 4294967296L)
748 self.assertEqual(int('4294967296', 10), 4294967296L)
749 self.assertEqual(int('1904440554', 11), 4294967296L)
750 self.assertEqual(int('9ba461594', 12), 4294967296L)
751 self.assertEqual(int('535a79889', 13), 4294967296L)
752 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
753 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
754 self.assertEqual(int('100000000', 16), 4294967296L)
755 self.assertEqual(int('a7ffda91', 17), 4294967296L)
756 self.assertEqual(int('704he7g4', 18), 4294967296L)
757 self.assertEqual(int('4f5aff66', 19), 4294967296L)
758 self.assertEqual(int('3723ai4g', 20), 4294967296L)
759 self.assertEqual(int('281d55i4', 21), 4294967296L)
760 self.assertEqual(int('1fj8b184', 22), 4294967296L)
761 self.assertEqual(int('1606k7ic', 23), 4294967296L)
762 self.assertEqual(int('mb994ag', 24), 4294967296L)
763 self.assertEqual(int('hek2mgl', 25), 4294967296L)
764 self.assertEqual(int('dnchbnm', 26), 4294967296L)
765 self.assertEqual(int('b28jpdm', 27), 4294967296L)
766 self.assertEqual(int('8pfgih4', 28), 4294967296L)
767 self.assertEqual(int('76beigg', 29), 4294967296L)
768 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
769 self.assertEqual(int('4q0jto4', 31), 4294967296L)
770 self.assertEqual(int('4000000', 32), 4294967296L)
771 self.assertEqual(int('3aokq94', 33), 4294967296L)
772 self.assertEqual(int('2qhxjli', 34), 4294967296L)
773 self.assertEqual(int('2br45qb', 35), 4294967296L)
774 self.assertEqual(int('1z141z4', 36), 4294967296L)
775
776 # SF bug 1334662: int(string, base) wrong answers
777 # Checks for proper evaluation of 2**32 + 1
778 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
779 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
780 self.assertEqual(int('10000000000000001', 4), 4294967297L)
781 self.assertEqual(int('32244002423142', 5), 4294967297L)
782 self.assertEqual(int('1550104015505', 6), 4294967297L)
783 self.assertEqual(int('211301422355', 7), 4294967297L)
784 self.assertEqual(int('40000000001', 8), 4294967297L)
785 self.assertEqual(int('12068657455', 9), 4294967297L)
786 self.assertEqual(int('4294967297', 10), 4294967297L)
787 self.assertEqual(int('1904440555', 11), 4294967297L)
788 self.assertEqual(int('9ba461595', 12), 4294967297L)
789 self.assertEqual(int('535a7988a', 13), 4294967297L)
790 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
791 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
792 self.assertEqual(int('100000001', 16), 4294967297L)
793 self.assertEqual(int('a7ffda92', 17), 4294967297L)
794 self.assertEqual(int('704he7g5', 18), 4294967297L)
795 self.assertEqual(int('4f5aff67', 19), 4294967297L)
796 self.assertEqual(int('3723ai4h', 20), 4294967297L)
797 self.assertEqual(int('281d55i5', 21), 4294967297L)
798 self.assertEqual(int('1fj8b185', 22), 4294967297L)
799 self.assertEqual(int('1606k7id', 23), 4294967297L)
800 self.assertEqual(int('mb994ah', 24), 4294967297L)
801 self.assertEqual(int('hek2mgm', 25), 4294967297L)
802 self.assertEqual(int('dnchbnn', 26), 4294967297L)
803 self.assertEqual(int('b28jpdn', 27), 4294967297L)
804 self.assertEqual(int('8pfgih5', 28), 4294967297L)
805 self.assertEqual(int('76beigh', 29), 4294967297L)
806 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
807 self.assertEqual(int('4q0jto5', 31), 4294967297L)
808 self.assertEqual(int('4000001', 32), 4294967297L)
809 self.assertEqual(int('3aokq95', 33), 4294967297L)
810 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
811 self.assertEqual(int('2br45qc', 35), 4294967297L)
812 self.assertEqual(int('1z141z5', 36), 4294967297L)
813
Brett Cannonc3647ac2005-04-26 03:45:26 +0000814 def test_intconversion(self):
815 # Test __int__()
816 class Foo0:
817 def __int__(self):
818 return 42
819
820 class Foo1(object):
821 def __int__(self):
822 return 42
823
824 class Foo2(int):
825 def __int__(self):
826 return 42
827
828 class Foo3(int):
829 def __int__(self):
830 return self
831
832 class Foo4(int):
833 def __int__(self):
834 return 42L
835
836 class Foo5(int):
837 def __int__(self):
838 return 42.
839
840 self.assertEqual(int(Foo0()), 42)
841 self.assertEqual(int(Foo1()), 42)
842 self.assertEqual(int(Foo2()), 42)
843 self.assertEqual(int(Foo3()), 0)
844 self.assertEqual(int(Foo4()), 42L)
845 self.assertRaises(TypeError, int, Foo5())
846
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 def test_intern(self):
848 self.assertRaises(TypeError, intern)
849 s = "never interned before"
850 self.assert_(intern(s) is s)
851 s2 = s.swapcase().swapcase()
852 self.assert_(intern(s2) is s)
853
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000854 # Subclasses of string can't be interned, because they
855 # provide too much opportunity for insane things to happen.
856 # We don't want them in the interned dict and if they aren't
857 # actually interned, we don't want to create the appearance
858 # that they are by allowing intern() to succeeed.
859 class S(str):
860 def __hash__(self):
861 return 123
862
863 self.assertRaises(TypeError, intern, S("abc"))
864
865 # It's still safe to pass these strings to routines that
866 # call intern internally, e.g. PyObject_SetAttr().
867 s = S("abc")
868 setattr(s, s, s)
869 self.assertEqual(getattr(s, s), s)
870
Walter Dörwald919497e2003-01-19 16:23:59 +0000871 def test_iter(self):
872 self.assertRaises(TypeError, iter)
873 self.assertRaises(TypeError, iter, 42, 42)
874 lists = [("1", "2"), ["1", "2"], "12"]
875 if have_unicode:
876 lists.append(unicode("12"))
877 for l in lists:
878 i = iter(l)
879 self.assertEqual(i.next(), '1')
880 self.assertEqual(i.next(), '2')
881 self.assertRaises(StopIteration, i.next)
882
883 def test_isinstance(self):
884 class C:
885 pass
886 class D(C):
887 pass
888 class E:
889 pass
890 c = C()
891 d = D()
892 e = E()
893 self.assert_(isinstance(c, C))
894 self.assert_(isinstance(d, C))
895 self.assert_(not isinstance(e, C))
896 self.assert_(not isinstance(c, D))
897 self.assert_(not isinstance('foo', E))
898 self.assertRaises(TypeError, isinstance, E, 'foo')
899 self.assertRaises(TypeError, isinstance)
900
901 def test_issubclass(self):
902 class C:
903 pass
904 class D(C):
905 pass
906 class E:
907 pass
908 c = C()
909 d = D()
910 e = E()
911 self.assert_(issubclass(D, C))
912 self.assert_(issubclass(C, C))
913 self.assert_(not issubclass(C, D))
914 self.assertRaises(TypeError, issubclass, 'foo', E)
915 self.assertRaises(TypeError, issubclass, E, 'foo')
916 self.assertRaises(TypeError, issubclass)
917
918 def test_len(self):
919 self.assertEqual(len('123'), 3)
920 self.assertEqual(len(()), 0)
921 self.assertEqual(len((1, 2, 3, 4)), 4)
922 self.assertEqual(len([1, 2, 3, 4]), 4)
923 self.assertEqual(len({}), 0)
924 self.assertEqual(len({'a':1, 'b': 2}), 2)
925 class BadSeq:
926 def __len__(self):
927 raise ValueError
928 self.assertRaises(ValueError, len, BadSeq())
929
930 def test_list(self):
931 self.assertEqual(list([]), [])
932 l0_3 = [0, 1, 2, 3]
933 l0_3_bis = list(l0_3)
934 self.assertEqual(l0_3, l0_3_bis)
935 self.assert_(l0_3 is not l0_3_bis)
936 self.assertEqual(list(()), [])
937 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
938 self.assertEqual(list(''), [])
939 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
940
941 if sys.maxint == 0x7fffffff:
942 # This test can currently only work on 32-bit machines.
943 # XXX If/when PySequence_Length() returns a ssize_t, it should be
944 # XXX re-enabled.
945 # Verify clearing of bug #556025.
946 # This assumes that the max data size (sys.maxint) == max
947 # address size this also assumes that the address size is at
948 # least 4 bytes with 8 byte addresses, the bug is not well
949 # tested
950 #
951 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
952 # earlier due to a newlib bug. See the following mailing list
953 # thread for the details:
954
955 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
956 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
957
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000958 # This code used to segfault in Py2.4a3
959 x = []
960 x.extend(-y for y in x)
961 self.assertEqual(x, [])
962
Walter Dörwald919497e2003-01-19 16:23:59 +0000963 def test_long(self):
964 self.assertEqual(long(314), 314L)
965 self.assertEqual(long(3.14), 3L)
966 self.assertEqual(long(314L), 314L)
967 # Check that conversion from float truncates towards zero
968 self.assertEqual(long(-3.14), -3L)
969 self.assertEqual(long(3.9), 3L)
970 self.assertEqual(long(-3.9), -3L)
971 self.assertEqual(long(3.5), 3L)
972 self.assertEqual(long(-3.5), -3L)
973 self.assertEqual(long("-3"), -3L)
974 if have_unicode:
975 self.assertEqual(long(unicode("-3")), -3L)
976 # Different base:
977 self.assertEqual(long("10",16), 16L)
978 if have_unicode:
979 self.assertEqual(long(unicode("10"),16), 16L)
980 # Check conversions from string (same test set as for int(), and then some)
981 LL = [
982 ('1' + '0'*20, 10L**20),
983 ('1' + '0'*100, 10L**100)
984 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000985 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000986 if have_unicode:
987 L2 += [
988 (unicode('1') + unicode('0')*20, 10L**20),
989 (unicode('1') + unicode('0')*100, 10L**100),
990 ]
991 for s, v in L2 + LL:
992 for sign in "", "+", "-":
993 for prefix in "", " ", "\t", " \t\t ":
994 ss = prefix + sign + s
995 vv = v
996 if sign == "-" and v is not ValueError:
997 vv = -v
998 try:
999 self.assertEqual(long(ss), long(vv))
1000 except v:
1001 pass
1002
1003 self.assertRaises(ValueError, long, '123\0')
1004 self.assertRaises(ValueError, long, '53', 40)
1005 self.assertRaises(TypeError, long, 1, 12)
1006
Tim Peters696cf432006-05-24 21:10:40 +00001007 self.assertEqual(long('100000000000000000000000000000000', 2),
1008 4294967296)
1009 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1010 self.assertEqual(long('10000000000000000', 4), 4294967296)
1011 self.assertEqual(long('32244002423141', 5), 4294967296)
1012 self.assertEqual(long('1550104015504', 6), 4294967296)
1013 self.assertEqual(long('211301422354', 7), 4294967296)
1014 self.assertEqual(long('40000000000', 8), 4294967296)
1015 self.assertEqual(long('12068657454', 9), 4294967296)
1016 self.assertEqual(long('4294967296', 10), 4294967296)
1017 self.assertEqual(long('1904440554', 11), 4294967296)
1018 self.assertEqual(long('9ba461594', 12), 4294967296)
1019 self.assertEqual(long('535a79889', 13), 4294967296)
1020 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1021 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1022 self.assertEqual(long('100000000', 16), 4294967296)
1023 self.assertEqual(long('a7ffda91', 17), 4294967296)
1024 self.assertEqual(long('704he7g4', 18), 4294967296)
1025 self.assertEqual(long('4f5aff66', 19), 4294967296)
1026 self.assertEqual(long('3723ai4g', 20), 4294967296)
1027 self.assertEqual(long('281d55i4', 21), 4294967296)
1028 self.assertEqual(long('1fj8b184', 22), 4294967296)
1029 self.assertEqual(long('1606k7ic', 23), 4294967296)
1030 self.assertEqual(long('mb994ag', 24), 4294967296)
1031 self.assertEqual(long('hek2mgl', 25), 4294967296)
1032 self.assertEqual(long('dnchbnm', 26), 4294967296)
1033 self.assertEqual(long('b28jpdm', 27), 4294967296)
1034 self.assertEqual(long('8pfgih4', 28), 4294967296)
1035 self.assertEqual(long('76beigg', 29), 4294967296)
1036 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1037 self.assertEqual(long('4q0jto4', 31), 4294967296)
1038 self.assertEqual(long('4000000', 32), 4294967296)
1039 self.assertEqual(long('3aokq94', 33), 4294967296)
1040 self.assertEqual(long('2qhxjli', 34), 4294967296)
1041 self.assertEqual(long('2br45qb', 35), 4294967296)
1042 self.assertEqual(long('1z141z4', 36), 4294967296)
1043
1044 self.assertEqual(long('100000000000000000000000000000001', 2),
1045 4294967297)
1046 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1047 self.assertEqual(long('10000000000000001', 4), 4294967297)
1048 self.assertEqual(long('32244002423142', 5), 4294967297)
1049 self.assertEqual(long('1550104015505', 6), 4294967297)
1050 self.assertEqual(long('211301422355', 7), 4294967297)
1051 self.assertEqual(long('40000000001', 8), 4294967297)
1052 self.assertEqual(long('12068657455', 9), 4294967297)
1053 self.assertEqual(long('4294967297', 10), 4294967297)
1054 self.assertEqual(long('1904440555', 11), 4294967297)
1055 self.assertEqual(long('9ba461595', 12), 4294967297)
1056 self.assertEqual(long('535a7988a', 13), 4294967297)
1057 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1058 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1059 self.assertEqual(long('100000001', 16), 4294967297)
1060 self.assertEqual(long('a7ffda92', 17), 4294967297)
1061 self.assertEqual(long('704he7g5', 18), 4294967297)
1062 self.assertEqual(long('4f5aff67', 19), 4294967297)
1063 self.assertEqual(long('3723ai4h', 20), 4294967297)
1064 self.assertEqual(long('281d55i5', 21), 4294967297)
1065 self.assertEqual(long('1fj8b185', 22), 4294967297)
1066 self.assertEqual(long('1606k7id', 23), 4294967297)
1067 self.assertEqual(long('mb994ah', 24), 4294967297)
1068 self.assertEqual(long('hek2mgm', 25), 4294967297)
1069 self.assertEqual(long('dnchbnn', 26), 4294967297)
1070 self.assertEqual(long('b28jpdn', 27), 4294967297)
1071 self.assertEqual(long('8pfgih5', 28), 4294967297)
1072 self.assertEqual(long('76beigh', 29), 4294967297)
1073 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1074 self.assertEqual(long('4q0jto5', 31), 4294967297)
1075 self.assertEqual(long('4000001', 32), 4294967297)
1076 self.assertEqual(long('3aokq95', 33), 4294967297)
1077 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1078 self.assertEqual(long('2br45qc', 35), 4294967297)
1079 self.assertEqual(long('1z141z5', 36), 4294967297)
1080
1081
Brett Cannonc3647ac2005-04-26 03:45:26 +00001082 def test_longconversion(self):
1083 # Test __long__()
1084 class Foo0:
1085 def __long__(self):
1086 return 42L
1087
1088 class Foo1(object):
1089 def __long__(self):
1090 return 42L
1091
1092 class Foo2(long):
1093 def __long__(self):
1094 return 42L
1095
1096 class Foo3(long):
1097 def __long__(self):
1098 return self
1099
1100 class Foo4(long):
1101 def __long__(self):
1102 return 42
1103
1104 class Foo5(long):
1105 def __long__(self):
1106 return 42.
1107
1108 self.assertEqual(long(Foo0()), 42L)
1109 self.assertEqual(long(Foo1()), 42L)
1110 self.assertEqual(long(Foo2()), 42L)
1111 self.assertEqual(long(Foo3()), 0)
1112 self.assertEqual(long(Foo4()), 42)
1113 self.assertRaises(TypeError, long, Foo5())
1114
Walter Dörwald919497e2003-01-19 16:23:59 +00001115 def test_map(self):
1116 self.assertEqual(
1117 map(None, 'hello world'),
1118 ['h','e','l','l','o',' ','w','o','r','l','d']
1119 )
1120 self.assertEqual(
1121 map(None, 'abcd', 'efg'),
1122 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1123 )
1124 self.assertEqual(
1125 map(None, range(10)),
1126 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1127 )
1128 self.assertEqual(
1129 map(lambda x: x*x, range(1,4)),
1130 [1, 4, 9]
1131 )
1132 try:
1133 from math import sqrt
1134 except ImportError:
1135 def sqrt(x):
1136 return pow(x, 0.5)
1137 self.assertEqual(
1138 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1139 [[4.0, 2.0], [9.0, 3.0]]
1140 )
1141 self.assertEqual(
1142 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1143 [10, 4, 6]
1144 )
1145
1146 def plus(*v):
1147 accu = 0
1148 for i in v: accu = accu + i
1149 return accu
1150 self.assertEqual(
1151 map(plus, [1, 3, 7]),
1152 [1, 3, 7]
1153 )
1154 self.assertEqual(
1155 map(plus, [1, 3, 7], [4, 9, 2]),
1156 [1+4, 3+9, 7+2]
1157 )
1158 self.assertEqual(
1159 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1160 [1+4+1, 3+9+1, 7+2+0]
1161 )
1162 self.assertEqual(
1163 map(None, Squares(10)),
1164 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1165 )
1166 self.assertEqual(
1167 map(int, Squares(10)),
1168 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1169 )
1170 self.assertEqual(
1171 map(None, Squares(3), Squares(2)),
1172 [(0,0), (1,1), (4,None)]
1173 )
1174 self.assertEqual(
1175 map(max, Squares(3), Squares(2)),
1176 [0, 1, 4]
1177 )
1178 self.assertRaises(TypeError, map)
1179 self.assertRaises(TypeError, map, lambda x: x, 42)
1180 self.assertEqual(map(None, [42]), [42])
1181 class BadSeq:
1182 def __getitem__(self, index):
1183 raise ValueError
1184 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001185 def badfunc(x):
1186 raise RuntimeError
1187 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001188
1189 def test_max(self):
1190 self.assertEqual(max('123123'), '3')
1191 self.assertEqual(max(1, 2, 3), 3)
1192 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1193 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1194
1195 self.assertEqual(max(1, 2L, 3.0), 3.0)
1196 self.assertEqual(max(1L, 2.0, 3), 3)
1197 self.assertEqual(max(1.0, 2, 3L), 3L)
1198
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001199 for stmt in (
1200 "max(key=int)", # no args
1201 "max(1, key=int)", # single arg not iterable
1202 "max(1, 2, keystone=int)", # wrong keyword
1203 "max(1, 2, key=int, abc=int)", # two many keywords
1204 "max(1, 2, key=1)", # keyfunc is not callable
1205 ):
Tim Peters7f061872004-12-07 21:17:46 +00001206 try:
1207 exec(stmt) in globals()
1208 except TypeError:
1209 pass
1210 else:
1211 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001212
1213 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1214 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1215 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1216
1217 data = [random.randrange(200) for i in range(100)]
1218 keys = dict((elem, random.randrange(50)) for elem in data)
1219 f = keys.__getitem__
1220 self.assertEqual(max(data, key=f),
1221 sorted(reversed(data), key=f)[-1])
1222
Walter Dörwald919497e2003-01-19 16:23:59 +00001223 def test_min(self):
1224 self.assertEqual(min('123123'), '1')
1225 self.assertEqual(min(1, 2, 3), 1)
1226 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1227 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1228
1229 self.assertEqual(min(1, 2L, 3.0), 1)
1230 self.assertEqual(min(1L, 2.0, 3), 1L)
1231 self.assertEqual(min(1.0, 2, 3L), 1.0)
1232
1233 self.assertRaises(TypeError, min)
1234 self.assertRaises(TypeError, min, 42)
1235 self.assertRaises(ValueError, min, ())
1236 class BadSeq:
1237 def __getitem__(self, index):
1238 raise ValueError
1239 self.assertRaises(ValueError, min, BadSeq())
1240 class BadNumber:
1241 def __cmp__(self, other):
1242 raise ValueError
1243 self.assertRaises(ValueError, min, (42, BadNumber()))
1244
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001245 for stmt in (
1246 "min(key=int)", # no args
1247 "min(1, key=int)", # single arg not iterable
1248 "min(1, 2, keystone=int)", # wrong keyword
1249 "min(1, 2, key=int, abc=int)", # two many keywords
1250 "min(1, 2, key=1)", # keyfunc is not callable
1251 ):
Tim Peters7f061872004-12-07 21:17:46 +00001252 try:
1253 exec(stmt) in globals()
1254 except TypeError:
1255 pass
1256 else:
1257 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001258
1259 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1260 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1261 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1262
1263 data = [random.randrange(200) for i in range(100)]
1264 keys = dict((elem, random.randrange(50)) for elem in data)
1265 f = keys.__getitem__
1266 self.assertEqual(min(data, key=f),
1267 sorted(data, key=f)[0])
1268
Walter Dörwald919497e2003-01-19 16:23:59 +00001269 def test_oct(self):
1270 self.assertEqual(oct(100), '0144')
1271 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001272 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001273 self.assertEqual(oct(-100L), '-0144L')
1274 self.assertRaises(TypeError, oct, ())
1275
1276 def write_testfile(self):
1277 # NB the first 4 lines are also used to test input and raw_input, below
1278 fp = open(TESTFN, 'w')
1279 try:
1280 fp.write('1+1\n')
1281 fp.write('1+1\n')
1282 fp.write('The quick brown fox jumps over the lazy dog')
1283 fp.write('.\n')
1284 fp.write('Dear John\n')
1285 fp.write('XXX'*100)
1286 fp.write('YYY'*100)
1287 finally:
1288 fp.close()
1289
1290 def test_open(self):
1291 self.write_testfile()
1292 fp = open(TESTFN, 'r')
1293 try:
1294 self.assertEqual(fp.readline(4), '1+1\n')
1295 self.assertEqual(fp.readline(4), '1+1\n')
1296 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1297 self.assertEqual(fp.readline(4), 'Dear')
1298 self.assertEqual(fp.readline(100), ' John\n')
1299 self.assertEqual(fp.read(300), 'XXX'*100)
1300 self.assertEqual(fp.read(1000), 'YYY'*100)
1301 finally:
1302 fp.close()
1303 unlink(TESTFN)
1304
1305 def test_ord(self):
1306 self.assertEqual(ord(' '), 32)
1307 self.assertEqual(ord('A'), 65)
1308 self.assertEqual(ord('a'), 97)
1309 if have_unicode:
1310 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1311 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001312 if have_unicode:
1313 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001314
1315 def test_pow(self):
1316 self.assertEqual(pow(0,0), 1)
1317 self.assertEqual(pow(0,1), 0)
1318 self.assertEqual(pow(1,0), 1)
1319 self.assertEqual(pow(1,1), 1)
1320
1321 self.assertEqual(pow(2,0), 1)
1322 self.assertEqual(pow(2,10), 1024)
1323 self.assertEqual(pow(2,20), 1024*1024)
1324 self.assertEqual(pow(2,30), 1024*1024*1024)
1325
1326 self.assertEqual(pow(-2,0), 1)
1327 self.assertEqual(pow(-2,1), -2)
1328 self.assertEqual(pow(-2,2), 4)
1329 self.assertEqual(pow(-2,3), -8)
1330
1331 self.assertEqual(pow(0L,0), 1)
1332 self.assertEqual(pow(0L,1), 0)
1333 self.assertEqual(pow(1L,0), 1)
1334 self.assertEqual(pow(1L,1), 1)
1335
1336 self.assertEqual(pow(2L,0), 1)
1337 self.assertEqual(pow(2L,10), 1024)
1338 self.assertEqual(pow(2L,20), 1024*1024)
1339 self.assertEqual(pow(2L,30), 1024*1024*1024)
1340
1341 self.assertEqual(pow(-2L,0), 1)
1342 self.assertEqual(pow(-2L,1), -2)
1343 self.assertEqual(pow(-2L,2), 4)
1344 self.assertEqual(pow(-2L,3), -8)
1345
1346 self.assertAlmostEqual(pow(0.,0), 1.)
1347 self.assertAlmostEqual(pow(0.,1), 0.)
1348 self.assertAlmostEqual(pow(1.,0), 1.)
1349 self.assertAlmostEqual(pow(1.,1), 1.)
1350
1351 self.assertAlmostEqual(pow(2.,0), 1.)
1352 self.assertAlmostEqual(pow(2.,10), 1024.)
1353 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1354 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1355
1356 self.assertAlmostEqual(pow(-2.,0), 1.)
1357 self.assertAlmostEqual(pow(-2.,1), -2.)
1358 self.assertAlmostEqual(pow(-2.,2), 4.)
1359 self.assertAlmostEqual(pow(-2.,3), -8.)
1360
1361 for x in 2, 2L, 2.0:
1362 for y in 10, 10L, 10.0:
1363 for z in 1000, 1000L, 1000.0:
1364 if isinstance(x, float) or \
1365 isinstance(y, float) or \
1366 isinstance(z, float):
1367 self.assertRaises(TypeError, pow, x, y, z)
1368 else:
1369 self.assertAlmostEqual(pow(x, y, z), 24.0)
1370
1371 self.assertRaises(TypeError, pow, -1, -2, 3)
1372 self.assertRaises(ValueError, pow, 1, 2, 0)
1373 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1374 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1375 self.assertRaises(ValueError, pow, -342.43, 0.234)
1376
1377 self.assertRaises(TypeError, pow)
1378
1379 def test_range(self):
1380 self.assertEqual(range(3), [0, 1, 2])
1381 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1382 self.assertEqual(range(0), [])
1383 self.assertEqual(range(-3), [])
1384 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1385 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1386
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001387 # Now test range() with longs
1388 self.assertEqual(range(-2**100), [])
1389 self.assertEqual(range(0, -2**100), [])
1390 self.assertEqual(range(0, 2**100, -1), [])
1391 self.assertEqual(range(0, 2**100, -1), [])
1392
1393 a = long(10 * sys.maxint)
1394 b = long(100 * sys.maxint)
1395 c = long(50 * sys.maxint)
1396
1397 self.assertEqual(range(a, a+2), [a, a+1])
1398 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1399 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1400
1401 seq = range(a, b, c)
1402 self.assert_(a in seq)
1403 self.assert_(b not in seq)
1404 self.assertEqual(len(seq), 2)
1405
1406 seq = range(b, a, -c)
1407 self.assert_(b in seq)
1408 self.assert_(a not in seq)
1409 self.assertEqual(len(seq), 2)
1410
1411 seq = range(-a, -b, -c)
1412 self.assert_(-a in seq)
1413 self.assert_(-b not in seq)
1414 self.assertEqual(len(seq), 2)
1415
Walter Dörwald919497e2003-01-19 16:23:59 +00001416 self.assertRaises(TypeError, range)
1417 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1418 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001419 self.assertRaises(ValueError, range, a, a + 1, long(0))
1420
1421 class badzero(int):
1422 def __cmp__(self, other):
1423 raise RuntimeError
1424 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001425
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001426 # Reject floats when it would require PyLongs to represent.
1427 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001428 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001429
Walter Dörwald357981e2003-04-15 18:59:28 +00001430 self.assertRaises(TypeError, range, 0, "spam")
1431 self.assertRaises(TypeError, range, 0, 42, "spam")
1432
1433 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1434 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1435
Walter Dörwald919497e2003-01-19 16:23:59 +00001436 def test_input_and_raw_input(self):
1437 self.write_testfile()
1438 fp = open(TESTFN, 'r')
1439 savestdin = sys.stdin
1440 savestdout = sys.stdout # Eats the echo
1441 try:
1442 sys.stdin = fp
1443 sys.stdout = BitBucket()
1444 self.assertEqual(input(), 2)
1445 self.assertEqual(input('testing\n'), 2)
1446 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1447 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001448
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001449 # SF 1535165: don't segfault on closed stdin
1450 # sys.stdout must be a regular file for triggering
1451 sys.stdout = savestdout
1452 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001453 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001454
1455 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001456 sys.stdin = cStringIO.StringIO("NULL\0")
1457 self.assertRaises(TypeError, input, 42, 42)
1458 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1459 self.assertEqual(input(), 'whitespace')
1460 sys.stdin = cStringIO.StringIO()
1461 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001462
1463 # SF 876178: make sure input() respect future options.
1464 sys.stdin = cStringIO.StringIO('1/2')
1465 sys.stdout = cStringIO.StringIO()
1466 exec compile('print input()', 'test_builtin_tmp', 'exec')
1467 sys.stdin.seek(0, 0)
1468 exec compile('from __future__ import division;print input()',
1469 'test_builtin_tmp', 'exec')
1470 sys.stdin.seek(0, 0)
1471 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001472 # The result we expect depends on whether new division semantics
1473 # are already in effect.
1474 if 1/2 == 0:
1475 # This test was compiled with old semantics.
1476 expected = ['0', '0.5', '0']
1477 else:
1478 # This test was compiled with new semantics (e.g., -Qnew
1479 # was given on the command line.
1480 expected = ['0.5', '0.5', '0.5']
1481 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001482
Walter Dörwald919497e2003-01-19 16:23:59 +00001483 del sys.stdout
1484 self.assertRaises(RuntimeError, input, 'prompt')
1485 del sys.stdin
1486 self.assertRaises(RuntimeError, input, 'prompt')
1487 finally:
1488 sys.stdin = savestdin
1489 sys.stdout = savestdout
1490 fp.close()
1491 unlink(TESTFN)
1492
1493 def test_reduce(self):
1494 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1495 self.assertEqual(
1496 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1497 ['a','c','d','w']
1498 )
1499 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1500 self.assertEqual(
1501 reduce(lambda x, y: x*y, range(2,21), 1L),
1502 2432902008176640000L
1503 )
1504 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1505 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1506 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1507 self.assertRaises(TypeError, reduce)
1508 self.assertRaises(TypeError, reduce, 42, 42)
1509 self.assertRaises(TypeError, reduce, 42, 42, 42)
1510 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1511 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1512 self.assertRaises(TypeError, reduce, 42, (42, 42))
1513
1514 class BadSeq:
1515 def __getitem__(self, index):
1516 raise ValueError
1517 self.assertRaises(ValueError, reduce, 42, BadSeq())
1518
1519 def test_reload(self):
1520 import marshal
1521 reload(marshal)
1522 import string
1523 reload(string)
1524 ## import sys
1525 ## self.assertRaises(ImportError, reload, sys)
1526
1527 def test_repr(self):
1528 self.assertEqual(repr(''), '\'\'')
1529 self.assertEqual(repr(0), '0')
1530 self.assertEqual(repr(0L), '0L')
1531 self.assertEqual(repr(()), '()')
1532 self.assertEqual(repr([]), '[]')
1533 self.assertEqual(repr({}), '{}')
1534 a = []
1535 a.append(a)
1536 self.assertEqual(repr(a), '[[...]]')
1537 a = {}
1538 a[0] = a
1539 self.assertEqual(repr(a), '{0: {...}}')
1540
1541 def test_round(self):
1542 self.assertEqual(round(0.0), 0.0)
1543 self.assertEqual(round(1.0), 1.0)
1544 self.assertEqual(round(10.0), 10.0)
1545 self.assertEqual(round(1000000000.0), 1000000000.0)
1546 self.assertEqual(round(1e20), 1e20)
1547
1548 self.assertEqual(round(-1.0), -1.0)
1549 self.assertEqual(round(-10.0), -10.0)
1550 self.assertEqual(round(-1000000000.0), -1000000000.0)
1551 self.assertEqual(round(-1e20), -1e20)
1552
1553 self.assertEqual(round(0.1), 0.0)
1554 self.assertEqual(round(1.1), 1.0)
1555 self.assertEqual(round(10.1), 10.0)
1556 self.assertEqual(round(1000000000.1), 1000000000.0)
1557
1558 self.assertEqual(round(-1.1), -1.0)
1559 self.assertEqual(round(-10.1), -10.0)
1560 self.assertEqual(round(-1000000000.1), -1000000000.0)
1561
1562 self.assertEqual(round(0.9), 1.0)
1563 self.assertEqual(round(9.9), 10.0)
1564 self.assertEqual(round(999999999.9), 1000000000.0)
1565
1566 self.assertEqual(round(-0.9), -1.0)
1567 self.assertEqual(round(-9.9), -10.0)
1568 self.assertEqual(round(-999999999.9), -1000000000.0)
1569
1570 self.assertEqual(round(-8.0, -1), -10.0)
1571
Georg Brandlccadf842006-03-31 18:54:53 +00001572 # test new kwargs
1573 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1574
Walter Dörwald919497e2003-01-19 16:23:59 +00001575 self.assertRaises(TypeError, round)
1576
1577 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001578 setattr(sys, 'spam', 1)
1579 self.assertEqual(sys.spam, 1)
1580 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1581 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001582
1583 def test_str(self):
1584 self.assertEqual(str(''), '')
1585 self.assertEqual(str(0), '0')
1586 self.assertEqual(str(0L), '0')
1587 self.assertEqual(str(()), '()')
1588 self.assertEqual(str([]), '[]')
1589 self.assertEqual(str({}), '{}')
1590 a = []
1591 a.append(a)
1592 self.assertEqual(str(a), '[[...]]')
1593 a = {}
1594 a[0] = a
1595 self.assertEqual(str(a), '{0: {...}}')
1596
Alex Martellia70b1912003-04-22 08:12:33 +00001597 def test_sum(self):
1598 self.assertEqual(sum([]), 0)
1599 self.assertEqual(sum(range(2,8)), 27)
1600 self.assertEqual(sum(iter(range(2,8))), 27)
1601 self.assertEqual(sum(Squares(10)), 285)
1602 self.assertEqual(sum(iter(Squares(10))), 285)
1603 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1604
1605 self.assertRaises(TypeError, sum)
1606 self.assertRaises(TypeError, sum, 42)
1607 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1608 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1609 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1610 self.assertRaises(TypeError, sum, [{2:3}])
1611 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1612
1613 class BadSeq:
1614 def __getitem__(self, index):
1615 raise ValueError
1616 self.assertRaises(ValueError, sum, BadSeq())
1617
Walter Dörwald919497e2003-01-19 16:23:59 +00001618 def test_tuple(self):
1619 self.assertEqual(tuple(()), ())
1620 t0_3 = (0, 1, 2, 3)
1621 t0_3_bis = tuple(t0_3)
1622 self.assert_(t0_3 is t0_3_bis)
1623 self.assertEqual(tuple([]), ())
1624 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1625 self.assertEqual(tuple(''), ())
1626 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1627
1628 def test_type(self):
1629 self.assertEqual(type(''), type('123'))
1630 self.assertNotEqual(type(''), type(()))
1631
1632 def test_unichr(self):
1633 if have_unicode:
1634 self.assertEqual(unichr(32), unicode(' '))
1635 self.assertEqual(unichr(65), unicode('A'))
1636 self.assertEqual(unichr(97), unicode('a'))
1637 self.assertEqual(
1638 unichr(sys.maxunicode),
1639 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1640 )
1641 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1642 self.assertRaises(TypeError, unichr)
1643
Guido van Rossumfee7b932005-01-16 00:21:28 +00001644 # We don't want self in vars(), so these are static methods
1645
1646 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001647 def get_vars_f0():
1648 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001649
Guido van Rossumfee7b932005-01-16 00:21:28 +00001650 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001651 def get_vars_f2():
1652 BuiltinTest.get_vars_f0()
1653 a = 1
1654 b = 2
1655 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001656
1657 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001658 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001659 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001660 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001661 self.assertEqual(self.get_vars_f0(), {})
1662 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1663 self.assertRaises(TypeError, vars, 42, 42)
1664 self.assertRaises(TypeError, vars, 42)
1665
1666 def test_zip(self):
1667 a = (1, 2, 3)
1668 b = (4, 5, 6)
1669 t = [(1, 4), (2, 5), (3, 6)]
1670 self.assertEqual(zip(a, b), t)
1671 b = [4, 5, 6]
1672 self.assertEqual(zip(a, b), t)
1673 b = (4, 5, 6, 7)
1674 self.assertEqual(zip(a, b), t)
1675 class I:
1676 def __getitem__(self, i):
1677 if i < 0 or i > 2: raise IndexError
1678 return i + 4
1679 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001680 self.assertEqual(zip(), [])
1681 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001682 self.assertRaises(TypeError, zip, None)
1683 class G:
1684 pass
1685 self.assertRaises(TypeError, zip, a, G())
1686
1687 # Make sure zip doesn't try to allocate a billion elements for the
1688 # result list when one of its arguments doesn't say how long it is.
1689 # A MemoryError is the most likely failure mode.
1690 class SequenceWithoutALength:
1691 def __getitem__(self, i):
1692 if i == 5:
1693 raise IndexError
1694 else:
1695 return i
1696 self.assertEqual(
1697 zip(SequenceWithoutALength(), xrange(2**30)),
1698 list(enumerate(range(5)))
1699 )
1700
1701 class BadSeq:
1702 def __getitem__(self, i):
1703 if i == 5:
1704 raise ValueError
1705 else:
1706 return i
1707 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1708
Raymond Hettinger64958a12003-12-17 20:43:33 +00001709class TestSorted(unittest.TestCase):
1710
1711 def test_basic(self):
1712 data = range(100)
1713 copy = data[:]
1714 random.shuffle(copy)
1715 self.assertEqual(data, sorted(copy))
1716 self.assertNotEqual(data, copy)
1717
1718 data.reverse()
1719 random.shuffle(copy)
1720 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1721 self.assertNotEqual(data, copy)
1722 random.shuffle(copy)
1723 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1724 self.assertNotEqual(data, copy)
1725 random.shuffle(copy)
1726 self.assertEqual(data, sorted(copy, reverse=1))
1727 self.assertNotEqual(data, copy)
1728
1729 def test_inputtypes(self):
1730 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001731 types = [list, tuple]
1732 if have_unicode:
1733 types.insert(0, unicode)
1734 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001735 self.assertEqual(sorted(s), sorted(T(s)))
1736
1737 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001738 types = [set, frozenset, list, tuple, dict.fromkeys]
1739 if have_unicode:
1740 types.insert(0, unicode)
1741 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001742 self.assertEqual(sorted(s), sorted(T(s)))
1743
1744 def test_baddecorator(self):
1745 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1746 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1747
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001748def test_main(verbose=None):
1749 test_classes = (BuiltinTest, TestSorted)
1750
1751 run_unittest(*test_classes)
1752
1753 # verify reference counting
1754 if verbose and hasattr(sys, "gettotalrefcount"):
1755 import gc
1756 counts = [None] * 5
1757 for i in xrange(len(counts)):
1758 run_unittest(*test_classes)
1759 gc.collect()
1760 counts[i] = sys.gettotalrefcount()
1761 print counts
1762
Walter Dörwald919497e2003-01-19 16:23:59 +00001763
1764if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001765 test_main(verbose=True)