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