blob: da2afbac35af4004c583c9fd1884e71c116458f6 [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)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000119 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000120 # float
121 self.assertEqual(abs(0.0), 0.0)
122 self.assertEqual(abs(3.14), 3.14)
123 self.assertEqual(abs(-3.14), 3.14)
124 # long
125 self.assertEqual(abs(0L), 0L)
126 self.assertEqual(abs(1234L), 1234L)
127 self.assertEqual(abs(-1234L), 1234L)
128 # str
129 self.assertRaises(TypeError, abs, 'a')
130
Raymond Hettinger96229b12005-03-11 06:49:40 +0000131 def test_all(self):
132 self.assertEqual(all([2, 4, 6]), True)
133 self.assertEqual(all([2, None, 6]), False)
134 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
135 self.assertRaises(RuntimeError, all, TestFailingIter())
136 self.assertRaises(TypeError, all, 10) # Non-iterable
137 self.assertRaises(TypeError, all) # No args
138 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
139 self.assertEqual(all([]), True) # Empty iterator
140 S = [50, 60]
141 self.assertEqual(all(x > 42 for x in S), True)
142 S = [50, 40, 60]
143 self.assertEqual(all(x > 42 for x in S), False)
144
145 def test_any(self):
146 self.assertEqual(any([None, None, None]), False)
147 self.assertEqual(any([None, 4, None]), True)
148 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
149 self.assertRaises(RuntimeError, all, TestFailingIter())
150 self.assertRaises(TypeError, any, 10) # Non-iterable
151 self.assertRaises(TypeError, any) # No args
152 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
153 self.assertEqual(any([]), False) # Empty iterator
154 S = [40, 60, 30]
155 self.assertEqual(any(x > 42 for x in S), True)
156 S = [10, 20, 30]
157 self.assertEqual(any(x > 42 for x in S), False)
158
Armin Rigo7ccbca92006-10-04 12:17:45 +0000159 def test_neg(self):
160 x = -sys.maxint-1
161 self.assert_(isinstance(x, int))
162 self.assertEqual(-x, sys.maxint+1)
163
Walter Dörwald919497e2003-01-19 16:23:59 +0000164 def test_apply(self):
165 def f0(*args):
166 self.assertEqual(args, ())
167 def f1(a1):
168 self.assertEqual(a1, 1)
169 def f2(a1, a2):
170 self.assertEqual(a1, 1)
171 self.assertEqual(a2, 2)
172 def f3(a1, a2, a3):
173 self.assertEqual(a1, 1)
174 self.assertEqual(a2, 2)
175 self.assertEqual(a3, 3)
176 apply(f0, ())
177 apply(f1, (1,))
178 apply(f2, (1, 2))
179 apply(f3, (1, 2, 3))
180
181 # A PyCFunction that takes only positional parameters should allow an
182 # empty keyword dictionary to pass without a complaint, but raise a
183 # TypeError if the dictionary is non-empty.
184 apply(id, (1,), {})
185 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
186 self.assertRaises(TypeError, apply)
187 self.assertRaises(TypeError, apply, id, 42)
188 self.assertRaises(TypeError, apply, id, (42,), 42)
189
190 def test_callable(self):
191 self.assert_(callable(len))
192 def f(): pass
193 self.assert_(callable(f))
194 class C:
195 def meth(self): pass
196 self.assert_(callable(C))
197 x = C()
198 self.assert_(callable(x.meth))
199 self.assert_(not callable(x))
200 class D(C):
201 def __call__(self): pass
202 y = D()
203 self.assert_(callable(y))
204 y()
205
206 def test_chr(self):
207 self.assertEqual(chr(32), ' ')
208 self.assertEqual(chr(65), 'A')
209 self.assertEqual(chr(97), 'a')
210 self.assertEqual(chr(0xff), '\xff')
211 self.assertRaises(ValueError, chr, 256)
212 self.assertRaises(TypeError, chr)
213
214 def test_cmp(self):
215 self.assertEqual(cmp(-1, 1), -1)
216 self.assertEqual(cmp(1, -1), 1)
217 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000218 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 a = []; a.append(a)
220 b = []; b.append(b)
221 from UserList import UserList
222 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000223 self.assertRaises(RuntimeError, cmp, a, b)
224 self.assertRaises(RuntimeError, cmp, b, c)
225 self.assertRaises(RuntimeError, cmp, c, a)
226 self.assertRaises(RuntimeError, cmp, a, c)
227 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000228 a.pop(); b.pop(); c.pop()
229 self.assertRaises(TypeError, cmp)
230
231 def test_coerce(self):
232 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
233 self.assertEqual(coerce(1, 1L), (1L, 1L))
234 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
235 self.assertRaises(TypeError, coerce)
236 class BadNumber:
237 def __coerce__(self, other):
238 raise ValueError
239 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000240 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000241
242 def test_compile(self):
243 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000244 bom = '\xef\xbb\xbf'
245 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000246 self.assertRaises(TypeError, compile)
247 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
248 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000249 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000250 if have_unicode:
251 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000252 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
253 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000254
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 def test_delattr(self):
256 import sys
257 sys.spam = 1
258 delattr(sys, 'spam')
259 self.assertRaises(TypeError, delattr)
260
261 def test_dir(self):
262 x = 1
263 self.assert_('x' in dir())
264 import sys
265 self.assert_('modules' in dir(sys))
266 self.assertRaises(TypeError, dir, 42, 42)
267
268 def test_divmod(self):
269 self.assertEqual(divmod(12, 7), (1, 5))
270 self.assertEqual(divmod(-12, 7), (-2, 2))
271 self.assertEqual(divmod(12, -7), (-2, -2))
272 self.assertEqual(divmod(-12, -7), (1, -5))
273
274 self.assertEqual(divmod(12L, 7L), (1L, 5L))
275 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
276 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
277 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
278
279 self.assertEqual(divmod(12, 7L), (1, 5L))
280 self.assertEqual(divmod(-12, 7L), (-2, 2L))
281 self.assertEqual(divmod(12L, -7), (-2L, -2))
282 self.assertEqual(divmod(-12L, -7), (1L, -5))
283
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000284 self.assertEqual(divmod(-sys.maxint-1, -1),
285 (sys.maxint+1, 0))
286
Walter Dörwald919497e2003-01-19 16:23:59 +0000287 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
288 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
289 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
290 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
291
292 self.assertRaises(TypeError, divmod)
293
294 def test_eval(self):
295 self.assertEqual(eval('1+1'), 2)
296 self.assertEqual(eval(' 1+1\n'), 2)
297 globals = {'a': 1, 'b': 2}
298 locals = {'b': 200, 'c': 300}
299 self.assertEqual(eval('a', globals) , 1)
300 self.assertEqual(eval('a', globals, locals), 1)
301 self.assertEqual(eval('b', globals, locals), 200)
302 self.assertEqual(eval('c', globals, locals), 300)
303 if have_unicode:
304 self.assertEqual(eval(unicode('1+1')), 2)
305 self.assertEqual(eval(unicode(' 1+1\n')), 2)
306 globals = {'a': 1, 'b': 2}
307 locals = {'b': 200, 'c': 300}
308 if have_unicode:
309 self.assertEqual(eval(unicode('a'), globals), 1)
310 self.assertEqual(eval(unicode('a'), globals, locals), 1)
311 self.assertEqual(eval(unicode('b'), globals, locals), 200)
312 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000313 bom = '\xef\xbb\xbf'
314 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000315 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
316 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000317 self.assertRaises(TypeError, eval)
318 self.assertRaises(TypeError, eval, ())
319
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000320 def test_general_eval(self):
321 # Tests that general mappings can be used for the locals argument
322
323 class M:
324 "Test mapping interface versus possible calls from eval()."
325 def __getitem__(self, key):
326 if key == 'a':
327 return 12
328 raise KeyError
329 def keys(self):
330 return list('xyz')
331
332 m = M()
333 g = globals()
334 self.assertEqual(eval('a', g, m), 12)
335 self.assertRaises(NameError, eval, 'b', g, m)
336 self.assertEqual(eval('dir()', g, m), list('xyz'))
337 self.assertEqual(eval('globals()', g, m), g)
338 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000339 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000340 class A:
341 "Non-mapping"
342 pass
343 m = A()
344 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000345
346 # Verify that dict subclasses work as well
347 class D(dict):
348 def __getitem__(self, key):
349 if key == 'a':
350 return 12
351 return dict.__getitem__(self, key)
352 def keys(self):
353 return list('xyz')
354
355 d = D()
356 self.assertEqual(eval('a', g, d), 12)
357 self.assertRaises(NameError, eval, 'b', g, d)
358 self.assertEqual(eval('dir()', g, d), list('xyz'))
359 self.assertEqual(eval('globals()', g, d), g)
360 self.assertEqual(eval('locals()', g, d), d)
361
362 # Verify locals stores (used by list comps)
363 eval('[locals() for i in (2,3)]', g, d)
364 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
365
366 class SpreadSheet:
367 "Sample application showing nested, calculated lookups."
368 _cells = {}
369 def __setitem__(self, key, formula):
370 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000371 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000372 return eval(self._cells[key], globals(), self)
373
374 ss = SpreadSheet()
375 ss['a1'] = '5'
376 ss['a2'] = 'a1*6'
377 ss['a3'] = 'a2*7'
378 self.assertEqual(ss['a3'], 210)
379
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000380 # Verify that dir() catches a non-list returned by eval
381 # SF bug #1004669
382 class C:
383 def __getitem__(self, item):
384 raise KeyError(item)
385 def keys(self):
386 return 'a'
387 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
388
Walter Dörwald919497e2003-01-19 16:23:59 +0000389 # Done outside of the method test_z to get the correct scope
390 z = 0
391 f = open(TESTFN, 'w')
392 f.write('z = z+1\n')
393 f.write('z = z*2\n')
394 f.close()
395 execfile(TESTFN)
396
397 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000398 global numruns
399 if numruns:
400 return
401 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000402
Walter Dörwald919497e2003-01-19 16:23:59 +0000403 globals = {'a': 1, 'b': 2}
404 locals = {'b': 200, 'c': 300}
405
406 self.assertEqual(self.__class__.z, 2)
407 globals['z'] = 0
408 execfile(TESTFN, globals)
409 self.assertEqual(globals['z'], 2)
410 locals['z'] = 0
411 execfile(TESTFN, globals, locals)
412 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000413
414 class M:
415 "Test mapping interface versus possible calls from execfile()."
416 def __init__(self):
417 self.z = 10
418 def __getitem__(self, key):
419 if key == 'z':
420 return self.z
421 raise KeyError
422 def __setitem__(self, key, value):
423 if key == 'z':
424 self.z = value
425 return
426 raise KeyError
427
428 locals = M()
429 locals['z'] = 0
430 execfile(TESTFN, globals, locals)
431 self.assertEqual(locals['z'], 2)
432
Walter Dörwald919497e2003-01-19 16:23:59 +0000433 unlink(TESTFN)
434 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000435 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000436 import os
437 self.assertRaises(IOError, execfile, os.curdir)
438 self.assertRaises(IOError, execfile, "I_dont_exist")
439
440 def test_filter(self):
441 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
442 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
443 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
444 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
445 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
446 def identity(item):
447 return 1
448 filter(identity, Squares(5))
449 self.assertRaises(TypeError, filter)
450 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000451 def __getitem__(self, index):
452 if index<4:
453 return 42
454 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000455 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
456 def badfunc():
457 pass
458 self.assertRaises(TypeError, filter, badfunc, range(5))
459
Walter Dörwaldbf517072003-01-27 15:57:14 +0000460 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000461 self.assertEqual(filter(None, (1, 2)), (1, 2))
462 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
463 self.assertRaises(TypeError, filter, 42, (1, 2))
464
Walter Dörwaldbf517072003-01-27 15:57:14 +0000465 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000466 self.assertEqual(filter(None, "12"), "12")
467 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
468 self.assertRaises(TypeError, filter, 42, "12")
469 class badstr(str):
470 def __getitem__(self, index):
471 raise ValueError
472 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000473
Walter Dörwald903f1e02003-02-04 16:28:00 +0000474 class badstr2(str):
475 def __getitem__(self, index):
476 return 42
477 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
478
479 class weirdstr(str):
480 def __getitem__(self, index):
481 return weirdstr(2*str.__getitem__(self, index))
482 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
483
Walter Dörwald5e61e242003-02-04 17:04:01 +0000484 class shiftstr(str):
485 def __getitem__(self, index):
486 return chr(ord(str.__getitem__(self, index))+1)
487 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
488
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000489 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000490 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000491 self.assertEqual(filter(None, unicode("12")), unicode("12"))
492 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
493 self.assertRaises(TypeError, filter, 42, unicode("12"))
494 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000495
Walter Dörwald903f1e02003-02-04 16:28:00 +0000496 class badunicode(unicode):
497 def __getitem__(self, index):
498 return 42
499 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
500
501 class weirdunicode(unicode):
502 def __getitem__(self, index):
503 return weirdunicode(2*unicode.__getitem__(self, index))
504 self.assertEqual(
505 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
506
Walter Dörwald5e61e242003-02-04 17:04:01 +0000507 class shiftunicode(unicode):
508 def __getitem__(self, index):
509 return unichr(ord(unicode.__getitem__(self, index))+1)
510 self.assertEqual(
511 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
512 unicode("345")
513 )
514
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000515 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000516 # test that filter() never returns tuple, str or unicode subclasses
517 # and that the result always goes through __getitem__
518 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000519 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000520 def __getitem__(self, index):
521 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000522 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000523 def __getitem__(self, index):
524 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000525 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000526 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000527 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000528 }
529 if have_unicode:
530 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000531 def __getitem__(self, index):
532 return 2*unicode.__getitem__(self, index)
533 inputs[unicode2] = {
534 unicode(): unicode(),
535 unicode("123"): unicode("112233")
536 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000537
Walter Dörwald1918f772003-02-10 13:19:13 +0000538 for (cls, inps) in inputs.iteritems():
539 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000540 # make sure the output goes through __getitem__
541 # even if func is None
542 self.assertEqual(
543 filter(funcs[0], cls(inp)),
544 filter(funcs[1], cls(inp))
545 )
546 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000547 outp = filter(func, cls(inp))
548 self.assertEqual(outp, exp)
549 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000550
Walter Dörwald919497e2003-01-19 16:23:59 +0000551 def test_float(self):
552 self.assertEqual(float(3.14), 3.14)
553 self.assertEqual(float(314), 314.0)
554 self.assertEqual(float(314L), 314.0)
555 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000556 self.assertRaises(ValueError, float, " 0x3.1 ")
557 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000558 if have_unicode:
559 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
560 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000561 # Implementation limitation in PyFloat_FromString()
562 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000563
Georg Brandlde9b6242006-04-30 11:13:56 +0000564 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000565 def test_float_with_comma(self):
566 # set locale to something that doesn't use '.' for the decimal point
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000567 # float must not accept the locale specific decimal point but
568 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000569 import locale
570 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000571 return
572
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000573 self.assertEqual(float(" 3.14 "), 3.14)
574 self.assertEqual(float("+3.14 "), 3.14)
575 self.assertEqual(float("-3.14 "), -3.14)
576 self.assertEqual(float(".14 "), .14)
577 self.assertEqual(float("3. "), 3.0)
578 self.assertEqual(float("3.e3 "), 3000.0)
579 self.assertEqual(float("3.2e3 "), 3200.0)
580 self.assertEqual(float("2.5e-1 "), 0.25)
581 self.assertEqual(float("5e-1"), 0.5)
582 self.assertRaises(ValueError, float, " 3,14 ")
583 self.assertRaises(ValueError, float, " +3,14 ")
584 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000585 self.assertRaises(ValueError, float, " 0x3.1 ")
586 self.assertRaises(ValueError, float, " -0x3.p-1 ")
587 self.assertEqual(float(" 25.e-1 "), 2.5)
588 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000589
Brett Cannonc3647ac2005-04-26 03:45:26 +0000590 def test_floatconversion(self):
591 # Make sure that calls to __float__() work properly
592 class Foo0:
593 def __float__(self):
594 return 42.
595
596 class Foo1(object):
597 def __float__(self):
598 return 42.
599
600 class Foo2(float):
601 def __float__(self):
602 return 42.
603
604 class Foo3(float):
605 def __new__(cls, value=0.):
606 return float.__new__(cls, 2*value)
607
608 def __float__(self):
609 return self
610
611 class Foo4(float):
612 def __float__(self):
613 return 42
614
615 self.assertAlmostEqual(float(Foo0()), 42.)
616 self.assertAlmostEqual(float(Foo1()), 42.)
617 self.assertAlmostEqual(float(Foo2()), 42.)
618 self.assertAlmostEqual(float(Foo3(21)), 42.)
619 self.assertRaises(TypeError, float, Foo4(42))
620
Walter Dörwald919497e2003-01-19 16:23:59 +0000621 def test_getattr(self):
622 import sys
623 self.assert_(getattr(sys, 'stdout') is sys.stdout)
624 self.assertRaises(TypeError, getattr, sys, 1)
625 self.assertRaises(TypeError, getattr, sys, 1, "foo")
626 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000627 if have_unicode:
628 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000629
630 def test_hasattr(self):
631 import sys
632 self.assert_(hasattr(sys, 'stdout'))
633 self.assertRaises(TypeError, hasattr, sys, 1)
634 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000635 if have_unicode:
636 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000637
638 def test_hash(self):
639 hash(None)
640 self.assertEqual(hash(1), hash(1L))
641 self.assertEqual(hash(1), hash(1.0))
642 hash('spam')
643 if have_unicode:
644 self.assertEqual(hash('spam'), hash(unicode('spam')))
645 hash((0,1,2,3))
646 def f(): pass
647 self.assertRaises(TypeError, hash, [])
648 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000649 # Bug 1536021: Allow hash to return long objects
650 class X:
651 def __hash__(self):
652 return 2**100
653 self.assertEquals(type(hash(X())), int)
654 class Y(object):
655 def __hash__(self):
656 return 2**100
657 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000658 class Z(long):
659 def __hash__(self):
660 return self
661 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000662
663 def test_hex(self):
664 self.assertEqual(hex(16), '0x10')
665 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000666 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000667 self.assertEqual(hex(-16L), '-0x10L')
668 self.assertRaises(TypeError, hex, {})
669
670 def test_id(self):
671 id(None)
672 id(1)
673 id(1L)
674 id(1.0)
675 id('spam')
676 id((0,1,2,3))
677 id([0,1,2,3])
678 id({'spam': 1, 'eggs': 2, 'ham': 3})
679
680 # Test input() later, together with raw_input
681
682 def test_int(self):
683 self.assertEqual(int(314), 314)
684 self.assertEqual(int(3.14), 3)
685 self.assertEqual(int(314L), 314)
686 # Check that conversion from float truncates towards zero
687 self.assertEqual(int(-3.14), -3)
688 self.assertEqual(int(3.9), 3)
689 self.assertEqual(int(-3.9), -3)
690 self.assertEqual(int(3.5), 3)
691 self.assertEqual(int(-3.5), -3)
692 # Different base:
693 self.assertEqual(int("10",16), 16L)
694 if have_unicode:
695 self.assertEqual(int(unicode("10"),16), 16L)
696 # Test conversion from strings and various anomalies
697 for s, v in L:
698 for sign in "", "+", "-":
699 for prefix in "", " ", "\t", " \t\t ":
700 ss = prefix + sign + s
701 vv = v
702 if sign == "-" and v is not ValueError:
703 vv = -v
704 try:
705 self.assertEqual(int(ss), vv)
706 except v:
707 pass
708
Walter Dörwald70a6b492004-02-12 17:35:32 +0000709 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000710 x = int(s)
711 self.assertEqual(x+1, -sys.maxint)
712 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000713 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000714 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000715
716 # should return long
717 x = int(1e100)
718 self.assert_(isinstance(x, long))
719 x = int(-1e100)
720 self.assert_(isinstance(x, long))
721
722
723 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
724 # Worked by accident in Windows release build, but failed in debug build.
725 # Failed in all Linux builds.
726 x = -1-sys.maxint
727 self.assertEqual(x >> 1, x//2)
728
729 self.assertRaises(ValueError, int, '123\0')
730 self.assertRaises(ValueError, int, '53', 40)
731
Georg Brandl2c1375c2006-10-12 11:27:59 +0000732 # SF bug 1545497: embedded NULs were not detected with
733 # explicit base
734 self.assertRaises(ValueError, int, '123\0', 10)
735 self.assertRaises(ValueError, int, '123\x00 245', 20)
736
Walter Dörwald919497e2003-01-19 16:23:59 +0000737 x = int('1' * 600)
738 self.assert_(isinstance(x, long))
739
740 if have_unicode:
741 x = int(unichr(0x661) * 600)
742 self.assert_(isinstance(x, long))
743
744 self.assertRaises(TypeError, int, 1, 12)
745
746 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000747 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000748
Tim Petersb713ec22006-05-23 18:45:30 +0000749 # SF bug 1334662: int(string, base) wrong answers
750 # Various representations of 2**32 evaluated to 0
751 # rather than 2**32 in previous versions
752
753 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
754 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
755 self.assertEqual(int('10000000000000000', 4), 4294967296L)
756 self.assertEqual(int('32244002423141', 5), 4294967296L)
757 self.assertEqual(int('1550104015504', 6), 4294967296L)
758 self.assertEqual(int('211301422354', 7), 4294967296L)
759 self.assertEqual(int('40000000000', 8), 4294967296L)
760 self.assertEqual(int('12068657454', 9), 4294967296L)
761 self.assertEqual(int('4294967296', 10), 4294967296L)
762 self.assertEqual(int('1904440554', 11), 4294967296L)
763 self.assertEqual(int('9ba461594', 12), 4294967296L)
764 self.assertEqual(int('535a79889', 13), 4294967296L)
765 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
766 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
767 self.assertEqual(int('100000000', 16), 4294967296L)
768 self.assertEqual(int('a7ffda91', 17), 4294967296L)
769 self.assertEqual(int('704he7g4', 18), 4294967296L)
770 self.assertEqual(int('4f5aff66', 19), 4294967296L)
771 self.assertEqual(int('3723ai4g', 20), 4294967296L)
772 self.assertEqual(int('281d55i4', 21), 4294967296L)
773 self.assertEqual(int('1fj8b184', 22), 4294967296L)
774 self.assertEqual(int('1606k7ic', 23), 4294967296L)
775 self.assertEqual(int('mb994ag', 24), 4294967296L)
776 self.assertEqual(int('hek2mgl', 25), 4294967296L)
777 self.assertEqual(int('dnchbnm', 26), 4294967296L)
778 self.assertEqual(int('b28jpdm', 27), 4294967296L)
779 self.assertEqual(int('8pfgih4', 28), 4294967296L)
780 self.assertEqual(int('76beigg', 29), 4294967296L)
781 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
782 self.assertEqual(int('4q0jto4', 31), 4294967296L)
783 self.assertEqual(int('4000000', 32), 4294967296L)
784 self.assertEqual(int('3aokq94', 33), 4294967296L)
785 self.assertEqual(int('2qhxjli', 34), 4294967296L)
786 self.assertEqual(int('2br45qb', 35), 4294967296L)
787 self.assertEqual(int('1z141z4', 36), 4294967296L)
788
789 # SF bug 1334662: int(string, base) wrong answers
790 # Checks for proper evaluation of 2**32 + 1
791 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
792 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
793 self.assertEqual(int('10000000000000001', 4), 4294967297L)
794 self.assertEqual(int('32244002423142', 5), 4294967297L)
795 self.assertEqual(int('1550104015505', 6), 4294967297L)
796 self.assertEqual(int('211301422355', 7), 4294967297L)
797 self.assertEqual(int('40000000001', 8), 4294967297L)
798 self.assertEqual(int('12068657455', 9), 4294967297L)
799 self.assertEqual(int('4294967297', 10), 4294967297L)
800 self.assertEqual(int('1904440555', 11), 4294967297L)
801 self.assertEqual(int('9ba461595', 12), 4294967297L)
802 self.assertEqual(int('535a7988a', 13), 4294967297L)
803 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
804 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
805 self.assertEqual(int('100000001', 16), 4294967297L)
806 self.assertEqual(int('a7ffda92', 17), 4294967297L)
807 self.assertEqual(int('704he7g5', 18), 4294967297L)
808 self.assertEqual(int('4f5aff67', 19), 4294967297L)
809 self.assertEqual(int('3723ai4h', 20), 4294967297L)
810 self.assertEqual(int('281d55i5', 21), 4294967297L)
811 self.assertEqual(int('1fj8b185', 22), 4294967297L)
812 self.assertEqual(int('1606k7id', 23), 4294967297L)
813 self.assertEqual(int('mb994ah', 24), 4294967297L)
814 self.assertEqual(int('hek2mgm', 25), 4294967297L)
815 self.assertEqual(int('dnchbnn', 26), 4294967297L)
816 self.assertEqual(int('b28jpdn', 27), 4294967297L)
817 self.assertEqual(int('8pfgih5', 28), 4294967297L)
818 self.assertEqual(int('76beigh', 29), 4294967297L)
819 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
820 self.assertEqual(int('4q0jto5', 31), 4294967297L)
821 self.assertEqual(int('4000001', 32), 4294967297L)
822 self.assertEqual(int('3aokq95', 33), 4294967297L)
823 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
824 self.assertEqual(int('2br45qc', 35), 4294967297L)
825 self.assertEqual(int('1z141z5', 36), 4294967297L)
826
Brett Cannonc3647ac2005-04-26 03:45:26 +0000827 def test_intconversion(self):
828 # Test __int__()
829 class Foo0:
830 def __int__(self):
831 return 42
832
833 class Foo1(object):
834 def __int__(self):
835 return 42
836
837 class Foo2(int):
838 def __int__(self):
839 return 42
840
841 class Foo3(int):
842 def __int__(self):
843 return self
844
845 class Foo4(int):
846 def __int__(self):
847 return 42L
848
849 class Foo5(int):
850 def __int__(self):
851 return 42.
852
853 self.assertEqual(int(Foo0()), 42)
854 self.assertEqual(int(Foo1()), 42)
855 self.assertEqual(int(Foo2()), 42)
856 self.assertEqual(int(Foo3()), 0)
857 self.assertEqual(int(Foo4()), 42L)
858 self.assertRaises(TypeError, int, Foo5())
859
Walter Dörwald919497e2003-01-19 16:23:59 +0000860 def test_intern(self):
861 self.assertRaises(TypeError, intern)
862 s = "never interned before"
863 self.assert_(intern(s) is s)
864 s2 = s.swapcase().swapcase()
865 self.assert_(intern(s2) is s)
866
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000867 # Subclasses of string can't be interned, because they
868 # provide too much opportunity for insane things to happen.
869 # We don't want them in the interned dict and if they aren't
870 # actually interned, we don't want to create the appearance
871 # that they are by allowing intern() to succeeed.
872 class S(str):
873 def __hash__(self):
874 return 123
875
876 self.assertRaises(TypeError, intern, S("abc"))
877
878 # It's still safe to pass these strings to routines that
879 # call intern internally, e.g. PyObject_SetAttr().
880 s = S("abc")
881 setattr(s, s, s)
882 self.assertEqual(getattr(s, s), s)
883
Walter Dörwald919497e2003-01-19 16:23:59 +0000884 def test_iter(self):
885 self.assertRaises(TypeError, iter)
886 self.assertRaises(TypeError, iter, 42, 42)
887 lists = [("1", "2"), ["1", "2"], "12"]
888 if have_unicode:
889 lists.append(unicode("12"))
890 for l in lists:
891 i = iter(l)
892 self.assertEqual(i.next(), '1')
893 self.assertEqual(i.next(), '2')
894 self.assertRaises(StopIteration, i.next)
895
896 def test_isinstance(self):
897 class C:
898 pass
899 class D(C):
900 pass
901 class E:
902 pass
903 c = C()
904 d = D()
905 e = E()
906 self.assert_(isinstance(c, C))
907 self.assert_(isinstance(d, C))
908 self.assert_(not isinstance(e, C))
909 self.assert_(not isinstance(c, D))
910 self.assert_(not isinstance('foo', E))
911 self.assertRaises(TypeError, isinstance, E, 'foo')
912 self.assertRaises(TypeError, isinstance)
913
914 def test_issubclass(self):
915 class C:
916 pass
917 class D(C):
918 pass
919 class E:
920 pass
921 c = C()
922 d = D()
923 e = E()
924 self.assert_(issubclass(D, C))
925 self.assert_(issubclass(C, C))
926 self.assert_(not issubclass(C, D))
927 self.assertRaises(TypeError, issubclass, 'foo', E)
928 self.assertRaises(TypeError, issubclass, E, 'foo')
929 self.assertRaises(TypeError, issubclass)
930
931 def test_len(self):
932 self.assertEqual(len('123'), 3)
933 self.assertEqual(len(()), 0)
934 self.assertEqual(len((1, 2, 3, 4)), 4)
935 self.assertEqual(len([1, 2, 3, 4]), 4)
936 self.assertEqual(len({}), 0)
937 self.assertEqual(len({'a':1, 'b': 2}), 2)
938 class BadSeq:
939 def __len__(self):
940 raise ValueError
941 self.assertRaises(ValueError, len, BadSeq())
942
943 def test_list(self):
944 self.assertEqual(list([]), [])
945 l0_3 = [0, 1, 2, 3]
946 l0_3_bis = list(l0_3)
947 self.assertEqual(l0_3, l0_3_bis)
948 self.assert_(l0_3 is not l0_3_bis)
949 self.assertEqual(list(()), [])
950 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
951 self.assertEqual(list(''), [])
952 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
953
954 if sys.maxint == 0x7fffffff:
955 # This test can currently only work on 32-bit machines.
956 # XXX If/when PySequence_Length() returns a ssize_t, it should be
957 # XXX re-enabled.
958 # Verify clearing of bug #556025.
959 # This assumes that the max data size (sys.maxint) == max
960 # address size this also assumes that the address size is at
961 # least 4 bytes with 8 byte addresses, the bug is not well
962 # tested
963 #
964 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
965 # earlier due to a newlib bug. See the following mailing list
966 # thread for the details:
967
968 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
969 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
970
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000971 # This code used to segfault in Py2.4a3
972 x = []
973 x.extend(-y for y in x)
974 self.assertEqual(x, [])
975
Walter Dörwald919497e2003-01-19 16:23:59 +0000976 def test_long(self):
977 self.assertEqual(long(314), 314L)
978 self.assertEqual(long(3.14), 3L)
979 self.assertEqual(long(314L), 314L)
980 # Check that conversion from float truncates towards zero
981 self.assertEqual(long(-3.14), -3L)
982 self.assertEqual(long(3.9), 3L)
983 self.assertEqual(long(-3.9), -3L)
984 self.assertEqual(long(3.5), 3L)
985 self.assertEqual(long(-3.5), -3L)
986 self.assertEqual(long("-3"), -3L)
987 if have_unicode:
988 self.assertEqual(long(unicode("-3")), -3L)
989 # Different base:
990 self.assertEqual(long("10",16), 16L)
991 if have_unicode:
992 self.assertEqual(long(unicode("10"),16), 16L)
993 # Check conversions from string (same test set as for int(), and then some)
994 LL = [
995 ('1' + '0'*20, 10L**20),
996 ('1' + '0'*100, 10L**100)
997 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000998 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000999 if have_unicode:
1000 L2 += [
1001 (unicode('1') + unicode('0')*20, 10L**20),
1002 (unicode('1') + unicode('0')*100, 10L**100),
1003 ]
1004 for s, v in L2 + LL:
1005 for sign in "", "+", "-":
1006 for prefix in "", " ", "\t", " \t\t ":
1007 ss = prefix + sign + s
1008 vv = v
1009 if sign == "-" and v is not ValueError:
1010 vv = -v
1011 try:
1012 self.assertEqual(long(ss), long(vv))
1013 except v:
1014 pass
1015
1016 self.assertRaises(ValueError, long, '123\0')
1017 self.assertRaises(ValueError, long, '53', 40)
1018 self.assertRaises(TypeError, long, 1, 12)
1019
Georg Brandl00cd8182007-03-06 18:41:12 +00001020 # SF patch #1638879: embedded NULs were not detected with
1021 # explicit base
1022 self.assertRaises(ValueError, long, '123\0', 10)
1023 self.assertRaises(ValueError, long, '123\x00 245', 20)
1024
Tim Peters696cf432006-05-24 21:10:40 +00001025 self.assertEqual(long('100000000000000000000000000000000', 2),
1026 4294967296)
1027 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1028 self.assertEqual(long('10000000000000000', 4), 4294967296)
1029 self.assertEqual(long('32244002423141', 5), 4294967296)
1030 self.assertEqual(long('1550104015504', 6), 4294967296)
1031 self.assertEqual(long('211301422354', 7), 4294967296)
1032 self.assertEqual(long('40000000000', 8), 4294967296)
1033 self.assertEqual(long('12068657454', 9), 4294967296)
1034 self.assertEqual(long('4294967296', 10), 4294967296)
1035 self.assertEqual(long('1904440554', 11), 4294967296)
1036 self.assertEqual(long('9ba461594', 12), 4294967296)
1037 self.assertEqual(long('535a79889', 13), 4294967296)
1038 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1039 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1040 self.assertEqual(long('100000000', 16), 4294967296)
1041 self.assertEqual(long('a7ffda91', 17), 4294967296)
1042 self.assertEqual(long('704he7g4', 18), 4294967296)
1043 self.assertEqual(long('4f5aff66', 19), 4294967296)
1044 self.assertEqual(long('3723ai4g', 20), 4294967296)
1045 self.assertEqual(long('281d55i4', 21), 4294967296)
1046 self.assertEqual(long('1fj8b184', 22), 4294967296)
1047 self.assertEqual(long('1606k7ic', 23), 4294967296)
1048 self.assertEqual(long('mb994ag', 24), 4294967296)
1049 self.assertEqual(long('hek2mgl', 25), 4294967296)
1050 self.assertEqual(long('dnchbnm', 26), 4294967296)
1051 self.assertEqual(long('b28jpdm', 27), 4294967296)
1052 self.assertEqual(long('8pfgih4', 28), 4294967296)
1053 self.assertEqual(long('76beigg', 29), 4294967296)
1054 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1055 self.assertEqual(long('4q0jto4', 31), 4294967296)
1056 self.assertEqual(long('4000000', 32), 4294967296)
1057 self.assertEqual(long('3aokq94', 33), 4294967296)
1058 self.assertEqual(long('2qhxjli', 34), 4294967296)
1059 self.assertEqual(long('2br45qb', 35), 4294967296)
1060 self.assertEqual(long('1z141z4', 36), 4294967296)
1061
1062 self.assertEqual(long('100000000000000000000000000000001', 2),
1063 4294967297)
1064 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1065 self.assertEqual(long('10000000000000001', 4), 4294967297)
1066 self.assertEqual(long('32244002423142', 5), 4294967297)
1067 self.assertEqual(long('1550104015505', 6), 4294967297)
1068 self.assertEqual(long('211301422355', 7), 4294967297)
1069 self.assertEqual(long('40000000001', 8), 4294967297)
1070 self.assertEqual(long('12068657455', 9), 4294967297)
1071 self.assertEqual(long('4294967297', 10), 4294967297)
1072 self.assertEqual(long('1904440555', 11), 4294967297)
1073 self.assertEqual(long('9ba461595', 12), 4294967297)
1074 self.assertEqual(long('535a7988a', 13), 4294967297)
1075 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1076 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1077 self.assertEqual(long('100000001', 16), 4294967297)
1078 self.assertEqual(long('a7ffda92', 17), 4294967297)
1079 self.assertEqual(long('704he7g5', 18), 4294967297)
1080 self.assertEqual(long('4f5aff67', 19), 4294967297)
1081 self.assertEqual(long('3723ai4h', 20), 4294967297)
1082 self.assertEqual(long('281d55i5', 21), 4294967297)
1083 self.assertEqual(long('1fj8b185', 22), 4294967297)
1084 self.assertEqual(long('1606k7id', 23), 4294967297)
1085 self.assertEqual(long('mb994ah', 24), 4294967297)
1086 self.assertEqual(long('hek2mgm', 25), 4294967297)
1087 self.assertEqual(long('dnchbnn', 26), 4294967297)
1088 self.assertEqual(long('b28jpdn', 27), 4294967297)
1089 self.assertEqual(long('8pfgih5', 28), 4294967297)
1090 self.assertEqual(long('76beigh', 29), 4294967297)
1091 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1092 self.assertEqual(long('4q0jto5', 31), 4294967297)
1093 self.assertEqual(long('4000001', 32), 4294967297)
1094 self.assertEqual(long('3aokq95', 33), 4294967297)
1095 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1096 self.assertEqual(long('2br45qc', 35), 4294967297)
1097 self.assertEqual(long('1z141z5', 36), 4294967297)
1098
1099
Brett Cannonc3647ac2005-04-26 03:45:26 +00001100 def test_longconversion(self):
1101 # Test __long__()
1102 class Foo0:
1103 def __long__(self):
1104 return 42L
1105
1106 class Foo1(object):
1107 def __long__(self):
1108 return 42L
1109
1110 class Foo2(long):
1111 def __long__(self):
1112 return 42L
1113
1114 class Foo3(long):
1115 def __long__(self):
1116 return self
1117
1118 class Foo4(long):
1119 def __long__(self):
1120 return 42
1121
1122 class Foo5(long):
1123 def __long__(self):
1124 return 42.
1125
1126 self.assertEqual(long(Foo0()), 42L)
1127 self.assertEqual(long(Foo1()), 42L)
1128 self.assertEqual(long(Foo2()), 42L)
1129 self.assertEqual(long(Foo3()), 0)
1130 self.assertEqual(long(Foo4()), 42)
1131 self.assertRaises(TypeError, long, Foo5())
1132
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def test_map(self):
1134 self.assertEqual(
1135 map(None, 'hello world'),
1136 ['h','e','l','l','o',' ','w','o','r','l','d']
1137 )
1138 self.assertEqual(
1139 map(None, 'abcd', 'efg'),
1140 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1141 )
1142 self.assertEqual(
1143 map(None, range(10)),
1144 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1145 )
1146 self.assertEqual(
1147 map(lambda x: x*x, range(1,4)),
1148 [1, 4, 9]
1149 )
1150 try:
1151 from math import sqrt
1152 except ImportError:
1153 def sqrt(x):
1154 return pow(x, 0.5)
1155 self.assertEqual(
1156 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1157 [[4.0, 2.0], [9.0, 3.0]]
1158 )
1159 self.assertEqual(
1160 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1161 [10, 4, 6]
1162 )
1163
1164 def plus(*v):
1165 accu = 0
1166 for i in v: accu = accu + i
1167 return accu
1168 self.assertEqual(
1169 map(plus, [1, 3, 7]),
1170 [1, 3, 7]
1171 )
1172 self.assertEqual(
1173 map(plus, [1, 3, 7], [4, 9, 2]),
1174 [1+4, 3+9, 7+2]
1175 )
1176 self.assertEqual(
1177 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1178 [1+4+1, 3+9+1, 7+2+0]
1179 )
1180 self.assertEqual(
1181 map(None, Squares(10)),
1182 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1183 )
1184 self.assertEqual(
1185 map(int, Squares(10)),
1186 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1187 )
1188 self.assertEqual(
1189 map(None, Squares(3), Squares(2)),
1190 [(0,0), (1,1), (4,None)]
1191 )
1192 self.assertEqual(
1193 map(max, Squares(3), Squares(2)),
1194 [0, 1, 4]
1195 )
1196 self.assertRaises(TypeError, map)
1197 self.assertRaises(TypeError, map, lambda x: x, 42)
1198 self.assertEqual(map(None, [42]), [42])
1199 class BadSeq:
1200 def __getitem__(self, index):
1201 raise ValueError
1202 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001203 def badfunc(x):
1204 raise RuntimeError
1205 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001206
1207 def test_max(self):
1208 self.assertEqual(max('123123'), '3')
1209 self.assertEqual(max(1, 2, 3), 3)
1210 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1211 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1212
1213 self.assertEqual(max(1, 2L, 3.0), 3.0)
1214 self.assertEqual(max(1L, 2.0, 3), 3)
1215 self.assertEqual(max(1.0, 2, 3L), 3L)
1216
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001217 for stmt in (
1218 "max(key=int)", # no args
1219 "max(1, key=int)", # single arg not iterable
1220 "max(1, 2, keystone=int)", # wrong keyword
1221 "max(1, 2, key=int, abc=int)", # two many keywords
1222 "max(1, 2, key=1)", # keyfunc is not callable
1223 ):
Tim Peters7f061872004-12-07 21:17:46 +00001224 try:
1225 exec(stmt) in globals()
1226 except TypeError:
1227 pass
1228 else:
1229 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001230
1231 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1232 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1233 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1234
1235 data = [random.randrange(200) for i in range(100)]
1236 keys = dict((elem, random.randrange(50)) for elem in data)
1237 f = keys.__getitem__
1238 self.assertEqual(max(data, key=f),
1239 sorted(reversed(data), key=f)[-1])
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 def test_min(self):
1242 self.assertEqual(min('123123'), '1')
1243 self.assertEqual(min(1, 2, 3), 1)
1244 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1245 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1246
1247 self.assertEqual(min(1, 2L, 3.0), 1)
1248 self.assertEqual(min(1L, 2.0, 3), 1L)
1249 self.assertEqual(min(1.0, 2, 3L), 1.0)
1250
1251 self.assertRaises(TypeError, min)
1252 self.assertRaises(TypeError, min, 42)
1253 self.assertRaises(ValueError, min, ())
1254 class BadSeq:
1255 def __getitem__(self, index):
1256 raise ValueError
1257 self.assertRaises(ValueError, min, BadSeq())
1258 class BadNumber:
1259 def __cmp__(self, other):
1260 raise ValueError
1261 self.assertRaises(ValueError, min, (42, BadNumber()))
1262
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001263 for stmt in (
1264 "min(key=int)", # no args
1265 "min(1, key=int)", # single arg not iterable
1266 "min(1, 2, keystone=int)", # wrong keyword
1267 "min(1, 2, key=int, abc=int)", # two many keywords
1268 "min(1, 2, key=1)", # keyfunc is not callable
1269 ):
Tim Peters7f061872004-12-07 21:17:46 +00001270 try:
1271 exec(stmt) in globals()
1272 except TypeError:
1273 pass
1274 else:
1275 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001276
1277 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1278 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1279 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1280
1281 data = [random.randrange(200) for i in range(100)]
1282 keys = dict((elem, random.randrange(50)) for elem in data)
1283 f = keys.__getitem__
1284 self.assertEqual(min(data, key=f),
1285 sorted(data, key=f)[0])
1286
Walter Dörwald919497e2003-01-19 16:23:59 +00001287 def test_oct(self):
1288 self.assertEqual(oct(100), '0144')
1289 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001290 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001291 self.assertEqual(oct(-100L), '-0144L')
1292 self.assertRaises(TypeError, oct, ())
1293
1294 def write_testfile(self):
1295 # NB the first 4 lines are also used to test input and raw_input, below
1296 fp = open(TESTFN, 'w')
1297 try:
1298 fp.write('1+1\n')
1299 fp.write('1+1\n')
1300 fp.write('The quick brown fox jumps over the lazy dog')
1301 fp.write('.\n')
1302 fp.write('Dear John\n')
1303 fp.write('XXX'*100)
1304 fp.write('YYY'*100)
1305 finally:
1306 fp.close()
1307
1308 def test_open(self):
1309 self.write_testfile()
1310 fp = open(TESTFN, 'r')
1311 try:
1312 self.assertEqual(fp.readline(4), '1+1\n')
1313 self.assertEqual(fp.readline(4), '1+1\n')
1314 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1315 self.assertEqual(fp.readline(4), 'Dear')
1316 self.assertEqual(fp.readline(100), ' John\n')
1317 self.assertEqual(fp.read(300), 'XXX'*100)
1318 self.assertEqual(fp.read(1000), 'YYY'*100)
1319 finally:
1320 fp.close()
1321 unlink(TESTFN)
1322
1323 def test_ord(self):
1324 self.assertEqual(ord(' '), 32)
1325 self.assertEqual(ord('A'), 65)
1326 self.assertEqual(ord('a'), 97)
1327 if have_unicode:
1328 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1329 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001330 if have_unicode:
1331 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001332
1333 def test_pow(self):
1334 self.assertEqual(pow(0,0), 1)
1335 self.assertEqual(pow(0,1), 0)
1336 self.assertEqual(pow(1,0), 1)
1337 self.assertEqual(pow(1,1), 1)
1338
1339 self.assertEqual(pow(2,0), 1)
1340 self.assertEqual(pow(2,10), 1024)
1341 self.assertEqual(pow(2,20), 1024*1024)
1342 self.assertEqual(pow(2,30), 1024*1024*1024)
1343
1344 self.assertEqual(pow(-2,0), 1)
1345 self.assertEqual(pow(-2,1), -2)
1346 self.assertEqual(pow(-2,2), 4)
1347 self.assertEqual(pow(-2,3), -8)
1348
1349 self.assertEqual(pow(0L,0), 1)
1350 self.assertEqual(pow(0L,1), 0)
1351 self.assertEqual(pow(1L,0), 1)
1352 self.assertEqual(pow(1L,1), 1)
1353
1354 self.assertEqual(pow(2L,0), 1)
1355 self.assertEqual(pow(2L,10), 1024)
1356 self.assertEqual(pow(2L,20), 1024*1024)
1357 self.assertEqual(pow(2L,30), 1024*1024*1024)
1358
1359 self.assertEqual(pow(-2L,0), 1)
1360 self.assertEqual(pow(-2L,1), -2)
1361 self.assertEqual(pow(-2L,2), 4)
1362 self.assertEqual(pow(-2L,3), -8)
1363
1364 self.assertAlmostEqual(pow(0.,0), 1.)
1365 self.assertAlmostEqual(pow(0.,1), 0.)
1366 self.assertAlmostEqual(pow(1.,0), 1.)
1367 self.assertAlmostEqual(pow(1.,1), 1.)
1368
1369 self.assertAlmostEqual(pow(2.,0), 1.)
1370 self.assertAlmostEqual(pow(2.,10), 1024.)
1371 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1372 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1373
1374 self.assertAlmostEqual(pow(-2.,0), 1.)
1375 self.assertAlmostEqual(pow(-2.,1), -2.)
1376 self.assertAlmostEqual(pow(-2.,2), 4.)
1377 self.assertAlmostEqual(pow(-2.,3), -8.)
1378
1379 for x in 2, 2L, 2.0:
1380 for y in 10, 10L, 10.0:
1381 for z in 1000, 1000L, 1000.0:
1382 if isinstance(x, float) or \
1383 isinstance(y, float) or \
1384 isinstance(z, float):
1385 self.assertRaises(TypeError, pow, x, y, z)
1386 else:
1387 self.assertAlmostEqual(pow(x, y, z), 24.0)
1388
1389 self.assertRaises(TypeError, pow, -1, -2, 3)
1390 self.assertRaises(ValueError, pow, 1, 2, 0)
1391 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1392 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1393 self.assertRaises(ValueError, pow, -342.43, 0.234)
1394
1395 self.assertRaises(TypeError, pow)
1396
1397 def test_range(self):
1398 self.assertEqual(range(3), [0, 1, 2])
1399 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1400 self.assertEqual(range(0), [])
1401 self.assertEqual(range(-3), [])
1402 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1403 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1404
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001405 # Now test range() with longs
1406 self.assertEqual(range(-2**100), [])
1407 self.assertEqual(range(0, -2**100), [])
1408 self.assertEqual(range(0, 2**100, -1), [])
1409 self.assertEqual(range(0, 2**100, -1), [])
1410
1411 a = long(10 * sys.maxint)
1412 b = long(100 * sys.maxint)
1413 c = long(50 * sys.maxint)
1414
1415 self.assertEqual(range(a, a+2), [a, a+1])
1416 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1417 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1418
1419 seq = range(a, b, c)
1420 self.assert_(a in seq)
1421 self.assert_(b not in seq)
1422 self.assertEqual(len(seq), 2)
1423
1424 seq = range(b, a, -c)
1425 self.assert_(b in seq)
1426 self.assert_(a not in seq)
1427 self.assertEqual(len(seq), 2)
1428
1429 seq = range(-a, -b, -c)
1430 self.assert_(-a in seq)
1431 self.assert_(-b not in seq)
1432 self.assertEqual(len(seq), 2)
1433
Walter Dörwald919497e2003-01-19 16:23:59 +00001434 self.assertRaises(TypeError, range)
1435 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1436 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001437 self.assertRaises(ValueError, range, a, a + 1, long(0))
1438
1439 class badzero(int):
1440 def __cmp__(self, other):
1441 raise RuntimeError
1442 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001443
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001444 # Reject floats when it would require PyLongs to represent.
1445 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001446 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001447
Walter Dörwald357981e2003-04-15 18:59:28 +00001448 self.assertRaises(TypeError, range, 0, "spam")
1449 self.assertRaises(TypeError, range, 0, 42, "spam")
1450
1451 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1452 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1453
Walter Dörwald919497e2003-01-19 16:23:59 +00001454 def test_input_and_raw_input(self):
1455 self.write_testfile()
1456 fp = open(TESTFN, 'r')
1457 savestdin = sys.stdin
1458 savestdout = sys.stdout # Eats the echo
1459 try:
1460 sys.stdin = fp
1461 sys.stdout = BitBucket()
1462 self.assertEqual(input(), 2)
1463 self.assertEqual(input('testing\n'), 2)
1464 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1465 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001466
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001467 # SF 1535165: don't segfault on closed stdin
1468 # sys.stdout must be a regular file for triggering
1469 sys.stdout = savestdout
1470 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001471 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001472
1473 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001474 sys.stdin = cStringIO.StringIO("NULL\0")
1475 self.assertRaises(TypeError, input, 42, 42)
1476 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1477 self.assertEqual(input(), 'whitespace')
1478 sys.stdin = cStringIO.StringIO()
1479 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001480
1481 # SF 876178: make sure input() respect future options.
1482 sys.stdin = cStringIO.StringIO('1/2')
1483 sys.stdout = cStringIO.StringIO()
1484 exec compile('print input()', 'test_builtin_tmp', 'exec')
1485 sys.stdin.seek(0, 0)
1486 exec compile('from __future__ import division;print input()',
1487 'test_builtin_tmp', 'exec')
1488 sys.stdin.seek(0, 0)
1489 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001490 # The result we expect depends on whether new division semantics
1491 # are already in effect.
1492 if 1/2 == 0:
1493 # This test was compiled with old semantics.
1494 expected = ['0', '0.5', '0']
1495 else:
1496 # This test was compiled with new semantics (e.g., -Qnew
1497 # was given on the command line.
1498 expected = ['0.5', '0.5', '0.5']
1499 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001500
Walter Dörwald919497e2003-01-19 16:23:59 +00001501 del sys.stdout
1502 self.assertRaises(RuntimeError, input, 'prompt')
1503 del sys.stdin
1504 self.assertRaises(RuntimeError, input, 'prompt')
1505 finally:
1506 sys.stdin = savestdin
1507 sys.stdout = savestdout
1508 fp.close()
1509 unlink(TESTFN)
1510
1511 def test_reduce(self):
1512 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1513 self.assertEqual(
1514 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1515 ['a','c','d','w']
1516 )
1517 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1518 self.assertEqual(
1519 reduce(lambda x, y: x*y, range(2,21), 1L),
1520 2432902008176640000L
1521 )
1522 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1523 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1524 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1525 self.assertRaises(TypeError, reduce)
1526 self.assertRaises(TypeError, reduce, 42, 42)
1527 self.assertRaises(TypeError, reduce, 42, 42, 42)
1528 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1529 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1530 self.assertRaises(TypeError, reduce, 42, (42, 42))
1531
1532 class BadSeq:
1533 def __getitem__(self, index):
1534 raise ValueError
1535 self.assertRaises(ValueError, reduce, 42, BadSeq())
1536
1537 def test_reload(self):
1538 import marshal
1539 reload(marshal)
1540 import string
1541 reload(string)
1542 ## import sys
1543 ## self.assertRaises(ImportError, reload, sys)
1544
1545 def test_repr(self):
1546 self.assertEqual(repr(''), '\'\'')
1547 self.assertEqual(repr(0), '0')
1548 self.assertEqual(repr(0L), '0L')
1549 self.assertEqual(repr(()), '()')
1550 self.assertEqual(repr([]), '[]')
1551 self.assertEqual(repr({}), '{}')
1552 a = []
1553 a.append(a)
1554 self.assertEqual(repr(a), '[[...]]')
1555 a = {}
1556 a[0] = a
1557 self.assertEqual(repr(a), '{0: {...}}')
1558
1559 def test_round(self):
1560 self.assertEqual(round(0.0), 0.0)
1561 self.assertEqual(round(1.0), 1.0)
1562 self.assertEqual(round(10.0), 10.0)
1563 self.assertEqual(round(1000000000.0), 1000000000.0)
1564 self.assertEqual(round(1e20), 1e20)
1565
1566 self.assertEqual(round(-1.0), -1.0)
1567 self.assertEqual(round(-10.0), -10.0)
1568 self.assertEqual(round(-1000000000.0), -1000000000.0)
1569 self.assertEqual(round(-1e20), -1e20)
1570
1571 self.assertEqual(round(0.1), 0.0)
1572 self.assertEqual(round(1.1), 1.0)
1573 self.assertEqual(round(10.1), 10.0)
1574 self.assertEqual(round(1000000000.1), 1000000000.0)
1575
1576 self.assertEqual(round(-1.1), -1.0)
1577 self.assertEqual(round(-10.1), -10.0)
1578 self.assertEqual(round(-1000000000.1), -1000000000.0)
1579
1580 self.assertEqual(round(0.9), 1.0)
1581 self.assertEqual(round(9.9), 10.0)
1582 self.assertEqual(round(999999999.9), 1000000000.0)
1583
1584 self.assertEqual(round(-0.9), -1.0)
1585 self.assertEqual(round(-9.9), -10.0)
1586 self.assertEqual(round(-999999999.9), -1000000000.0)
1587
1588 self.assertEqual(round(-8.0, -1), -10.0)
1589
Georg Brandlccadf842006-03-31 18:54:53 +00001590 # test new kwargs
1591 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1592
Walter Dörwald919497e2003-01-19 16:23:59 +00001593 self.assertRaises(TypeError, round)
1594
1595 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001596 setattr(sys, 'spam', 1)
1597 self.assertEqual(sys.spam, 1)
1598 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1599 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001600
1601 def test_str(self):
1602 self.assertEqual(str(''), '')
1603 self.assertEqual(str(0), '0')
1604 self.assertEqual(str(0L), '0')
1605 self.assertEqual(str(()), '()')
1606 self.assertEqual(str([]), '[]')
1607 self.assertEqual(str({}), '{}')
1608 a = []
1609 a.append(a)
1610 self.assertEqual(str(a), '[[...]]')
1611 a = {}
1612 a[0] = a
1613 self.assertEqual(str(a), '{0: {...}}')
1614
Alex Martellia70b1912003-04-22 08:12:33 +00001615 def test_sum(self):
1616 self.assertEqual(sum([]), 0)
1617 self.assertEqual(sum(range(2,8)), 27)
1618 self.assertEqual(sum(iter(range(2,8))), 27)
1619 self.assertEqual(sum(Squares(10)), 285)
1620 self.assertEqual(sum(iter(Squares(10))), 285)
1621 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1622
1623 self.assertRaises(TypeError, sum)
1624 self.assertRaises(TypeError, sum, 42)
1625 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1626 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1627 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1628 self.assertRaises(TypeError, sum, [{2:3}])
1629 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1630
1631 class BadSeq:
1632 def __getitem__(self, index):
1633 raise ValueError
1634 self.assertRaises(ValueError, sum, BadSeq())
1635
Walter Dörwald919497e2003-01-19 16:23:59 +00001636 def test_tuple(self):
1637 self.assertEqual(tuple(()), ())
1638 t0_3 = (0, 1, 2, 3)
1639 t0_3_bis = tuple(t0_3)
1640 self.assert_(t0_3 is t0_3_bis)
1641 self.assertEqual(tuple([]), ())
1642 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1643 self.assertEqual(tuple(''), ())
1644 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1645
1646 def test_type(self):
1647 self.assertEqual(type(''), type('123'))
1648 self.assertNotEqual(type(''), type(()))
1649
1650 def test_unichr(self):
1651 if have_unicode:
1652 self.assertEqual(unichr(32), unicode(' '))
1653 self.assertEqual(unichr(65), unicode('A'))
1654 self.assertEqual(unichr(97), unicode('a'))
1655 self.assertEqual(
1656 unichr(sys.maxunicode),
1657 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1658 )
1659 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1660 self.assertRaises(TypeError, unichr)
1661
Guido van Rossumfee7b932005-01-16 00:21:28 +00001662 # We don't want self in vars(), so these are static methods
1663
1664 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001665 def get_vars_f0():
1666 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001667
Guido van Rossumfee7b932005-01-16 00:21:28 +00001668 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001669 def get_vars_f2():
1670 BuiltinTest.get_vars_f0()
1671 a = 1
1672 b = 2
1673 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001674
1675 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001676 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001677 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001678 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001679 self.assertEqual(self.get_vars_f0(), {})
1680 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1681 self.assertRaises(TypeError, vars, 42, 42)
1682 self.assertRaises(TypeError, vars, 42)
1683
1684 def test_zip(self):
1685 a = (1, 2, 3)
1686 b = (4, 5, 6)
1687 t = [(1, 4), (2, 5), (3, 6)]
1688 self.assertEqual(zip(a, b), t)
1689 b = [4, 5, 6]
1690 self.assertEqual(zip(a, b), t)
1691 b = (4, 5, 6, 7)
1692 self.assertEqual(zip(a, b), t)
1693 class I:
1694 def __getitem__(self, i):
1695 if i < 0 or i > 2: raise IndexError
1696 return i + 4
1697 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001698 self.assertEqual(zip(), [])
1699 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001700 self.assertRaises(TypeError, zip, None)
1701 class G:
1702 pass
1703 self.assertRaises(TypeError, zip, a, G())
1704
1705 # Make sure zip doesn't try to allocate a billion elements for the
1706 # result list when one of its arguments doesn't say how long it is.
1707 # A MemoryError is the most likely failure mode.
1708 class SequenceWithoutALength:
1709 def __getitem__(self, i):
1710 if i == 5:
1711 raise IndexError
1712 else:
1713 return i
1714 self.assertEqual(
1715 zip(SequenceWithoutALength(), xrange(2**30)),
1716 list(enumerate(range(5)))
1717 )
1718
1719 class BadSeq:
1720 def __getitem__(self, i):
1721 if i == 5:
1722 raise ValueError
1723 else:
1724 return i
1725 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1726
Raymond Hettinger64958a12003-12-17 20:43:33 +00001727class TestSorted(unittest.TestCase):
1728
1729 def test_basic(self):
1730 data = range(100)
1731 copy = data[:]
1732 random.shuffle(copy)
1733 self.assertEqual(data, sorted(copy))
1734 self.assertNotEqual(data, copy)
1735
1736 data.reverse()
1737 random.shuffle(copy)
1738 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1739 self.assertNotEqual(data, copy)
1740 random.shuffle(copy)
1741 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1742 self.assertNotEqual(data, copy)
1743 random.shuffle(copy)
1744 self.assertEqual(data, sorted(copy, reverse=1))
1745 self.assertNotEqual(data, copy)
1746
1747 def test_inputtypes(self):
1748 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001749 types = [list, tuple]
1750 if have_unicode:
1751 types.insert(0, unicode)
1752 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001753 self.assertEqual(sorted(s), sorted(T(s)))
1754
1755 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001756 types = [set, frozenset, list, tuple, dict.fromkeys]
1757 if have_unicode:
1758 types.insert(0, unicode)
1759 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001760 self.assertEqual(sorted(s), sorted(T(s)))
1761
1762 def test_baddecorator(self):
1763 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1764 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1765
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001766def test_main(verbose=None):
1767 test_classes = (BuiltinTest, TestSorted)
1768
1769 run_unittest(*test_classes)
1770
1771 # verify reference counting
1772 if verbose and hasattr(sys, "gettotalrefcount"):
1773 import gc
1774 counts = [None] * 5
1775 for i in xrange(len(counts)):
1776 run_unittest(*test_classes)
1777 gc.collect()
1778 counts[i] = sys.gettotalrefcount()
1779 print counts
1780
Walter Dörwald919497e2003-01-19 16:23:59 +00001781
1782if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001783 test_main(verbose=True)