blob: 272af86362117d7e6c3eb8ba1559b04d1238e20a [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
Thomas Wouters477c8d52006-05-27 19:21:47 +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 Wouters49fd7fa2006-04-21 10:40:58 +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_callable(self):
159 self.assert_(callable(len))
160 def f(): pass
161 self.assert_(callable(f))
162 class C:
163 def meth(self): pass
164 self.assert_(callable(C))
165 x = C()
166 self.assert_(callable(x.meth))
167 self.assert_(not callable(x))
168 class D(C):
169 def __call__(self): pass
170 y = D()
171 self.assert_(callable(y))
172 y()
173
174 def test_chr(self):
175 self.assertEqual(chr(32), ' ')
176 self.assertEqual(chr(65), 'A')
177 self.assertEqual(chr(97), 'a')
178 self.assertEqual(chr(0xff), '\xff')
179 self.assertRaises(ValueError, chr, 256)
180 self.assertRaises(TypeError, chr)
181
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000182 def XXX_test_cmp(self):
183 # cmp() is no longer supported
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 self.assertEqual(cmp(-1, 1), -1)
185 self.assertEqual(cmp(1, -1), 1)
186 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000187 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000188 a = []; a.append(a)
189 b = []; b.append(b)
190 from UserList import UserList
191 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000192 self.assertRaises(RuntimeError, cmp, a, b)
193 self.assertRaises(RuntimeError, cmp, b, c)
194 self.assertRaises(RuntimeError, cmp, c, a)
195 self.assertRaises(RuntimeError, cmp, a, c)
196 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 a.pop(); b.pop(); c.pop()
198 self.assertRaises(TypeError, cmp)
199
Walter Dörwald919497e2003-01-19 16:23:59 +0000200 def test_compile(self):
201 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000202 bom = '\xef\xbb\xbf'
203 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000204 self.assertRaises(TypeError, compile)
205 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
206 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000207 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000208 if have_unicode:
209 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000210 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
211 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000212
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 def test_delattr(self):
214 import sys
215 sys.spam = 1
216 delattr(sys, 'spam')
217 self.assertRaises(TypeError, delattr)
218
219 def test_dir(self):
220 x = 1
221 self.assert_('x' in dir())
222 import sys
223 self.assert_('modules' in dir(sys))
224 self.assertRaises(TypeError, dir, 42, 42)
225
226 def test_divmod(self):
227 self.assertEqual(divmod(12, 7), (1, 5))
228 self.assertEqual(divmod(-12, 7), (-2, 2))
229 self.assertEqual(divmod(12, -7), (-2, -2))
230 self.assertEqual(divmod(-12, -7), (1, -5))
231
232 self.assertEqual(divmod(12L, 7L), (1L, 5L))
233 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
234 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
235 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
236
237 self.assertEqual(divmod(12, 7L), (1, 5L))
238 self.assertEqual(divmod(-12, 7L), (-2, 2L))
239 self.assertEqual(divmod(12L, -7), (-2L, -2))
240 self.assertEqual(divmod(-12L, -7), (1L, -5))
241
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000242 self.assertEqual(divmod(-sys.maxint-1, -1),
243 (sys.maxint+1, 0))
244
Walter Dörwald919497e2003-01-19 16:23:59 +0000245 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
246 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
247 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
248 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
249
250 self.assertRaises(TypeError, divmod)
251
252 def test_eval(self):
253 self.assertEqual(eval('1+1'), 2)
254 self.assertEqual(eval(' 1+1\n'), 2)
255 globals = {'a': 1, 'b': 2}
256 locals = {'b': 200, 'c': 300}
257 self.assertEqual(eval('a', globals) , 1)
258 self.assertEqual(eval('a', globals, locals), 1)
259 self.assertEqual(eval('b', globals, locals), 200)
260 self.assertEqual(eval('c', globals, locals), 300)
261 if have_unicode:
262 self.assertEqual(eval(unicode('1+1')), 2)
263 self.assertEqual(eval(unicode(' 1+1\n')), 2)
264 globals = {'a': 1, 'b': 2}
265 locals = {'b': 200, 'c': 300}
266 if have_unicode:
267 self.assertEqual(eval(unicode('a'), globals), 1)
268 self.assertEqual(eval(unicode('a'), globals, locals), 1)
269 self.assertEqual(eval(unicode('b'), globals, locals), 200)
270 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000271 bom = '\xef\xbb\xbf'
272 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000273 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
274 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 self.assertRaises(TypeError, eval)
276 self.assertRaises(TypeError, eval, ())
277
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000278 def test_general_eval(self):
279 # Tests that general mappings can be used for the locals argument
280
281 class M:
282 "Test mapping interface versus possible calls from eval()."
283 def __getitem__(self, key):
284 if key == 'a':
285 return 12
286 raise KeyError
287 def keys(self):
288 return list('xyz')
289
290 m = M()
291 g = globals()
292 self.assertEqual(eval('a', g, m), 12)
293 self.assertRaises(NameError, eval, 'b', g, m)
294 self.assertEqual(eval('dir()', g, m), list('xyz'))
295 self.assertEqual(eval('globals()', g, m), g)
296 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000297 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000298 class A:
299 "Non-mapping"
300 pass
301 m = A()
302 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000303
304 # Verify that dict subclasses work as well
305 class D(dict):
306 def __getitem__(self, key):
307 if key == 'a':
308 return 12
309 return dict.__getitem__(self, key)
310 def keys(self):
311 return list('xyz')
312
313 d = D()
314 self.assertEqual(eval('a', g, d), 12)
315 self.assertRaises(NameError, eval, 'b', g, d)
316 self.assertEqual(eval('dir()', g, d), list('xyz'))
317 self.assertEqual(eval('globals()', g, d), g)
318 self.assertEqual(eval('locals()', g, d), d)
319
320 # Verify locals stores (used by list comps)
321 eval('[locals() for i in (2,3)]', g, d)
322 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
323
324 class SpreadSheet:
325 "Sample application showing nested, calculated lookups."
326 _cells = {}
327 def __setitem__(self, key, formula):
328 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000329 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000330 return eval(self._cells[key], globals(), self)
331
332 ss = SpreadSheet()
333 ss['a1'] = '5'
334 ss['a2'] = 'a1*6'
335 ss['a3'] = 'a2*7'
336 self.assertEqual(ss['a3'], 210)
337
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000338 # Verify that dir() catches a non-list returned by eval
339 # SF bug #1004669
340 class C:
341 def __getitem__(self, item):
342 raise KeyError(item)
343 def keys(self):
344 return 'a'
345 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
346
Walter Dörwald919497e2003-01-19 16:23:59 +0000347 # Done outside of the method test_z to get the correct scope
348 z = 0
349 f = open(TESTFN, 'w')
350 f.write('z = z+1\n')
351 f.write('z = z*2\n')
352 f.close()
353 execfile(TESTFN)
354
355 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000356 global numruns
357 if numruns:
358 return
359 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000360
Walter Dörwald919497e2003-01-19 16:23:59 +0000361 globals = {'a': 1, 'b': 2}
362 locals = {'b': 200, 'c': 300}
363
364 self.assertEqual(self.__class__.z, 2)
365 globals['z'] = 0
366 execfile(TESTFN, globals)
367 self.assertEqual(globals['z'], 2)
368 locals['z'] = 0
369 execfile(TESTFN, globals, locals)
370 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000371
372 class M:
373 "Test mapping interface versus possible calls from execfile()."
374 def __init__(self):
375 self.z = 10
376 def __getitem__(self, key):
377 if key == 'z':
378 return self.z
379 raise KeyError
380 def __setitem__(self, key, value):
381 if key == 'z':
382 self.z = value
383 return
384 raise KeyError
385
386 locals = M()
387 locals['z'] = 0
388 execfile(TESTFN, globals, locals)
389 self.assertEqual(locals['z'], 2)
390
Walter Dörwald919497e2003-01-19 16:23:59 +0000391 unlink(TESTFN)
392 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000393 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000394 import os
395 self.assertRaises(IOError, execfile, os.curdir)
396 self.assertRaises(IOError, execfile, "I_dont_exist")
397
Georg Brandl7cae87c2006-09-06 06:51:57 +0000398 def test_exec(self):
399 g = {}
400 exec('z = 1', g)
401 if '__builtins__' in g:
402 del g['__builtins__']
403 self.assertEqual(g, {'z': 1})
404
405 exec(u'z = 1+1', g)
406 if '__builtins__' in g:
407 del g['__builtins__']
408 self.assertEqual(g, {'z': 2})
409 g = {}
410 l = {}
411
412 import warnings
413 warnings.filterwarnings("ignore", "global statement", module="<string>")
414 exec('global a; a = 1; b = 2', g, l)
415 if '__builtins__' in g:
416 del g['__builtins__']
417 if '__builtins__' in l:
418 del l['__builtins__']
419 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
420
Walter Dörwald919497e2003-01-19 16:23:59 +0000421 def test_filter(self):
422 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
423 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
424 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
425 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
426 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
427 def identity(item):
428 return 1
429 filter(identity, Squares(5))
430 self.assertRaises(TypeError, filter)
431 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000432 def __getitem__(self, index):
433 if index<4:
434 return 42
435 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000436 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
437 def badfunc():
438 pass
439 self.assertRaises(TypeError, filter, badfunc, range(5))
440
Walter Dörwaldbf517072003-01-27 15:57:14 +0000441 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000442 self.assertEqual(filter(None, (1, 2)), (1, 2))
443 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
444 self.assertRaises(TypeError, filter, 42, (1, 2))
445
Walter Dörwaldbf517072003-01-27 15:57:14 +0000446 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000447 self.assertEqual(filter(None, "12"), "12")
448 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
449 self.assertRaises(TypeError, filter, 42, "12")
450 class badstr(str):
451 def __getitem__(self, index):
452 raise ValueError
453 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000454
Walter Dörwald903f1e02003-02-04 16:28:00 +0000455 class badstr2(str):
456 def __getitem__(self, index):
457 return 42
458 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
459
460 class weirdstr(str):
461 def __getitem__(self, index):
462 return weirdstr(2*str.__getitem__(self, index))
463 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
464
Walter Dörwald5e61e242003-02-04 17:04:01 +0000465 class shiftstr(str):
466 def __getitem__(self, index):
467 return chr(ord(str.__getitem__(self, index))+1)
468 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
469
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000470 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000471 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000472 self.assertEqual(filter(None, unicode("12")), unicode("12"))
473 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
474 self.assertRaises(TypeError, filter, 42, unicode("12"))
475 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000476
Walter Dörwald903f1e02003-02-04 16:28:00 +0000477 class badunicode(unicode):
478 def __getitem__(self, index):
479 return 42
480 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
481
482 class weirdunicode(unicode):
483 def __getitem__(self, index):
484 return weirdunicode(2*unicode.__getitem__(self, index))
485 self.assertEqual(
486 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
487
Walter Dörwald5e61e242003-02-04 17:04:01 +0000488 class shiftunicode(unicode):
489 def __getitem__(self, index):
490 return unichr(ord(unicode.__getitem__(self, index))+1)
491 self.assertEqual(
492 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
493 unicode("345")
494 )
495
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000496 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000497 # test that filter() never returns tuple, str or unicode subclasses
498 # and that the result always goes through __getitem__
499 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000500 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000501 def __getitem__(self, index):
502 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000503 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000504 def __getitem__(self, index):
505 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000506 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000507 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000508 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000509 }
510 if have_unicode:
511 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000512 def __getitem__(self, index):
513 return 2*unicode.__getitem__(self, index)
514 inputs[unicode2] = {
515 unicode(): unicode(),
516 unicode("123"): unicode("112233")
517 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000518
Walter Dörwald1918f772003-02-10 13:19:13 +0000519 for (cls, inps) in inputs.iteritems():
520 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000521 # make sure the output goes through __getitem__
522 # even if func is None
523 self.assertEqual(
524 filter(funcs[0], cls(inp)),
525 filter(funcs[1], cls(inp))
526 )
527 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000528 outp = filter(func, cls(inp))
529 self.assertEqual(outp, exp)
530 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000531
Walter Dörwald919497e2003-01-19 16:23:59 +0000532 def test_float(self):
533 self.assertEqual(float(3.14), 3.14)
534 self.assertEqual(float(314), 314.0)
535 self.assertEqual(float(314L), 314.0)
536 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000537 self.assertRaises(ValueError, float, " 0x3.1 ")
538 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000539 if have_unicode:
540 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
541 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000542 # Implementation limitation in PyFloat_FromString()
543 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000544
Thomas Wouters477c8d52006-05-27 19:21:47 +0000545 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000546 def test_float_with_comma(self):
547 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000548 # float must not accept the locale specific decimal point but
549 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000550 import locale
551 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000552 return
553
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000554 self.assertEqual(float(" 3.14 "), 3.14)
555 self.assertEqual(float("+3.14 "), 3.14)
556 self.assertEqual(float("-3.14 "), -3.14)
557 self.assertEqual(float(".14 "), .14)
558 self.assertEqual(float("3. "), 3.0)
559 self.assertEqual(float("3.e3 "), 3000.0)
560 self.assertEqual(float("3.2e3 "), 3200.0)
561 self.assertEqual(float("2.5e-1 "), 0.25)
562 self.assertEqual(float("5e-1"), 0.5)
563 self.assertRaises(ValueError, float, " 3,14 ")
564 self.assertRaises(ValueError, float, " +3,14 ")
565 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000566 self.assertRaises(ValueError, float, " 0x3.1 ")
567 self.assertRaises(ValueError, float, " -0x3.p-1 ")
568 self.assertEqual(float(" 25.e-1 "), 2.5)
569 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000570
Brett Cannonc3647ac2005-04-26 03:45:26 +0000571 def test_floatconversion(self):
572 # Make sure that calls to __float__() work properly
573 class Foo0:
574 def __float__(self):
575 return 42.
576
577 class Foo1(object):
578 def __float__(self):
579 return 42.
580
581 class Foo2(float):
582 def __float__(self):
583 return 42.
584
585 class Foo3(float):
586 def __new__(cls, value=0.):
587 return float.__new__(cls, 2*value)
588
589 def __float__(self):
590 return self
591
592 class Foo4(float):
593 def __float__(self):
594 return 42
595
596 self.assertAlmostEqual(float(Foo0()), 42.)
597 self.assertAlmostEqual(float(Foo1()), 42.)
598 self.assertAlmostEqual(float(Foo2()), 42.)
599 self.assertAlmostEqual(float(Foo3(21)), 42.)
600 self.assertRaises(TypeError, float, Foo4(42))
601
Walter Dörwald919497e2003-01-19 16:23:59 +0000602 def test_getattr(self):
603 import sys
604 self.assert_(getattr(sys, 'stdout') is sys.stdout)
605 self.assertRaises(TypeError, getattr, sys, 1)
606 self.assertRaises(TypeError, getattr, sys, 1, "foo")
607 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000608 if have_unicode:
609 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000610
611 def test_hasattr(self):
612 import sys
613 self.assert_(hasattr(sys, 'stdout'))
614 self.assertRaises(TypeError, hasattr, sys, 1)
615 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000616 if have_unicode:
617 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000618
619 def test_hash(self):
620 hash(None)
621 self.assertEqual(hash(1), hash(1L))
622 self.assertEqual(hash(1), hash(1.0))
623 hash('spam')
624 if have_unicode:
625 self.assertEqual(hash('spam'), hash(unicode('spam')))
626 hash((0,1,2,3))
627 def f(): pass
628 self.assertRaises(TypeError, hash, [])
629 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000630 # Bug 1536021: Allow hash to return long objects
631 class X:
632 def __hash__(self):
633 return 2**100
634 self.assertEquals(type(hash(X())), int)
635 class Y(object):
636 def __hash__(self):
637 return 2**100
638 self.assertEquals(type(hash(Y())), int)
639 class Z(long):
640 def __hash__(self):
641 return self
642 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000643
644 def test_hex(self):
645 self.assertEqual(hex(16), '0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000646 self.assertEqual(hex(16L), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000647 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000648 self.assertEqual(hex(-16L), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 self.assertRaises(TypeError, hex, {})
650
651 def test_id(self):
652 id(None)
653 id(1)
654 id(1L)
655 id(1.0)
656 id('spam')
657 id((0,1,2,3))
658 id([0,1,2,3])
659 id({'spam': 1, 'eggs': 2, 'ham': 3})
660
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 def test_int(self):
662 self.assertEqual(int(314), 314)
663 self.assertEqual(int(3.14), 3)
664 self.assertEqual(int(314L), 314)
665 # Check that conversion from float truncates towards zero
666 self.assertEqual(int(-3.14), -3)
667 self.assertEqual(int(3.9), 3)
668 self.assertEqual(int(-3.9), -3)
669 self.assertEqual(int(3.5), 3)
670 self.assertEqual(int(-3.5), -3)
671 # Different base:
672 self.assertEqual(int("10",16), 16L)
673 if have_unicode:
674 self.assertEqual(int(unicode("10"),16), 16L)
675 # Test conversion from strings and various anomalies
676 for s, v in L:
677 for sign in "", "+", "-":
678 for prefix in "", " ", "\t", " \t\t ":
679 ss = prefix + sign + s
680 vv = v
681 if sign == "-" and v is not ValueError:
682 vv = -v
683 try:
684 self.assertEqual(int(ss), vv)
685 except v:
686 pass
687
Walter Dörwald70a6b492004-02-12 17:35:32 +0000688 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000689 self.assertEqual(int(s)+1, -sys.maxint)
690 # should return long
691 int(s[1:])
692
693 # should return long
694 x = int(1e100)
695 self.assert_(isinstance(x, long))
696 x = int(-1e100)
697 self.assert_(isinstance(x, long))
698
699
700 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
701 # Worked by accident in Windows release build, but failed in debug build.
702 # Failed in all Linux builds.
703 x = -1-sys.maxint
704 self.assertEqual(x >> 1, x//2)
705
706 self.assertRaises(ValueError, int, '123\0')
707 self.assertRaises(ValueError, int, '53', 40)
708
709 x = int('1' * 600)
710 self.assert_(isinstance(x, long))
711
712 if have_unicode:
713 x = int(unichr(0x661) * 600)
714 self.assert_(isinstance(x, long))
715
716 self.assertRaises(TypeError, int, 1, 12)
717
718 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000719 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000720
Thomas Wouters477c8d52006-05-27 19:21:47 +0000721 # SF bug 1334662: int(string, base) wrong answers
722 # Various representations of 2**32 evaluated to 0
723 # rather than 2**32 in previous versions
724
725 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
726 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
727 self.assertEqual(int('10000000000000000', 4), 4294967296L)
728 self.assertEqual(int('32244002423141', 5), 4294967296L)
729 self.assertEqual(int('1550104015504', 6), 4294967296L)
730 self.assertEqual(int('211301422354', 7), 4294967296L)
731 self.assertEqual(int('40000000000', 8), 4294967296L)
732 self.assertEqual(int('12068657454', 9), 4294967296L)
733 self.assertEqual(int('4294967296', 10), 4294967296L)
734 self.assertEqual(int('1904440554', 11), 4294967296L)
735 self.assertEqual(int('9ba461594', 12), 4294967296L)
736 self.assertEqual(int('535a79889', 13), 4294967296L)
737 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
738 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
739 self.assertEqual(int('100000000', 16), 4294967296L)
740 self.assertEqual(int('a7ffda91', 17), 4294967296L)
741 self.assertEqual(int('704he7g4', 18), 4294967296L)
742 self.assertEqual(int('4f5aff66', 19), 4294967296L)
743 self.assertEqual(int('3723ai4g', 20), 4294967296L)
744 self.assertEqual(int('281d55i4', 21), 4294967296L)
745 self.assertEqual(int('1fj8b184', 22), 4294967296L)
746 self.assertEqual(int('1606k7ic', 23), 4294967296L)
747 self.assertEqual(int('mb994ag', 24), 4294967296L)
748 self.assertEqual(int('hek2mgl', 25), 4294967296L)
749 self.assertEqual(int('dnchbnm', 26), 4294967296L)
750 self.assertEqual(int('b28jpdm', 27), 4294967296L)
751 self.assertEqual(int('8pfgih4', 28), 4294967296L)
752 self.assertEqual(int('76beigg', 29), 4294967296L)
753 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
754 self.assertEqual(int('4q0jto4', 31), 4294967296L)
755 self.assertEqual(int('4000000', 32), 4294967296L)
756 self.assertEqual(int('3aokq94', 33), 4294967296L)
757 self.assertEqual(int('2qhxjli', 34), 4294967296L)
758 self.assertEqual(int('2br45qb', 35), 4294967296L)
759 self.assertEqual(int('1z141z4', 36), 4294967296L)
760
761 # SF bug 1334662: int(string, base) wrong answers
762 # Checks for proper evaluation of 2**32 + 1
763 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
764 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
765 self.assertEqual(int('10000000000000001', 4), 4294967297L)
766 self.assertEqual(int('32244002423142', 5), 4294967297L)
767 self.assertEqual(int('1550104015505', 6), 4294967297L)
768 self.assertEqual(int('211301422355', 7), 4294967297L)
769 self.assertEqual(int('40000000001', 8), 4294967297L)
770 self.assertEqual(int('12068657455', 9), 4294967297L)
771 self.assertEqual(int('4294967297', 10), 4294967297L)
772 self.assertEqual(int('1904440555', 11), 4294967297L)
773 self.assertEqual(int('9ba461595', 12), 4294967297L)
774 self.assertEqual(int('535a7988a', 13), 4294967297L)
775 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
776 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
777 self.assertEqual(int('100000001', 16), 4294967297L)
778 self.assertEqual(int('a7ffda92', 17), 4294967297L)
779 self.assertEqual(int('704he7g5', 18), 4294967297L)
780 self.assertEqual(int('4f5aff67', 19), 4294967297L)
781 self.assertEqual(int('3723ai4h', 20), 4294967297L)
782 self.assertEqual(int('281d55i5', 21), 4294967297L)
783 self.assertEqual(int('1fj8b185', 22), 4294967297L)
784 self.assertEqual(int('1606k7id', 23), 4294967297L)
785 self.assertEqual(int('mb994ah', 24), 4294967297L)
786 self.assertEqual(int('hek2mgm', 25), 4294967297L)
787 self.assertEqual(int('dnchbnn', 26), 4294967297L)
788 self.assertEqual(int('b28jpdn', 27), 4294967297L)
789 self.assertEqual(int('8pfgih5', 28), 4294967297L)
790 self.assertEqual(int('76beigh', 29), 4294967297L)
791 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
792 self.assertEqual(int('4q0jto5', 31), 4294967297L)
793 self.assertEqual(int('4000001', 32), 4294967297L)
794 self.assertEqual(int('3aokq95', 33), 4294967297L)
795 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
796 self.assertEqual(int('2br45qc', 35), 4294967297L)
797 self.assertEqual(int('1z141z5', 36), 4294967297L)
798
Brett Cannonc3647ac2005-04-26 03:45:26 +0000799 def test_intconversion(self):
800 # Test __int__()
801 class Foo0:
802 def __int__(self):
803 return 42
804
805 class Foo1(object):
806 def __int__(self):
807 return 42
808
809 class Foo2(int):
810 def __int__(self):
811 return 42
812
813 class Foo3(int):
814 def __int__(self):
815 return self
816
817 class Foo4(int):
818 def __int__(self):
819 return 42L
820
821 class Foo5(int):
822 def __int__(self):
823 return 42.
824
825 self.assertEqual(int(Foo0()), 42)
826 self.assertEqual(int(Foo1()), 42)
827 self.assertEqual(int(Foo2()), 42)
828 self.assertEqual(int(Foo3()), 0)
829 self.assertEqual(int(Foo4()), 42L)
830 self.assertRaises(TypeError, int, Foo5())
831
Walter Dörwald919497e2003-01-19 16:23:59 +0000832 def test_intern(self):
833 self.assertRaises(TypeError, intern)
834 s = "never interned before"
835 self.assert_(intern(s) is s)
836 s2 = s.swapcase().swapcase()
837 self.assert_(intern(s2) is s)
838
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000839 # Subclasses of string can't be interned, because they
840 # provide too much opportunity for insane things to happen.
841 # We don't want them in the interned dict and if they aren't
842 # actually interned, we don't want to create the appearance
843 # that they are by allowing intern() to succeeed.
844 class S(str):
845 def __hash__(self):
846 return 123
847
848 self.assertRaises(TypeError, intern, S("abc"))
849
850 # It's still safe to pass these strings to routines that
851 # call intern internally, e.g. PyObject_SetAttr().
852 s = S("abc")
853 setattr(s, s, s)
854 self.assertEqual(getattr(s, s), s)
855
Walter Dörwald919497e2003-01-19 16:23:59 +0000856 def test_iter(self):
857 self.assertRaises(TypeError, iter)
858 self.assertRaises(TypeError, iter, 42, 42)
859 lists = [("1", "2"), ["1", "2"], "12"]
860 if have_unicode:
861 lists.append(unicode("12"))
862 for l in lists:
863 i = iter(l)
864 self.assertEqual(i.next(), '1')
865 self.assertEqual(i.next(), '2')
866 self.assertRaises(StopIteration, i.next)
867
868 def test_isinstance(self):
869 class C:
870 pass
871 class D(C):
872 pass
873 class E:
874 pass
875 c = C()
876 d = D()
877 e = E()
878 self.assert_(isinstance(c, C))
879 self.assert_(isinstance(d, C))
880 self.assert_(not isinstance(e, C))
881 self.assert_(not isinstance(c, D))
882 self.assert_(not isinstance('foo', E))
883 self.assertRaises(TypeError, isinstance, E, 'foo')
884 self.assertRaises(TypeError, isinstance)
885
886 def test_issubclass(self):
887 class C:
888 pass
889 class D(C):
890 pass
891 class E:
892 pass
893 c = C()
894 d = D()
895 e = E()
896 self.assert_(issubclass(D, C))
897 self.assert_(issubclass(C, C))
898 self.assert_(not issubclass(C, D))
899 self.assertRaises(TypeError, issubclass, 'foo', E)
900 self.assertRaises(TypeError, issubclass, E, 'foo')
901 self.assertRaises(TypeError, issubclass)
902
903 def test_len(self):
904 self.assertEqual(len('123'), 3)
905 self.assertEqual(len(()), 0)
906 self.assertEqual(len((1, 2, 3, 4)), 4)
907 self.assertEqual(len([1, 2, 3, 4]), 4)
908 self.assertEqual(len({}), 0)
909 self.assertEqual(len({'a':1, 'b': 2}), 2)
910 class BadSeq:
911 def __len__(self):
912 raise ValueError
913 self.assertRaises(ValueError, len, BadSeq())
914
915 def test_list(self):
916 self.assertEqual(list([]), [])
917 l0_3 = [0, 1, 2, 3]
918 l0_3_bis = list(l0_3)
919 self.assertEqual(l0_3, l0_3_bis)
920 self.assert_(l0_3 is not l0_3_bis)
921 self.assertEqual(list(()), [])
922 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
923 self.assertEqual(list(''), [])
924 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
925
926 if sys.maxint == 0x7fffffff:
927 # This test can currently only work on 32-bit machines.
928 # XXX If/when PySequence_Length() returns a ssize_t, it should be
929 # XXX re-enabled.
930 # Verify clearing of bug #556025.
931 # This assumes that the max data size (sys.maxint) == max
932 # address size this also assumes that the address size is at
933 # least 4 bytes with 8 byte addresses, the bug is not well
934 # tested
935 #
936 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
937 # earlier due to a newlib bug. See the following mailing list
938 # thread for the details:
939
940 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
941 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
942
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000943 # This code used to segfault in Py2.4a3
944 x = []
945 x.extend(-y for y in x)
946 self.assertEqual(x, [])
947
Walter Dörwald919497e2003-01-19 16:23:59 +0000948 def test_long(self):
949 self.assertEqual(long(314), 314L)
950 self.assertEqual(long(3.14), 3L)
951 self.assertEqual(long(314L), 314L)
952 # Check that conversion from float truncates towards zero
953 self.assertEqual(long(-3.14), -3L)
954 self.assertEqual(long(3.9), 3L)
955 self.assertEqual(long(-3.9), -3L)
956 self.assertEqual(long(3.5), 3L)
957 self.assertEqual(long(-3.5), -3L)
958 self.assertEqual(long("-3"), -3L)
959 if have_unicode:
960 self.assertEqual(long(unicode("-3")), -3L)
961 # Different base:
962 self.assertEqual(long("10",16), 16L)
963 if have_unicode:
964 self.assertEqual(long(unicode("10"),16), 16L)
965 # Check conversions from string (same test set as for int(), and then some)
966 LL = [
967 ('1' + '0'*20, 10L**20),
968 ('1' + '0'*100, 10L**100)
969 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000970 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000971 if have_unicode:
972 L2 += [
973 (unicode('1') + unicode('0')*20, 10L**20),
974 (unicode('1') + unicode('0')*100, 10L**100),
975 ]
976 for s, v in L2 + LL:
977 for sign in "", "+", "-":
978 for prefix in "", " ", "\t", " \t\t ":
979 ss = prefix + sign + s
980 vv = v
981 if sign == "-" and v is not ValueError:
982 vv = -v
983 try:
984 self.assertEqual(long(ss), long(vv))
985 except v:
986 pass
987
988 self.assertRaises(ValueError, long, '123\0')
989 self.assertRaises(ValueError, long, '53', 40)
990 self.assertRaises(TypeError, long, 1, 12)
991
Thomas Wouters477c8d52006-05-27 19:21:47 +0000992 self.assertEqual(long('100000000000000000000000000000000', 2),
993 4294967296)
994 self.assertEqual(long('102002022201221111211', 3), 4294967296)
995 self.assertEqual(long('10000000000000000', 4), 4294967296)
996 self.assertEqual(long('32244002423141', 5), 4294967296)
997 self.assertEqual(long('1550104015504', 6), 4294967296)
998 self.assertEqual(long('211301422354', 7), 4294967296)
999 self.assertEqual(long('40000000000', 8), 4294967296)
1000 self.assertEqual(long('12068657454', 9), 4294967296)
1001 self.assertEqual(long('4294967296', 10), 4294967296)
1002 self.assertEqual(long('1904440554', 11), 4294967296)
1003 self.assertEqual(long('9ba461594', 12), 4294967296)
1004 self.assertEqual(long('535a79889', 13), 4294967296)
1005 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1006 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1007 self.assertEqual(long('100000000', 16), 4294967296)
1008 self.assertEqual(long('a7ffda91', 17), 4294967296)
1009 self.assertEqual(long('704he7g4', 18), 4294967296)
1010 self.assertEqual(long('4f5aff66', 19), 4294967296)
1011 self.assertEqual(long('3723ai4g', 20), 4294967296)
1012 self.assertEqual(long('281d55i4', 21), 4294967296)
1013 self.assertEqual(long('1fj8b184', 22), 4294967296)
1014 self.assertEqual(long('1606k7ic', 23), 4294967296)
1015 self.assertEqual(long('mb994ag', 24), 4294967296)
1016 self.assertEqual(long('hek2mgl', 25), 4294967296)
1017 self.assertEqual(long('dnchbnm', 26), 4294967296)
1018 self.assertEqual(long('b28jpdm', 27), 4294967296)
1019 self.assertEqual(long('8pfgih4', 28), 4294967296)
1020 self.assertEqual(long('76beigg', 29), 4294967296)
1021 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1022 self.assertEqual(long('4q0jto4', 31), 4294967296)
1023 self.assertEqual(long('4000000', 32), 4294967296)
1024 self.assertEqual(long('3aokq94', 33), 4294967296)
1025 self.assertEqual(long('2qhxjli', 34), 4294967296)
1026 self.assertEqual(long('2br45qb', 35), 4294967296)
1027 self.assertEqual(long('1z141z4', 36), 4294967296)
1028
1029 self.assertEqual(long('100000000000000000000000000000001', 2),
1030 4294967297)
1031 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1032 self.assertEqual(long('10000000000000001', 4), 4294967297)
1033 self.assertEqual(long('32244002423142', 5), 4294967297)
1034 self.assertEqual(long('1550104015505', 6), 4294967297)
1035 self.assertEqual(long('211301422355', 7), 4294967297)
1036 self.assertEqual(long('40000000001', 8), 4294967297)
1037 self.assertEqual(long('12068657455', 9), 4294967297)
1038 self.assertEqual(long('4294967297', 10), 4294967297)
1039 self.assertEqual(long('1904440555', 11), 4294967297)
1040 self.assertEqual(long('9ba461595', 12), 4294967297)
1041 self.assertEqual(long('535a7988a', 13), 4294967297)
1042 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1043 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1044 self.assertEqual(long('100000001', 16), 4294967297)
1045 self.assertEqual(long('a7ffda92', 17), 4294967297)
1046 self.assertEqual(long('704he7g5', 18), 4294967297)
1047 self.assertEqual(long('4f5aff67', 19), 4294967297)
1048 self.assertEqual(long('3723ai4h', 20), 4294967297)
1049 self.assertEqual(long('281d55i5', 21), 4294967297)
1050 self.assertEqual(long('1fj8b185', 22), 4294967297)
1051 self.assertEqual(long('1606k7id', 23), 4294967297)
1052 self.assertEqual(long('mb994ah', 24), 4294967297)
1053 self.assertEqual(long('hek2mgm', 25), 4294967297)
1054 self.assertEqual(long('dnchbnn', 26), 4294967297)
1055 self.assertEqual(long('b28jpdn', 27), 4294967297)
1056 self.assertEqual(long('8pfgih5', 28), 4294967297)
1057 self.assertEqual(long('76beigh', 29), 4294967297)
1058 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1059 self.assertEqual(long('4q0jto5', 31), 4294967297)
1060 self.assertEqual(long('4000001', 32), 4294967297)
1061 self.assertEqual(long('3aokq95', 33), 4294967297)
1062 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1063 self.assertEqual(long('2br45qc', 35), 4294967297)
1064 self.assertEqual(long('1z141z5', 36), 4294967297)
1065
1066
Brett Cannonc3647ac2005-04-26 03:45:26 +00001067 def test_longconversion(self):
1068 # Test __long__()
1069 class Foo0:
1070 def __long__(self):
1071 return 42L
1072
1073 class Foo1(object):
1074 def __long__(self):
1075 return 42L
1076
1077 class Foo2(long):
1078 def __long__(self):
1079 return 42L
1080
1081 class Foo3(long):
1082 def __long__(self):
1083 return self
1084
1085 class Foo4(long):
1086 def __long__(self):
1087 return 42
1088
1089 class Foo5(long):
1090 def __long__(self):
1091 return 42.
1092
1093 self.assertEqual(long(Foo0()), 42L)
1094 self.assertEqual(long(Foo1()), 42L)
1095 self.assertEqual(long(Foo2()), 42L)
1096 self.assertEqual(long(Foo3()), 0)
1097 self.assertEqual(long(Foo4()), 42)
1098 self.assertRaises(TypeError, long, Foo5())
1099
Walter Dörwald919497e2003-01-19 16:23:59 +00001100 def test_map(self):
1101 self.assertEqual(
1102 map(None, 'hello world'),
1103 ['h','e','l','l','o',' ','w','o','r','l','d']
1104 )
1105 self.assertEqual(
1106 map(None, 'abcd', 'efg'),
1107 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1108 )
1109 self.assertEqual(
1110 map(None, range(10)),
1111 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1112 )
1113 self.assertEqual(
1114 map(lambda x: x*x, range(1,4)),
1115 [1, 4, 9]
1116 )
1117 try:
1118 from math import sqrt
1119 except ImportError:
1120 def sqrt(x):
1121 return pow(x, 0.5)
1122 self.assertEqual(
1123 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1124 [[4.0, 2.0], [9.0, 3.0]]
1125 )
1126 self.assertEqual(
1127 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1128 [10, 4, 6]
1129 )
1130
1131 def plus(*v):
1132 accu = 0
1133 for i in v: accu = accu + i
1134 return accu
1135 self.assertEqual(
1136 map(plus, [1, 3, 7]),
1137 [1, 3, 7]
1138 )
1139 self.assertEqual(
1140 map(plus, [1, 3, 7], [4, 9, 2]),
1141 [1+4, 3+9, 7+2]
1142 )
1143 self.assertEqual(
1144 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1145 [1+4+1, 3+9+1, 7+2+0]
1146 )
1147 self.assertEqual(
1148 map(None, Squares(10)),
1149 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1150 )
1151 self.assertEqual(
1152 map(int, Squares(10)),
1153 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1154 )
1155 self.assertEqual(
1156 map(None, Squares(3), Squares(2)),
1157 [(0,0), (1,1), (4,None)]
1158 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001159 def Max(a, b):
1160 if a is None:
1161 return b
1162 if b is None:
1163 return a
1164 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001165 self.assertEqual(
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001166 map(Max, Squares(3), Squares(2)),
Walter Dörwald919497e2003-01-19 16:23:59 +00001167 [0, 1, 4]
1168 )
1169 self.assertRaises(TypeError, map)
1170 self.assertRaises(TypeError, map, lambda x: x, 42)
1171 self.assertEqual(map(None, [42]), [42])
1172 class BadSeq:
1173 def __getitem__(self, index):
1174 raise ValueError
1175 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001176 def badfunc(x):
1177 raise RuntimeError
1178 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001179
1180 def test_max(self):
1181 self.assertEqual(max('123123'), '3')
1182 self.assertEqual(max(1, 2, 3), 3)
1183 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1184 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1185
1186 self.assertEqual(max(1, 2L, 3.0), 3.0)
1187 self.assertEqual(max(1L, 2.0, 3), 3)
1188 self.assertEqual(max(1.0, 2, 3L), 3L)
1189
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001190 for stmt in (
1191 "max(key=int)", # no args
1192 "max(1, key=int)", # single arg not iterable
1193 "max(1, 2, keystone=int)", # wrong keyword
1194 "max(1, 2, key=int, abc=int)", # two many keywords
1195 "max(1, 2, key=1)", # keyfunc is not callable
1196 ):
Tim Peters7f061872004-12-07 21:17:46 +00001197 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001198 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001199 except TypeError:
1200 pass
1201 else:
1202 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001203
1204 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1205 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1206 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1207
1208 data = [random.randrange(200) for i in range(100)]
1209 keys = dict((elem, random.randrange(50)) for elem in data)
1210 f = keys.__getitem__
1211 self.assertEqual(max(data, key=f),
1212 sorted(reversed(data), key=f)[-1])
1213
Walter Dörwald919497e2003-01-19 16:23:59 +00001214 def test_min(self):
1215 self.assertEqual(min('123123'), '1')
1216 self.assertEqual(min(1, 2, 3), 1)
1217 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1218 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1219
1220 self.assertEqual(min(1, 2L, 3.0), 1)
1221 self.assertEqual(min(1L, 2.0, 3), 1L)
1222 self.assertEqual(min(1.0, 2, 3L), 1.0)
1223
1224 self.assertRaises(TypeError, min)
1225 self.assertRaises(TypeError, min, 42)
1226 self.assertRaises(ValueError, min, ())
1227 class BadSeq:
1228 def __getitem__(self, index):
1229 raise ValueError
1230 self.assertRaises(ValueError, min, BadSeq())
1231 class BadNumber:
1232 def __cmp__(self, other):
1233 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001234 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001235
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001236 for stmt in (
1237 "min(key=int)", # no args
1238 "min(1, key=int)", # single arg not iterable
1239 "min(1, 2, keystone=int)", # wrong keyword
1240 "min(1, 2, key=int, abc=int)", # two many keywords
1241 "min(1, 2, key=1)", # keyfunc is not callable
1242 ):
Tim Peters7f061872004-12-07 21:17:46 +00001243 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001244 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001245 except TypeError:
1246 pass
1247 else:
1248 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001249
1250 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1251 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1252 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1253
1254 data = [random.randrange(200) for i in range(100)]
1255 keys = dict((elem, random.randrange(50)) for elem in data)
1256 f = keys.__getitem__
1257 self.assertEqual(min(data, key=f),
1258 sorted(data, key=f)[0])
1259
Walter Dörwald919497e2003-01-19 16:23:59 +00001260 def test_oct(self):
1261 self.assertEqual(oct(100), '0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001262 self.assertEqual(oct(100L), '0144')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001263 self.assertEqual(oct(-100), '-0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001264 self.assertEqual(oct(-100L), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001265 self.assertRaises(TypeError, oct, ())
1266
1267 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001268 fp = open(TESTFN, 'w')
1269 try:
1270 fp.write('1+1\n')
1271 fp.write('1+1\n')
1272 fp.write('The quick brown fox jumps over the lazy dog')
1273 fp.write('.\n')
1274 fp.write('Dear John\n')
1275 fp.write('XXX'*100)
1276 fp.write('YYY'*100)
1277 finally:
1278 fp.close()
1279
1280 def test_open(self):
1281 self.write_testfile()
1282 fp = open(TESTFN, 'r')
1283 try:
1284 self.assertEqual(fp.readline(4), '1+1\n')
1285 self.assertEqual(fp.readline(4), '1+1\n')
1286 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1287 self.assertEqual(fp.readline(4), 'Dear')
1288 self.assertEqual(fp.readline(100), ' John\n')
1289 self.assertEqual(fp.read(300), 'XXX'*100)
1290 self.assertEqual(fp.read(1000), 'YYY'*100)
1291 finally:
1292 fp.close()
1293 unlink(TESTFN)
1294
1295 def test_ord(self):
1296 self.assertEqual(ord(' '), 32)
1297 self.assertEqual(ord('A'), 65)
1298 self.assertEqual(ord('a'), 97)
1299 if have_unicode:
1300 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1301 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001302 if have_unicode:
1303 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001304
1305 def test_pow(self):
1306 self.assertEqual(pow(0,0), 1)
1307 self.assertEqual(pow(0,1), 0)
1308 self.assertEqual(pow(1,0), 1)
1309 self.assertEqual(pow(1,1), 1)
1310
1311 self.assertEqual(pow(2,0), 1)
1312 self.assertEqual(pow(2,10), 1024)
1313 self.assertEqual(pow(2,20), 1024*1024)
1314 self.assertEqual(pow(2,30), 1024*1024*1024)
1315
1316 self.assertEqual(pow(-2,0), 1)
1317 self.assertEqual(pow(-2,1), -2)
1318 self.assertEqual(pow(-2,2), 4)
1319 self.assertEqual(pow(-2,3), -8)
1320
1321 self.assertEqual(pow(0L,0), 1)
1322 self.assertEqual(pow(0L,1), 0)
1323 self.assertEqual(pow(1L,0), 1)
1324 self.assertEqual(pow(1L,1), 1)
1325
1326 self.assertEqual(pow(2L,0), 1)
1327 self.assertEqual(pow(2L,10), 1024)
1328 self.assertEqual(pow(2L,20), 1024*1024)
1329 self.assertEqual(pow(2L,30), 1024*1024*1024)
1330
1331 self.assertEqual(pow(-2L,0), 1)
1332 self.assertEqual(pow(-2L,1), -2)
1333 self.assertEqual(pow(-2L,2), 4)
1334 self.assertEqual(pow(-2L,3), -8)
1335
1336 self.assertAlmostEqual(pow(0.,0), 1.)
1337 self.assertAlmostEqual(pow(0.,1), 0.)
1338 self.assertAlmostEqual(pow(1.,0), 1.)
1339 self.assertAlmostEqual(pow(1.,1), 1.)
1340
1341 self.assertAlmostEqual(pow(2.,0), 1.)
1342 self.assertAlmostEqual(pow(2.,10), 1024.)
1343 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1344 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1345
1346 self.assertAlmostEqual(pow(-2.,0), 1.)
1347 self.assertAlmostEqual(pow(-2.,1), -2.)
1348 self.assertAlmostEqual(pow(-2.,2), 4.)
1349 self.assertAlmostEqual(pow(-2.,3), -8.)
1350
1351 for x in 2, 2L, 2.0:
1352 for y in 10, 10L, 10.0:
1353 for z in 1000, 1000L, 1000.0:
1354 if isinstance(x, float) or \
1355 isinstance(y, float) or \
1356 isinstance(z, float):
1357 self.assertRaises(TypeError, pow, x, y, z)
1358 else:
1359 self.assertAlmostEqual(pow(x, y, z), 24.0)
1360
1361 self.assertRaises(TypeError, pow, -1, -2, 3)
1362 self.assertRaises(ValueError, pow, 1, 2, 0)
1363 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1364 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1365 self.assertRaises(ValueError, pow, -342.43, 0.234)
1366
1367 self.assertRaises(TypeError, pow)
1368
1369 def test_range(self):
1370 self.assertEqual(range(3), [0, 1, 2])
1371 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1372 self.assertEqual(range(0), [])
1373 self.assertEqual(range(-3), [])
1374 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1375 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1376
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001377 # Now test range() with longs
1378 self.assertEqual(range(-2**100), [])
1379 self.assertEqual(range(0, -2**100), [])
1380 self.assertEqual(range(0, 2**100, -1), [])
1381 self.assertEqual(range(0, 2**100, -1), [])
1382
1383 a = long(10 * sys.maxint)
1384 b = long(100 * sys.maxint)
1385 c = long(50 * sys.maxint)
1386
1387 self.assertEqual(range(a, a+2), [a, a+1])
1388 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1389 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1390
1391 seq = range(a, b, c)
1392 self.assert_(a in seq)
1393 self.assert_(b not in seq)
1394 self.assertEqual(len(seq), 2)
1395
1396 seq = range(b, a, -c)
1397 self.assert_(b in seq)
1398 self.assert_(a not in seq)
1399 self.assertEqual(len(seq), 2)
1400
1401 seq = range(-a, -b, -c)
1402 self.assert_(-a in seq)
1403 self.assert_(-b not in seq)
1404 self.assertEqual(len(seq), 2)
1405
Walter Dörwald919497e2003-01-19 16:23:59 +00001406 self.assertRaises(TypeError, range)
1407 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1408 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001409 self.assertRaises(ValueError, range, a, a + 1, long(0))
1410
1411 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001412 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001413 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001414 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1415
1416 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001417 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001418
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001419 # Reject floats when it would require PyLongs to represent.
1420 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001421 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001422
Walter Dörwald357981e2003-04-15 18:59:28 +00001423 self.assertRaises(TypeError, range, 0, "spam")
1424 self.assertRaises(TypeError, range, 0, 42, "spam")
1425
1426 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1427 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1428
Walter Dörwald919497e2003-01-19 16:23:59 +00001429 def test_reload(self):
1430 import marshal
1431 reload(marshal)
1432 import string
1433 reload(string)
1434 ## import sys
1435 ## self.assertRaises(ImportError, reload, sys)
1436
1437 def test_repr(self):
1438 self.assertEqual(repr(''), '\'\'')
1439 self.assertEqual(repr(0), '0')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001440 self.assertEqual(repr(0L), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001441 self.assertEqual(repr(()), '()')
1442 self.assertEqual(repr([]), '[]')
1443 self.assertEqual(repr({}), '{}')
1444 a = []
1445 a.append(a)
1446 self.assertEqual(repr(a), '[[...]]')
1447 a = {}
1448 a[0] = a
1449 self.assertEqual(repr(a), '{0: {...}}')
1450
1451 def test_round(self):
1452 self.assertEqual(round(0.0), 0.0)
1453 self.assertEqual(round(1.0), 1.0)
1454 self.assertEqual(round(10.0), 10.0)
1455 self.assertEqual(round(1000000000.0), 1000000000.0)
1456 self.assertEqual(round(1e20), 1e20)
1457
1458 self.assertEqual(round(-1.0), -1.0)
1459 self.assertEqual(round(-10.0), -10.0)
1460 self.assertEqual(round(-1000000000.0), -1000000000.0)
1461 self.assertEqual(round(-1e20), -1e20)
1462
1463 self.assertEqual(round(0.1), 0.0)
1464 self.assertEqual(round(1.1), 1.0)
1465 self.assertEqual(round(10.1), 10.0)
1466 self.assertEqual(round(1000000000.1), 1000000000.0)
1467
1468 self.assertEqual(round(-1.1), -1.0)
1469 self.assertEqual(round(-10.1), -10.0)
1470 self.assertEqual(round(-1000000000.1), -1000000000.0)
1471
1472 self.assertEqual(round(0.9), 1.0)
1473 self.assertEqual(round(9.9), 10.0)
1474 self.assertEqual(round(999999999.9), 1000000000.0)
1475
1476 self.assertEqual(round(-0.9), -1.0)
1477 self.assertEqual(round(-9.9), -10.0)
1478 self.assertEqual(round(-999999999.9), -1000000000.0)
1479
1480 self.assertEqual(round(-8.0, -1), -10.0)
1481
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001482 # test new kwargs
1483 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1484
Walter Dörwald919497e2003-01-19 16:23:59 +00001485 self.assertRaises(TypeError, round)
1486
1487 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001488 setattr(sys, 'spam', 1)
1489 self.assertEqual(sys.spam, 1)
1490 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1491 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001492
1493 def test_str(self):
1494 self.assertEqual(str(''), '')
1495 self.assertEqual(str(0), '0')
1496 self.assertEqual(str(0L), '0')
1497 self.assertEqual(str(()), '()')
1498 self.assertEqual(str([]), '[]')
1499 self.assertEqual(str({}), '{}')
1500 a = []
1501 a.append(a)
1502 self.assertEqual(str(a), '[[...]]')
1503 a = {}
1504 a[0] = a
1505 self.assertEqual(str(a), '{0: {...}}')
1506
Alex Martellia70b1912003-04-22 08:12:33 +00001507 def test_sum(self):
1508 self.assertEqual(sum([]), 0)
1509 self.assertEqual(sum(range(2,8)), 27)
1510 self.assertEqual(sum(iter(range(2,8))), 27)
1511 self.assertEqual(sum(Squares(10)), 285)
1512 self.assertEqual(sum(iter(Squares(10))), 285)
1513 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1514
1515 self.assertRaises(TypeError, sum)
1516 self.assertRaises(TypeError, sum, 42)
1517 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1518 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1519 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1520 self.assertRaises(TypeError, sum, [{2:3}])
1521 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1522
1523 class BadSeq:
1524 def __getitem__(self, index):
1525 raise ValueError
1526 self.assertRaises(ValueError, sum, BadSeq())
1527
Walter Dörwald919497e2003-01-19 16:23:59 +00001528 def test_tuple(self):
1529 self.assertEqual(tuple(()), ())
1530 t0_3 = (0, 1, 2, 3)
1531 t0_3_bis = tuple(t0_3)
1532 self.assert_(t0_3 is t0_3_bis)
1533 self.assertEqual(tuple([]), ())
1534 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1535 self.assertEqual(tuple(''), ())
1536 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1537
1538 def test_type(self):
1539 self.assertEqual(type(''), type('123'))
1540 self.assertNotEqual(type(''), type(()))
1541
1542 def test_unichr(self):
1543 if have_unicode:
1544 self.assertEqual(unichr(32), unicode(' '))
1545 self.assertEqual(unichr(65), unicode('A'))
1546 self.assertEqual(unichr(97), unicode('a'))
1547 self.assertEqual(
1548 unichr(sys.maxunicode),
1549 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1550 )
1551 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1552 self.assertRaises(TypeError, unichr)
1553
Guido van Rossumfee7b932005-01-16 00:21:28 +00001554 # We don't want self in vars(), so these are static methods
1555
1556 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001557 def get_vars_f0():
1558 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001559
Guido van Rossumfee7b932005-01-16 00:21:28 +00001560 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001561 def get_vars_f2():
1562 BuiltinTest.get_vars_f0()
1563 a = 1
1564 b = 2
1565 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001566
1567 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001568 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001569 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001570 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001571 self.assertEqual(self.get_vars_f0(), {})
1572 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1573 self.assertRaises(TypeError, vars, 42, 42)
1574 self.assertRaises(TypeError, vars, 42)
1575
1576 def test_zip(self):
1577 a = (1, 2, 3)
1578 b = (4, 5, 6)
1579 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001580 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001581 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001582 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001583 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001584 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001585 class I:
1586 def __getitem__(self, i):
1587 if i < 0 or i > 2: raise IndexError
1588 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001589 self.assertEqual(list(zip(a, I())), t)
1590 self.assertEqual(list(zip()), [])
1591 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001592 self.assertRaises(TypeError, zip, None)
1593 class G:
1594 pass
1595 self.assertRaises(TypeError, zip, a, G())
1596
1597 # Make sure zip doesn't try to allocate a billion elements for the
1598 # result list when one of its arguments doesn't say how long it is.
1599 # A MemoryError is the most likely failure mode.
1600 class SequenceWithoutALength:
1601 def __getitem__(self, i):
1602 if i == 5:
1603 raise IndexError
1604 else:
1605 return i
1606 self.assertEqual(
Guido van Rossum801f0d72006-08-24 19:48:10 +00001607 list(zip(SequenceWithoutALength(), xrange(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001608 list(enumerate(range(5)))
1609 )
1610
1611 class BadSeq:
1612 def __getitem__(self, i):
1613 if i == 5:
1614 raise ValueError
1615 else:
1616 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001617 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001618
Raymond Hettinger64958a12003-12-17 20:43:33 +00001619class TestSorted(unittest.TestCase):
1620
1621 def test_basic(self):
1622 data = range(100)
1623 copy = data[:]
1624 random.shuffle(copy)
1625 self.assertEqual(data, sorted(copy))
1626 self.assertNotEqual(data, copy)
1627
1628 data.reverse()
1629 random.shuffle(copy)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001630 self.assertEqual(data, sorted(copy, cmp=lambda x, y: (x < y) - (x > y)))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001631 self.assertNotEqual(data, copy)
1632 random.shuffle(copy)
1633 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1634 self.assertNotEqual(data, copy)
1635 random.shuffle(copy)
1636 self.assertEqual(data, sorted(copy, reverse=1))
1637 self.assertNotEqual(data, copy)
1638
1639 def test_inputtypes(self):
1640 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001641 types = [list, tuple]
1642 if have_unicode:
1643 types.insert(0, unicode)
1644 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001645 self.assertEqual(sorted(s), sorted(T(s)))
1646
1647 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001648 types = [set, frozenset, list, tuple, dict.fromkeys]
1649 if have_unicode:
1650 types.insert(0, unicode)
1651 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001652 self.assertEqual(sorted(s), sorted(T(s)))
1653
1654 def test_baddecorator(self):
1655 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1656 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1657
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001658def test_main(verbose=None):
1659 test_classes = (BuiltinTest, TestSorted)
1660
1661 run_unittest(*test_classes)
1662
1663 # verify reference counting
1664 if verbose and hasattr(sys, "gettotalrefcount"):
1665 import gc
1666 counts = [None] * 5
1667 for i in xrange(len(counts)):
1668 run_unittest(*test_classes)
1669 gc.collect()
1670 counts[i] = sys.gettotalrefcount()
1671 print counts
1672
Walter Dörwald919497e2003-01-19 16:23:59 +00001673
1674if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001675 test_main(verbose=True)