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