blob: c7e439457deaa7dccf0f43caeb39973cc56f7c81 [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
182 def test_cmp(self):
183 self.assertEqual(cmp(-1, 1), -1)
184 self.assertEqual(cmp(1, -1), 1)
185 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000186 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000187 a = []; a.append(a)
188 b = []; b.append(b)
189 from UserList import UserList
190 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000191 self.assertRaises(RuntimeError, cmp, a, b)
192 self.assertRaises(RuntimeError, cmp, b, c)
193 self.assertRaises(RuntimeError, cmp, c, a)
194 self.assertRaises(RuntimeError, cmp, a, c)
195 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000196 a.pop(); b.pop(); c.pop()
197 self.assertRaises(TypeError, cmp)
198
199 def test_coerce(self):
200 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
201 self.assertEqual(coerce(1, 1L), (1L, 1L))
202 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
203 self.assertRaises(TypeError, coerce)
204 class BadNumber:
205 def __coerce__(self, other):
206 raise ValueError
207 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000208 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000209
210 def test_compile(self):
211 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000212 bom = '\xef\xbb\xbf'
213 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000214 self.assertRaises(TypeError, compile)
215 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
216 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000217 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000218 if have_unicode:
219 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000220 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
221 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000222
Walter Dörwald919497e2003-01-19 16:23:59 +0000223 def test_delattr(self):
224 import sys
225 sys.spam = 1
226 delattr(sys, 'spam')
227 self.assertRaises(TypeError, delattr)
228
229 def test_dir(self):
230 x = 1
231 self.assert_('x' in dir())
232 import sys
233 self.assert_('modules' in dir(sys))
234 self.assertRaises(TypeError, dir, 42, 42)
235
236 def test_divmod(self):
237 self.assertEqual(divmod(12, 7), (1, 5))
238 self.assertEqual(divmod(-12, 7), (-2, 2))
239 self.assertEqual(divmod(12, -7), (-2, -2))
240 self.assertEqual(divmod(-12, -7), (1, -5))
241
242 self.assertEqual(divmod(12L, 7L), (1L, 5L))
243 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
244 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
245 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
246
247 self.assertEqual(divmod(12, 7L), (1, 5L))
248 self.assertEqual(divmod(-12, 7L), (-2, 2L))
249 self.assertEqual(divmod(12L, -7), (-2L, -2))
250 self.assertEqual(divmod(-12L, -7), (1L, -5))
251
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000252 self.assertEqual(divmod(-sys.maxint-1, -1),
253 (sys.maxint+1, 0))
254
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
256 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
257 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
258 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
259
260 self.assertRaises(TypeError, divmod)
261
262 def test_eval(self):
263 self.assertEqual(eval('1+1'), 2)
264 self.assertEqual(eval(' 1+1\n'), 2)
265 globals = {'a': 1, 'b': 2}
266 locals = {'b': 200, 'c': 300}
267 self.assertEqual(eval('a', globals) , 1)
268 self.assertEqual(eval('a', globals, locals), 1)
269 self.assertEqual(eval('b', globals, locals), 200)
270 self.assertEqual(eval('c', globals, locals), 300)
271 if have_unicode:
272 self.assertEqual(eval(unicode('1+1')), 2)
273 self.assertEqual(eval(unicode(' 1+1\n')), 2)
274 globals = {'a': 1, 'b': 2}
275 locals = {'b': 200, 'c': 300}
276 if have_unicode:
277 self.assertEqual(eval(unicode('a'), globals), 1)
278 self.assertEqual(eval(unicode('a'), globals, locals), 1)
279 self.assertEqual(eval(unicode('b'), globals, locals), 200)
280 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000281 bom = '\xef\xbb\xbf'
282 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000283 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
284 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000285 self.assertRaises(TypeError, eval)
286 self.assertRaises(TypeError, eval, ())
287
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000288 def test_general_eval(self):
289 # Tests that general mappings can be used for the locals argument
290
291 class M:
292 "Test mapping interface versus possible calls from eval()."
293 def __getitem__(self, key):
294 if key == 'a':
295 return 12
296 raise KeyError
297 def keys(self):
298 return list('xyz')
299
300 m = M()
301 g = globals()
302 self.assertEqual(eval('a', g, m), 12)
303 self.assertRaises(NameError, eval, 'b', g, m)
304 self.assertEqual(eval('dir()', g, m), list('xyz'))
305 self.assertEqual(eval('globals()', g, m), g)
306 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000307 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000308 class A:
309 "Non-mapping"
310 pass
311 m = A()
312 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000313
314 # Verify that dict subclasses work as well
315 class D(dict):
316 def __getitem__(self, key):
317 if key == 'a':
318 return 12
319 return dict.__getitem__(self, key)
320 def keys(self):
321 return list('xyz')
322
323 d = D()
324 self.assertEqual(eval('a', g, d), 12)
325 self.assertRaises(NameError, eval, 'b', g, d)
326 self.assertEqual(eval('dir()', g, d), list('xyz'))
327 self.assertEqual(eval('globals()', g, d), g)
328 self.assertEqual(eval('locals()', g, d), d)
329
330 # Verify locals stores (used by list comps)
331 eval('[locals() for i in (2,3)]', g, d)
332 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
333
334 class SpreadSheet:
335 "Sample application showing nested, calculated lookups."
336 _cells = {}
337 def __setitem__(self, key, formula):
338 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000339 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000340 return eval(self._cells[key], globals(), self)
341
342 ss = SpreadSheet()
343 ss['a1'] = '5'
344 ss['a2'] = 'a1*6'
345 ss['a3'] = 'a2*7'
346 self.assertEqual(ss['a3'], 210)
347
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000348 # Verify that dir() catches a non-list returned by eval
349 # SF bug #1004669
350 class C:
351 def __getitem__(self, item):
352 raise KeyError(item)
353 def keys(self):
354 return 'a'
355 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
356
Walter Dörwald919497e2003-01-19 16:23:59 +0000357 # Done outside of the method test_z to get the correct scope
358 z = 0
359 f = open(TESTFN, 'w')
360 f.write('z = z+1\n')
361 f.write('z = z*2\n')
362 f.close()
363 execfile(TESTFN)
364
365 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000366 global numruns
367 if numruns:
368 return
369 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000370
Walter Dörwald919497e2003-01-19 16:23:59 +0000371 globals = {'a': 1, 'b': 2}
372 locals = {'b': 200, 'c': 300}
373
374 self.assertEqual(self.__class__.z, 2)
375 globals['z'] = 0
376 execfile(TESTFN, globals)
377 self.assertEqual(globals['z'], 2)
378 locals['z'] = 0
379 execfile(TESTFN, globals, locals)
380 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000381
382 class M:
383 "Test mapping interface versus possible calls from execfile()."
384 def __init__(self):
385 self.z = 10
386 def __getitem__(self, key):
387 if key == 'z':
388 return self.z
389 raise KeyError
390 def __setitem__(self, key, value):
391 if key == 'z':
392 self.z = value
393 return
394 raise KeyError
395
396 locals = M()
397 locals['z'] = 0
398 execfile(TESTFN, globals, locals)
399 self.assertEqual(locals['z'], 2)
400
Walter Dörwald919497e2003-01-19 16:23:59 +0000401 unlink(TESTFN)
402 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000403 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000404 import os
405 self.assertRaises(IOError, execfile, os.curdir)
406 self.assertRaises(IOError, execfile, "I_dont_exist")
407
408 def test_filter(self):
409 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
410 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
411 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
412 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
413 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
414 def identity(item):
415 return 1
416 filter(identity, Squares(5))
417 self.assertRaises(TypeError, filter)
418 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000419 def __getitem__(self, index):
420 if index<4:
421 return 42
422 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000423 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
424 def badfunc():
425 pass
426 self.assertRaises(TypeError, filter, badfunc, range(5))
427
Walter Dörwaldbf517072003-01-27 15:57:14 +0000428 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000429 self.assertEqual(filter(None, (1, 2)), (1, 2))
430 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
431 self.assertRaises(TypeError, filter, 42, (1, 2))
432
Walter Dörwaldbf517072003-01-27 15:57:14 +0000433 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000434 self.assertEqual(filter(None, "12"), "12")
435 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
436 self.assertRaises(TypeError, filter, 42, "12")
437 class badstr(str):
438 def __getitem__(self, index):
439 raise ValueError
440 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000441
Walter Dörwald903f1e02003-02-04 16:28:00 +0000442 class badstr2(str):
443 def __getitem__(self, index):
444 return 42
445 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
446
447 class weirdstr(str):
448 def __getitem__(self, index):
449 return weirdstr(2*str.__getitem__(self, index))
450 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
451
Walter Dörwald5e61e242003-02-04 17:04:01 +0000452 class shiftstr(str):
453 def __getitem__(self, index):
454 return chr(ord(str.__getitem__(self, index))+1)
455 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
456
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000457 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000458 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000459 self.assertEqual(filter(None, unicode("12")), unicode("12"))
460 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
461 self.assertRaises(TypeError, filter, 42, unicode("12"))
462 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000463
Walter Dörwald903f1e02003-02-04 16:28:00 +0000464 class badunicode(unicode):
465 def __getitem__(self, index):
466 return 42
467 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
468
469 class weirdunicode(unicode):
470 def __getitem__(self, index):
471 return weirdunicode(2*unicode.__getitem__(self, index))
472 self.assertEqual(
473 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
474
Walter Dörwald5e61e242003-02-04 17:04:01 +0000475 class shiftunicode(unicode):
476 def __getitem__(self, index):
477 return unichr(ord(unicode.__getitem__(self, index))+1)
478 self.assertEqual(
479 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
480 unicode("345")
481 )
482
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000483 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000484 # test that filter() never returns tuple, str or unicode subclasses
485 # and that the result always goes through __getitem__
486 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000487 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000488 def __getitem__(self, index):
489 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000490 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000491 def __getitem__(self, index):
492 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000493 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000494 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000495 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000496 }
497 if have_unicode:
498 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000499 def __getitem__(self, index):
500 return 2*unicode.__getitem__(self, index)
501 inputs[unicode2] = {
502 unicode(): unicode(),
503 unicode("123"): unicode("112233")
504 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000505
Walter Dörwald1918f772003-02-10 13:19:13 +0000506 for (cls, inps) in inputs.iteritems():
507 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000508 # make sure the output goes through __getitem__
509 # even if func is None
510 self.assertEqual(
511 filter(funcs[0], cls(inp)),
512 filter(funcs[1], cls(inp))
513 )
514 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000515 outp = filter(func, cls(inp))
516 self.assertEqual(outp, exp)
517 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000518
Walter Dörwald919497e2003-01-19 16:23:59 +0000519 def test_float(self):
520 self.assertEqual(float(3.14), 3.14)
521 self.assertEqual(float(314), 314.0)
522 self.assertEqual(float(314L), 314.0)
523 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000524 self.assertRaises(ValueError, float, " 0x3.1 ")
525 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000526 if have_unicode:
527 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
528 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000529 # Implementation limitation in PyFloat_FromString()
530 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000531
Thomas Wouters477c8d52006-05-27 19:21:47 +0000532 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000533 def test_float_with_comma(self):
534 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000535 # float must not accept the locale specific decimal point but
536 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537 import locale
538 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000539 return
540
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000541 self.assertEqual(float(" 3.14 "), 3.14)
542 self.assertEqual(float("+3.14 "), 3.14)
543 self.assertEqual(float("-3.14 "), -3.14)
544 self.assertEqual(float(".14 "), .14)
545 self.assertEqual(float("3. "), 3.0)
546 self.assertEqual(float("3.e3 "), 3000.0)
547 self.assertEqual(float("3.2e3 "), 3200.0)
548 self.assertEqual(float("2.5e-1 "), 0.25)
549 self.assertEqual(float("5e-1"), 0.5)
550 self.assertRaises(ValueError, float, " 3,14 ")
551 self.assertRaises(ValueError, float, " +3,14 ")
552 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000553 self.assertRaises(ValueError, float, " 0x3.1 ")
554 self.assertRaises(ValueError, float, " -0x3.p-1 ")
555 self.assertEqual(float(" 25.e-1 "), 2.5)
556 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000557
Brett Cannonc3647ac2005-04-26 03:45:26 +0000558 def test_floatconversion(self):
559 # Make sure that calls to __float__() work properly
560 class Foo0:
561 def __float__(self):
562 return 42.
563
564 class Foo1(object):
565 def __float__(self):
566 return 42.
567
568 class Foo2(float):
569 def __float__(self):
570 return 42.
571
572 class Foo3(float):
573 def __new__(cls, value=0.):
574 return float.__new__(cls, 2*value)
575
576 def __float__(self):
577 return self
578
579 class Foo4(float):
580 def __float__(self):
581 return 42
582
583 self.assertAlmostEqual(float(Foo0()), 42.)
584 self.assertAlmostEqual(float(Foo1()), 42.)
585 self.assertAlmostEqual(float(Foo2()), 42.)
586 self.assertAlmostEqual(float(Foo3(21)), 42.)
587 self.assertRaises(TypeError, float, Foo4(42))
588
Walter Dörwald919497e2003-01-19 16:23:59 +0000589 def test_getattr(self):
590 import sys
591 self.assert_(getattr(sys, 'stdout') is sys.stdout)
592 self.assertRaises(TypeError, getattr, sys, 1)
593 self.assertRaises(TypeError, getattr, sys, 1, "foo")
594 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000595 if have_unicode:
596 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000597
598 def test_hasattr(self):
599 import sys
600 self.assert_(hasattr(sys, 'stdout'))
601 self.assertRaises(TypeError, hasattr, sys, 1)
602 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000603 if have_unicode:
604 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000605
606 def test_hash(self):
607 hash(None)
608 self.assertEqual(hash(1), hash(1L))
609 self.assertEqual(hash(1), hash(1.0))
610 hash('spam')
611 if have_unicode:
612 self.assertEqual(hash('spam'), hash(unicode('spam')))
613 hash((0,1,2,3))
614 def f(): pass
615 self.assertRaises(TypeError, hash, [])
616 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000617 # Bug 1536021: Allow hash to return long objects
618 class X:
619 def __hash__(self):
620 return 2**100
621 self.assertEquals(type(hash(X())), int)
622 class Y(object):
623 def __hash__(self):
624 return 2**100
625 self.assertEquals(type(hash(Y())), int)
626 class Z(long):
627 def __hash__(self):
628 return self
629 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000630
631 def test_hex(self):
632 self.assertEqual(hex(16), '0x10')
633 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000634 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000635 self.assertEqual(hex(-16L), '-0x10L')
636 self.assertRaises(TypeError, hex, {})
637
638 def test_id(self):
639 id(None)
640 id(1)
641 id(1L)
642 id(1.0)
643 id('spam')
644 id((0,1,2,3))
645 id([0,1,2,3])
646 id({'spam': 1, 'eggs': 2, 'ham': 3})
647
Walter Dörwald919497e2003-01-19 16:23:59 +0000648 def test_int(self):
649 self.assertEqual(int(314), 314)
650 self.assertEqual(int(3.14), 3)
651 self.assertEqual(int(314L), 314)
652 # Check that conversion from float truncates towards zero
653 self.assertEqual(int(-3.14), -3)
654 self.assertEqual(int(3.9), 3)
655 self.assertEqual(int(-3.9), -3)
656 self.assertEqual(int(3.5), 3)
657 self.assertEqual(int(-3.5), -3)
658 # Different base:
659 self.assertEqual(int("10",16), 16L)
660 if have_unicode:
661 self.assertEqual(int(unicode("10"),16), 16L)
662 # Test conversion from strings and various anomalies
663 for s, v in L:
664 for sign in "", "+", "-":
665 for prefix in "", " ", "\t", " \t\t ":
666 ss = prefix + sign + s
667 vv = v
668 if sign == "-" and v is not ValueError:
669 vv = -v
670 try:
671 self.assertEqual(int(ss), vv)
672 except v:
673 pass
674
Walter Dörwald70a6b492004-02-12 17:35:32 +0000675 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000676 self.assertEqual(int(s)+1, -sys.maxint)
677 # should return long
678 int(s[1:])
679
680 # should return long
681 x = int(1e100)
682 self.assert_(isinstance(x, long))
683 x = int(-1e100)
684 self.assert_(isinstance(x, long))
685
686
687 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
688 # Worked by accident in Windows release build, but failed in debug build.
689 # Failed in all Linux builds.
690 x = -1-sys.maxint
691 self.assertEqual(x >> 1, x//2)
692
693 self.assertRaises(ValueError, int, '123\0')
694 self.assertRaises(ValueError, int, '53', 40)
695
696 x = int('1' * 600)
697 self.assert_(isinstance(x, long))
698
699 if have_unicode:
700 x = int(unichr(0x661) * 600)
701 self.assert_(isinstance(x, long))
702
703 self.assertRaises(TypeError, int, 1, 12)
704
705 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000706 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000707
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708 # SF bug 1334662: int(string, base) wrong answers
709 # Various representations of 2**32 evaluated to 0
710 # rather than 2**32 in previous versions
711
712 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
713 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
714 self.assertEqual(int('10000000000000000', 4), 4294967296L)
715 self.assertEqual(int('32244002423141', 5), 4294967296L)
716 self.assertEqual(int('1550104015504', 6), 4294967296L)
717 self.assertEqual(int('211301422354', 7), 4294967296L)
718 self.assertEqual(int('40000000000', 8), 4294967296L)
719 self.assertEqual(int('12068657454', 9), 4294967296L)
720 self.assertEqual(int('4294967296', 10), 4294967296L)
721 self.assertEqual(int('1904440554', 11), 4294967296L)
722 self.assertEqual(int('9ba461594', 12), 4294967296L)
723 self.assertEqual(int('535a79889', 13), 4294967296L)
724 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
725 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
726 self.assertEqual(int('100000000', 16), 4294967296L)
727 self.assertEqual(int('a7ffda91', 17), 4294967296L)
728 self.assertEqual(int('704he7g4', 18), 4294967296L)
729 self.assertEqual(int('4f5aff66', 19), 4294967296L)
730 self.assertEqual(int('3723ai4g', 20), 4294967296L)
731 self.assertEqual(int('281d55i4', 21), 4294967296L)
732 self.assertEqual(int('1fj8b184', 22), 4294967296L)
733 self.assertEqual(int('1606k7ic', 23), 4294967296L)
734 self.assertEqual(int('mb994ag', 24), 4294967296L)
735 self.assertEqual(int('hek2mgl', 25), 4294967296L)
736 self.assertEqual(int('dnchbnm', 26), 4294967296L)
737 self.assertEqual(int('b28jpdm', 27), 4294967296L)
738 self.assertEqual(int('8pfgih4', 28), 4294967296L)
739 self.assertEqual(int('76beigg', 29), 4294967296L)
740 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
741 self.assertEqual(int('4q0jto4', 31), 4294967296L)
742 self.assertEqual(int('4000000', 32), 4294967296L)
743 self.assertEqual(int('3aokq94', 33), 4294967296L)
744 self.assertEqual(int('2qhxjli', 34), 4294967296L)
745 self.assertEqual(int('2br45qb', 35), 4294967296L)
746 self.assertEqual(int('1z141z4', 36), 4294967296L)
747
748 # SF bug 1334662: int(string, base) wrong answers
749 # Checks for proper evaluation of 2**32 + 1
750 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
751 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
752 self.assertEqual(int('10000000000000001', 4), 4294967297L)
753 self.assertEqual(int('32244002423142', 5), 4294967297L)
754 self.assertEqual(int('1550104015505', 6), 4294967297L)
755 self.assertEqual(int('211301422355', 7), 4294967297L)
756 self.assertEqual(int('40000000001', 8), 4294967297L)
757 self.assertEqual(int('12068657455', 9), 4294967297L)
758 self.assertEqual(int('4294967297', 10), 4294967297L)
759 self.assertEqual(int('1904440555', 11), 4294967297L)
760 self.assertEqual(int('9ba461595', 12), 4294967297L)
761 self.assertEqual(int('535a7988a', 13), 4294967297L)
762 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
763 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
764 self.assertEqual(int('100000001', 16), 4294967297L)
765 self.assertEqual(int('a7ffda92', 17), 4294967297L)
766 self.assertEqual(int('704he7g5', 18), 4294967297L)
767 self.assertEqual(int('4f5aff67', 19), 4294967297L)
768 self.assertEqual(int('3723ai4h', 20), 4294967297L)
769 self.assertEqual(int('281d55i5', 21), 4294967297L)
770 self.assertEqual(int('1fj8b185', 22), 4294967297L)
771 self.assertEqual(int('1606k7id', 23), 4294967297L)
772 self.assertEqual(int('mb994ah', 24), 4294967297L)
773 self.assertEqual(int('hek2mgm', 25), 4294967297L)
774 self.assertEqual(int('dnchbnn', 26), 4294967297L)
775 self.assertEqual(int('b28jpdn', 27), 4294967297L)
776 self.assertEqual(int('8pfgih5', 28), 4294967297L)
777 self.assertEqual(int('76beigh', 29), 4294967297L)
778 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
779 self.assertEqual(int('4q0jto5', 31), 4294967297L)
780 self.assertEqual(int('4000001', 32), 4294967297L)
781 self.assertEqual(int('3aokq95', 33), 4294967297L)
782 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
783 self.assertEqual(int('2br45qc', 35), 4294967297L)
784 self.assertEqual(int('1z141z5', 36), 4294967297L)
785
Brett Cannonc3647ac2005-04-26 03:45:26 +0000786 def test_intconversion(self):
787 # Test __int__()
788 class Foo0:
789 def __int__(self):
790 return 42
791
792 class Foo1(object):
793 def __int__(self):
794 return 42
795
796 class Foo2(int):
797 def __int__(self):
798 return 42
799
800 class Foo3(int):
801 def __int__(self):
802 return self
803
804 class Foo4(int):
805 def __int__(self):
806 return 42L
807
808 class Foo5(int):
809 def __int__(self):
810 return 42.
811
812 self.assertEqual(int(Foo0()), 42)
813 self.assertEqual(int(Foo1()), 42)
814 self.assertEqual(int(Foo2()), 42)
815 self.assertEqual(int(Foo3()), 0)
816 self.assertEqual(int(Foo4()), 42L)
817 self.assertRaises(TypeError, int, Foo5())
818
Walter Dörwald919497e2003-01-19 16:23:59 +0000819 def test_intern(self):
820 self.assertRaises(TypeError, intern)
821 s = "never interned before"
822 self.assert_(intern(s) is s)
823 s2 = s.swapcase().swapcase()
824 self.assert_(intern(s2) is s)
825
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000826 # Subclasses of string can't be interned, because they
827 # provide too much opportunity for insane things to happen.
828 # We don't want them in the interned dict and if they aren't
829 # actually interned, we don't want to create the appearance
830 # that they are by allowing intern() to succeeed.
831 class S(str):
832 def __hash__(self):
833 return 123
834
835 self.assertRaises(TypeError, intern, S("abc"))
836
837 # It's still safe to pass these strings to routines that
838 # call intern internally, e.g. PyObject_SetAttr().
839 s = S("abc")
840 setattr(s, s, s)
841 self.assertEqual(getattr(s, s), s)
842
Walter Dörwald919497e2003-01-19 16:23:59 +0000843 def test_iter(self):
844 self.assertRaises(TypeError, iter)
845 self.assertRaises(TypeError, iter, 42, 42)
846 lists = [("1", "2"), ["1", "2"], "12"]
847 if have_unicode:
848 lists.append(unicode("12"))
849 for l in lists:
850 i = iter(l)
851 self.assertEqual(i.next(), '1')
852 self.assertEqual(i.next(), '2')
853 self.assertRaises(StopIteration, i.next)
854
855 def test_isinstance(self):
856 class C:
857 pass
858 class D(C):
859 pass
860 class E:
861 pass
862 c = C()
863 d = D()
864 e = E()
865 self.assert_(isinstance(c, C))
866 self.assert_(isinstance(d, C))
867 self.assert_(not isinstance(e, C))
868 self.assert_(not isinstance(c, D))
869 self.assert_(not isinstance('foo', E))
870 self.assertRaises(TypeError, isinstance, E, 'foo')
871 self.assertRaises(TypeError, isinstance)
872
873 def test_issubclass(self):
874 class C:
875 pass
876 class D(C):
877 pass
878 class E:
879 pass
880 c = C()
881 d = D()
882 e = E()
883 self.assert_(issubclass(D, C))
884 self.assert_(issubclass(C, C))
885 self.assert_(not issubclass(C, D))
886 self.assertRaises(TypeError, issubclass, 'foo', E)
887 self.assertRaises(TypeError, issubclass, E, 'foo')
888 self.assertRaises(TypeError, issubclass)
889
890 def test_len(self):
891 self.assertEqual(len('123'), 3)
892 self.assertEqual(len(()), 0)
893 self.assertEqual(len((1, 2, 3, 4)), 4)
894 self.assertEqual(len([1, 2, 3, 4]), 4)
895 self.assertEqual(len({}), 0)
896 self.assertEqual(len({'a':1, 'b': 2}), 2)
897 class BadSeq:
898 def __len__(self):
899 raise ValueError
900 self.assertRaises(ValueError, len, BadSeq())
901
902 def test_list(self):
903 self.assertEqual(list([]), [])
904 l0_3 = [0, 1, 2, 3]
905 l0_3_bis = list(l0_3)
906 self.assertEqual(l0_3, l0_3_bis)
907 self.assert_(l0_3 is not l0_3_bis)
908 self.assertEqual(list(()), [])
909 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
910 self.assertEqual(list(''), [])
911 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
912
913 if sys.maxint == 0x7fffffff:
914 # This test can currently only work on 32-bit machines.
915 # XXX If/when PySequence_Length() returns a ssize_t, it should be
916 # XXX re-enabled.
917 # Verify clearing of bug #556025.
918 # This assumes that the max data size (sys.maxint) == max
919 # address size this also assumes that the address size is at
920 # least 4 bytes with 8 byte addresses, the bug is not well
921 # tested
922 #
923 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
924 # earlier due to a newlib bug. See the following mailing list
925 # thread for the details:
926
927 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
928 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
929
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000930 # This code used to segfault in Py2.4a3
931 x = []
932 x.extend(-y for y in x)
933 self.assertEqual(x, [])
934
Walter Dörwald919497e2003-01-19 16:23:59 +0000935 def test_long(self):
936 self.assertEqual(long(314), 314L)
937 self.assertEqual(long(3.14), 3L)
938 self.assertEqual(long(314L), 314L)
939 # Check that conversion from float truncates towards zero
940 self.assertEqual(long(-3.14), -3L)
941 self.assertEqual(long(3.9), 3L)
942 self.assertEqual(long(-3.9), -3L)
943 self.assertEqual(long(3.5), 3L)
944 self.assertEqual(long(-3.5), -3L)
945 self.assertEqual(long("-3"), -3L)
946 if have_unicode:
947 self.assertEqual(long(unicode("-3")), -3L)
948 # Different base:
949 self.assertEqual(long("10",16), 16L)
950 if have_unicode:
951 self.assertEqual(long(unicode("10"),16), 16L)
952 # Check conversions from string (same test set as for int(), and then some)
953 LL = [
954 ('1' + '0'*20, 10L**20),
955 ('1' + '0'*100, 10L**100)
956 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000957 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000958 if have_unicode:
959 L2 += [
960 (unicode('1') + unicode('0')*20, 10L**20),
961 (unicode('1') + unicode('0')*100, 10L**100),
962 ]
963 for s, v in L2 + LL:
964 for sign in "", "+", "-":
965 for prefix in "", " ", "\t", " \t\t ":
966 ss = prefix + sign + s
967 vv = v
968 if sign == "-" and v is not ValueError:
969 vv = -v
970 try:
971 self.assertEqual(long(ss), long(vv))
972 except v:
973 pass
974
975 self.assertRaises(ValueError, long, '123\0')
976 self.assertRaises(ValueError, long, '53', 40)
977 self.assertRaises(TypeError, long, 1, 12)
978
Thomas Wouters477c8d52006-05-27 19:21:47 +0000979 self.assertEqual(long('100000000000000000000000000000000', 2),
980 4294967296)
981 self.assertEqual(long('102002022201221111211', 3), 4294967296)
982 self.assertEqual(long('10000000000000000', 4), 4294967296)
983 self.assertEqual(long('32244002423141', 5), 4294967296)
984 self.assertEqual(long('1550104015504', 6), 4294967296)
985 self.assertEqual(long('211301422354', 7), 4294967296)
986 self.assertEqual(long('40000000000', 8), 4294967296)
987 self.assertEqual(long('12068657454', 9), 4294967296)
988 self.assertEqual(long('4294967296', 10), 4294967296)
989 self.assertEqual(long('1904440554', 11), 4294967296)
990 self.assertEqual(long('9ba461594', 12), 4294967296)
991 self.assertEqual(long('535a79889', 13), 4294967296)
992 self.assertEqual(long('2ca5b7464', 14), 4294967296)
993 self.assertEqual(long('1a20dcd81', 15), 4294967296)
994 self.assertEqual(long('100000000', 16), 4294967296)
995 self.assertEqual(long('a7ffda91', 17), 4294967296)
996 self.assertEqual(long('704he7g4', 18), 4294967296)
997 self.assertEqual(long('4f5aff66', 19), 4294967296)
998 self.assertEqual(long('3723ai4g', 20), 4294967296)
999 self.assertEqual(long('281d55i4', 21), 4294967296)
1000 self.assertEqual(long('1fj8b184', 22), 4294967296)
1001 self.assertEqual(long('1606k7ic', 23), 4294967296)
1002 self.assertEqual(long('mb994ag', 24), 4294967296)
1003 self.assertEqual(long('hek2mgl', 25), 4294967296)
1004 self.assertEqual(long('dnchbnm', 26), 4294967296)
1005 self.assertEqual(long('b28jpdm', 27), 4294967296)
1006 self.assertEqual(long('8pfgih4', 28), 4294967296)
1007 self.assertEqual(long('76beigg', 29), 4294967296)
1008 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1009 self.assertEqual(long('4q0jto4', 31), 4294967296)
1010 self.assertEqual(long('4000000', 32), 4294967296)
1011 self.assertEqual(long('3aokq94', 33), 4294967296)
1012 self.assertEqual(long('2qhxjli', 34), 4294967296)
1013 self.assertEqual(long('2br45qb', 35), 4294967296)
1014 self.assertEqual(long('1z141z4', 36), 4294967296)
1015
1016 self.assertEqual(long('100000000000000000000000000000001', 2),
1017 4294967297)
1018 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1019 self.assertEqual(long('10000000000000001', 4), 4294967297)
1020 self.assertEqual(long('32244002423142', 5), 4294967297)
1021 self.assertEqual(long('1550104015505', 6), 4294967297)
1022 self.assertEqual(long('211301422355', 7), 4294967297)
1023 self.assertEqual(long('40000000001', 8), 4294967297)
1024 self.assertEqual(long('12068657455', 9), 4294967297)
1025 self.assertEqual(long('4294967297', 10), 4294967297)
1026 self.assertEqual(long('1904440555', 11), 4294967297)
1027 self.assertEqual(long('9ba461595', 12), 4294967297)
1028 self.assertEqual(long('535a7988a', 13), 4294967297)
1029 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1030 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1031 self.assertEqual(long('100000001', 16), 4294967297)
1032 self.assertEqual(long('a7ffda92', 17), 4294967297)
1033 self.assertEqual(long('704he7g5', 18), 4294967297)
1034 self.assertEqual(long('4f5aff67', 19), 4294967297)
1035 self.assertEqual(long('3723ai4h', 20), 4294967297)
1036 self.assertEqual(long('281d55i5', 21), 4294967297)
1037 self.assertEqual(long('1fj8b185', 22), 4294967297)
1038 self.assertEqual(long('1606k7id', 23), 4294967297)
1039 self.assertEqual(long('mb994ah', 24), 4294967297)
1040 self.assertEqual(long('hek2mgm', 25), 4294967297)
1041 self.assertEqual(long('dnchbnn', 26), 4294967297)
1042 self.assertEqual(long('b28jpdn', 27), 4294967297)
1043 self.assertEqual(long('8pfgih5', 28), 4294967297)
1044 self.assertEqual(long('76beigh', 29), 4294967297)
1045 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1046 self.assertEqual(long('4q0jto5', 31), 4294967297)
1047 self.assertEqual(long('4000001', 32), 4294967297)
1048 self.assertEqual(long('3aokq95', 33), 4294967297)
1049 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1050 self.assertEqual(long('2br45qc', 35), 4294967297)
1051 self.assertEqual(long('1z141z5', 36), 4294967297)
1052
1053
Brett Cannonc3647ac2005-04-26 03:45:26 +00001054 def test_longconversion(self):
1055 # Test __long__()
1056 class Foo0:
1057 def __long__(self):
1058 return 42L
1059
1060 class Foo1(object):
1061 def __long__(self):
1062 return 42L
1063
1064 class Foo2(long):
1065 def __long__(self):
1066 return 42L
1067
1068 class Foo3(long):
1069 def __long__(self):
1070 return self
1071
1072 class Foo4(long):
1073 def __long__(self):
1074 return 42
1075
1076 class Foo5(long):
1077 def __long__(self):
1078 return 42.
1079
1080 self.assertEqual(long(Foo0()), 42L)
1081 self.assertEqual(long(Foo1()), 42L)
1082 self.assertEqual(long(Foo2()), 42L)
1083 self.assertEqual(long(Foo3()), 0)
1084 self.assertEqual(long(Foo4()), 42)
1085 self.assertRaises(TypeError, long, Foo5())
1086
Walter Dörwald919497e2003-01-19 16:23:59 +00001087 def test_map(self):
1088 self.assertEqual(
1089 map(None, 'hello world'),
1090 ['h','e','l','l','o',' ','w','o','r','l','d']
1091 )
1092 self.assertEqual(
1093 map(None, 'abcd', 'efg'),
1094 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1095 )
1096 self.assertEqual(
1097 map(None, range(10)),
1098 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1099 )
1100 self.assertEqual(
1101 map(lambda x: x*x, range(1,4)),
1102 [1, 4, 9]
1103 )
1104 try:
1105 from math import sqrt
1106 except ImportError:
1107 def sqrt(x):
1108 return pow(x, 0.5)
1109 self.assertEqual(
1110 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1111 [[4.0, 2.0], [9.0, 3.0]]
1112 )
1113 self.assertEqual(
1114 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1115 [10, 4, 6]
1116 )
1117
1118 def plus(*v):
1119 accu = 0
1120 for i in v: accu = accu + i
1121 return accu
1122 self.assertEqual(
1123 map(plus, [1, 3, 7]),
1124 [1, 3, 7]
1125 )
1126 self.assertEqual(
1127 map(plus, [1, 3, 7], [4, 9, 2]),
1128 [1+4, 3+9, 7+2]
1129 )
1130 self.assertEqual(
1131 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1132 [1+4+1, 3+9+1, 7+2+0]
1133 )
1134 self.assertEqual(
1135 map(None, Squares(10)),
1136 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1137 )
1138 self.assertEqual(
1139 map(int, Squares(10)),
1140 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1141 )
1142 self.assertEqual(
1143 map(None, Squares(3), Squares(2)),
1144 [(0,0), (1,1), (4,None)]
1145 )
1146 self.assertEqual(
1147 map(max, Squares(3), Squares(2)),
1148 [0, 1, 4]
1149 )
1150 self.assertRaises(TypeError, map)
1151 self.assertRaises(TypeError, map, lambda x: x, 42)
1152 self.assertEqual(map(None, [42]), [42])
1153 class BadSeq:
1154 def __getitem__(self, index):
1155 raise ValueError
1156 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001157 def badfunc(x):
1158 raise RuntimeError
1159 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001160
1161 def test_max(self):
1162 self.assertEqual(max('123123'), '3')
1163 self.assertEqual(max(1, 2, 3), 3)
1164 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1165 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1166
1167 self.assertEqual(max(1, 2L, 3.0), 3.0)
1168 self.assertEqual(max(1L, 2.0, 3), 3)
1169 self.assertEqual(max(1.0, 2, 3L), 3L)
1170
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001171 for stmt in (
1172 "max(key=int)", # no args
1173 "max(1, key=int)", # single arg not iterable
1174 "max(1, 2, keystone=int)", # wrong keyword
1175 "max(1, 2, key=int, abc=int)", # two many keywords
1176 "max(1, 2, key=1)", # keyfunc is not callable
1177 ):
Tim Peters7f061872004-12-07 21:17:46 +00001178 try:
1179 exec(stmt) in globals()
1180 except TypeError:
1181 pass
1182 else:
1183 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001184
1185 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1186 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1187 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1188
1189 data = [random.randrange(200) for i in range(100)]
1190 keys = dict((elem, random.randrange(50)) for elem in data)
1191 f = keys.__getitem__
1192 self.assertEqual(max(data, key=f),
1193 sorted(reversed(data), key=f)[-1])
1194
Walter Dörwald919497e2003-01-19 16:23:59 +00001195 def test_min(self):
1196 self.assertEqual(min('123123'), '1')
1197 self.assertEqual(min(1, 2, 3), 1)
1198 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1199 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1200
1201 self.assertEqual(min(1, 2L, 3.0), 1)
1202 self.assertEqual(min(1L, 2.0, 3), 1L)
1203 self.assertEqual(min(1.0, 2, 3L), 1.0)
1204
1205 self.assertRaises(TypeError, min)
1206 self.assertRaises(TypeError, min, 42)
1207 self.assertRaises(ValueError, min, ())
1208 class BadSeq:
1209 def __getitem__(self, index):
1210 raise ValueError
1211 self.assertRaises(ValueError, min, BadSeq())
1212 class BadNumber:
1213 def __cmp__(self, other):
1214 raise ValueError
1215 self.assertRaises(ValueError, min, (42, BadNumber()))
1216
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001217 for stmt in (
1218 "min(key=int)", # no args
1219 "min(1, key=int)", # single arg not iterable
1220 "min(1, 2, keystone=int)", # wrong keyword
1221 "min(1, 2, key=int, abc=int)", # two many keywords
1222 "min(1, 2, key=1)", # keyfunc is not callable
1223 ):
Tim Peters7f061872004-12-07 21:17:46 +00001224 try:
1225 exec(stmt) in globals()
1226 except TypeError:
1227 pass
1228 else:
1229 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001230
1231 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1232 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1233 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1234
1235 data = [random.randrange(200) for i in range(100)]
1236 keys = dict((elem, random.randrange(50)) for elem in data)
1237 f = keys.__getitem__
1238 self.assertEqual(min(data, key=f),
1239 sorted(data, key=f)[0])
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 def test_oct(self):
1242 self.assertEqual(oct(100), '0144')
1243 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001244 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001245 self.assertEqual(oct(-100L), '-0144L')
1246 self.assertRaises(TypeError, oct, ())
1247
1248 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001249 fp = open(TESTFN, 'w')
1250 try:
1251 fp.write('1+1\n')
1252 fp.write('1+1\n')
1253 fp.write('The quick brown fox jumps over the lazy dog')
1254 fp.write('.\n')
1255 fp.write('Dear John\n')
1256 fp.write('XXX'*100)
1257 fp.write('YYY'*100)
1258 finally:
1259 fp.close()
1260
1261 def test_open(self):
1262 self.write_testfile()
1263 fp = open(TESTFN, 'r')
1264 try:
1265 self.assertEqual(fp.readline(4), '1+1\n')
1266 self.assertEqual(fp.readline(4), '1+1\n')
1267 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1268 self.assertEqual(fp.readline(4), 'Dear')
1269 self.assertEqual(fp.readline(100), ' John\n')
1270 self.assertEqual(fp.read(300), 'XXX'*100)
1271 self.assertEqual(fp.read(1000), 'YYY'*100)
1272 finally:
1273 fp.close()
1274 unlink(TESTFN)
1275
1276 def test_ord(self):
1277 self.assertEqual(ord(' '), 32)
1278 self.assertEqual(ord('A'), 65)
1279 self.assertEqual(ord('a'), 97)
1280 if have_unicode:
1281 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1282 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001283 if have_unicode:
1284 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001285
1286 def test_pow(self):
1287 self.assertEqual(pow(0,0), 1)
1288 self.assertEqual(pow(0,1), 0)
1289 self.assertEqual(pow(1,0), 1)
1290 self.assertEqual(pow(1,1), 1)
1291
1292 self.assertEqual(pow(2,0), 1)
1293 self.assertEqual(pow(2,10), 1024)
1294 self.assertEqual(pow(2,20), 1024*1024)
1295 self.assertEqual(pow(2,30), 1024*1024*1024)
1296
1297 self.assertEqual(pow(-2,0), 1)
1298 self.assertEqual(pow(-2,1), -2)
1299 self.assertEqual(pow(-2,2), 4)
1300 self.assertEqual(pow(-2,3), -8)
1301
1302 self.assertEqual(pow(0L,0), 1)
1303 self.assertEqual(pow(0L,1), 0)
1304 self.assertEqual(pow(1L,0), 1)
1305 self.assertEqual(pow(1L,1), 1)
1306
1307 self.assertEqual(pow(2L,0), 1)
1308 self.assertEqual(pow(2L,10), 1024)
1309 self.assertEqual(pow(2L,20), 1024*1024)
1310 self.assertEqual(pow(2L,30), 1024*1024*1024)
1311
1312 self.assertEqual(pow(-2L,0), 1)
1313 self.assertEqual(pow(-2L,1), -2)
1314 self.assertEqual(pow(-2L,2), 4)
1315 self.assertEqual(pow(-2L,3), -8)
1316
1317 self.assertAlmostEqual(pow(0.,0), 1.)
1318 self.assertAlmostEqual(pow(0.,1), 0.)
1319 self.assertAlmostEqual(pow(1.,0), 1.)
1320 self.assertAlmostEqual(pow(1.,1), 1.)
1321
1322 self.assertAlmostEqual(pow(2.,0), 1.)
1323 self.assertAlmostEqual(pow(2.,10), 1024.)
1324 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1325 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1326
1327 self.assertAlmostEqual(pow(-2.,0), 1.)
1328 self.assertAlmostEqual(pow(-2.,1), -2.)
1329 self.assertAlmostEqual(pow(-2.,2), 4.)
1330 self.assertAlmostEqual(pow(-2.,3), -8.)
1331
1332 for x in 2, 2L, 2.0:
1333 for y in 10, 10L, 10.0:
1334 for z in 1000, 1000L, 1000.0:
1335 if isinstance(x, float) or \
1336 isinstance(y, float) or \
1337 isinstance(z, float):
1338 self.assertRaises(TypeError, pow, x, y, z)
1339 else:
1340 self.assertAlmostEqual(pow(x, y, z), 24.0)
1341
1342 self.assertRaises(TypeError, pow, -1, -2, 3)
1343 self.assertRaises(ValueError, pow, 1, 2, 0)
1344 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1345 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1346 self.assertRaises(ValueError, pow, -342.43, 0.234)
1347
1348 self.assertRaises(TypeError, pow)
1349
1350 def test_range(self):
1351 self.assertEqual(range(3), [0, 1, 2])
1352 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1353 self.assertEqual(range(0), [])
1354 self.assertEqual(range(-3), [])
1355 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1356 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1357
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001358 # Now test range() with longs
1359 self.assertEqual(range(-2**100), [])
1360 self.assertEqual(range(0, -2**100), [])
1361 self.assertEqual(range(0, 2**100, -1), [])
1362 self.assertEqual(range(0, 2**100, -1), [])
1363
1364 a = long(10 * sys.maxint)
1365 b = long(100 * sys.maxint)
1366 c = long(50 * sys.maxint)
1367
1368 self.assertEqual(range(a, a+2), [a, a+1])
1369 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1370 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1371
1372 seq = range(a, b, c)
1373 self.assert_(a in seq)
1374 self.assert_(b not in seq)
1375 self.assertEqual(len(seq), 2)
1376
1377 seq = range(b, a, -c)
1378 self.assert_(b in seq)
1379 self.assert_(a not in seq)
1380 self.assertEqual(len(seq), 2)
1381
1382 seq = range(-a, -b, -c)
1383 self.assert_(-a in seq)
1384 self.assert_(-b not in seq)
1385 self.assertEqual(len(seq), 2)
1386
Walter Dörwald919497e2003-01-19 16:23:59 +00001387 self.assertRaises(TypeError, range)
1388 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1389 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001390 self.assertRaises(ValueError, range, a, a + 1, long(0))
1391
1392 class badzero(int):
1393 def __cmp__(self, other):
1394 raise RuntimeError
1395 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001396
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001397 # Reject floats when it would require PyLongs to represent.
1398 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001399 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001400
Walter Dörwald357981e2003-04-15 18:59:28 +00001401 self.assertRaises(TypeError, range, 0, "spam")
1402 self.assertRaises(TypeError, range, 0, 42, "spam")
1403
1404 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1405 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1406
Walter Dörwald919497e2003-01-19 16:23:59 +00001407 def test_reduce(self):
1408 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1409 self.assertEqual(
1410 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1411 ['a','c','d','w']
1412 )
1413 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1414 self.assertEqual(
1415 reduce(lambda x, y: x*y, range(2,21), 1L),
1416 2432902008176640000L
1417 )
1418 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1419 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1420 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1421 self.assertRaises(TypeError, reduce)
1422 self.assertRaises(TypeError, reduce, 42, 42)
1423 self.assertRaises(TypeError, reduce, 42, 42, 42)
1424 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1425 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1426 self.assertRaises(TypeError, reduce, 42, (42, 42))
1427
1428 class BadSeq:
1429 def __getitem__(self, index):
1430 raise ValueError
1431 self.assertRaises(ValueError, reduce, 42, BadSeq())
1432
1433 def test_reload(self):
1434 import marshal
1435 reload(marshal)
1436 import string
1437 reload(string)
1438 ## import sys
1439 ## self.assertRaises(ImportError, reload, sys)
1440
1441 def test_repr(self):
1442 self.assertEqual(repr(''), '\'\'')
1443 self.assertEqual(repr(0), '0')
1444 self.assertEqual(repr(0L), '0L')
1445 self.assertEqual(repr(()), '()')
1446 self.assertEqual(repr([]), '[]')
1447 self.assertEqual(repr({}), '{}')
1448 a = []
1449 a.append(a)
1450 self.assertEqual(repr(a), '[[...]]')
1451 a = {}
1452 a[0] = a
1453 self.assertEqual(repr(a), '{0: {...}}')
1454
1455 def test_round(self):
1456 self.assertEqual(round(0.0), 0.0)
1457 self.assertEqual(round(1.0), 1.0)
1458 self.assertEqual(round(10.0), 10.0)
1459 self.assertEqual(round(1000000000.0), 1000000000.0)
1460 self.assertEqual(round(1e20), 1e20)
1461
1462 self.assertEqual(round(-1.0), -1.0)
1463 self.assertEqual(round(-10.0), -10.0)
1464 self.assertEqual(round(-1000000000.0), -1000000000.0)
1465 self.assertEqual(round(-1e20), -1e20)
1466
1467 self.assertEqual(round(0.1), 0.0)
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(-1.1), -1.0)
1473 self.assertEqual(round(-10.1), -10.0)
1474 self.assertEqual(round(-1000000000.1), -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(-0.9), -1.0)
1481 self.assertEqual(round(-9.9), -10.0)
1482 self.assertEqual(round(-999999999.9), -1000000000.0)
1483
1484 self.assertEqual(round(-8.0, -1), -10.0)
1485
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486 # test new kwargs
1487 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1488
Walter Dörwald919497e2003-01-19 16:23:59 +00001489 self.assertRaises(TypeError, round)
1490
1491 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001492 setattr(sys, 'spam', 1)
1493 self.assertEqual(sys.spam, 1)
1494 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1495 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001496
1497 def test_str(self):
1498 self.assertEqual(str(''), '')
1499 self.assertEqual(str(0), '0')
1500 self.assertEqual(str(0L), '0')
1501 self.assertEqual(str(()), '()')
1502 self.assertEqual(str([]), '[]')
1503 self.assertEqual(str({}), '{}')
1504 a = []
1505 a.append(a)
1506 self.assertEqual(str(a), '[[...]]')
1507 a = {}
1508 a[0] = a
1509 self.assertEqual(str(a), '{0: {...}}')
1510
Alex Martellia70b1912003-04-22 08:12:33 +00001511 def test_sum(self):
1512 self.assertEqual(sum([]), 0)
1513 self.assertEqual(sum(range(2,8)), 27)
1514 self.assertEqual(sum(iter(range(2,8))), 27)
1515 self.assertEqual(sum(Squares(10)), 285)
1516 self.assertEqual(sum(iter(Squares(10))), 285)
1517 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1518
1519 self.assertRaises(TypeError, sum)
1520 self.assertRaises(TypeError, sum, 42)
1521 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1522 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1523 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1524 self.assertRaises(TypeError, sum, [{2:3}])
1525 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1526
1527 class BadSeq:
1528 def __getitem__(self, index):
1529 raise ValueError
1530 self.assertRaises(ValueError, sum, BadSeq())
1531
Walter Dörwald919497e2003-01-19 16:23:59 +00001532 def test_tuple(self):
1533 self.assertEqual(tuple(()), ())
1534 t0_3 = (0, 1, 2, 3)
1535 t0_3_bis = tuple(t0_3)
1536 self.assert_(t0_3 is t0_3_bis)
1537 self.assertEqual(tuple([]), ())
1538 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1539 self.assertEqual(tuple(''), ())
1540 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1541
1542 def test_type(self):
1543 self.assertEqual(type(''), type('123'))
1544 self.assertNotEqual(type(''), type(()))
1545
1546 def test_unichr(self):
1547 if have_unicode:
1548 self.assertEqual(unichr(32), unicode(' '))
1549 self.assertEqual(unichr(65), unicode('A'))
1550 self.assertEqual(unichr(97), unicode('a'))
1551 self.assertEqual(
1552 unichr(sys.maxunicode),
1553 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1554 )
1555 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1556 self.assertRaises(TypeError, unichr)
1557
Guido van Rossumfee7b932005-01-16 00:21:28 +00001558 # We don't want self in vars(), so these are static methods
1559
1560 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001561 def get_vars_f0():
1562 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001563
Guido van Rossumfee7b932005-01-16 00:21:28 +00001564 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001565 def get_vars_f2():
1566 BuiltinTest.get_vars_f0()
1567 a = 1
1568 b = 2
1569 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001570
1571 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001572 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001573 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001574 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001575 self.assertEqual(self.get_vars_f0(), {})
1576 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1577 self.assertRaises(TypeError, vars, 42, 42)
1578 self.assertRaises(TypeError, vars, 42)
1579
1580 def test_zip(self):
1581 a = (1, 2, 3)
1582 b = (4, 5, 6)
1583 t = [(1, 4), (2, 5), (3, 6)]
1584 self.assertEqual(zip(a, b), t)
1585 b = [4, 5, 6]
1586 self.assertEqual(zip(a, b), t)
1587 b = (4, 5, 6, 7)
1588 self.assertEqual(zip(a, b), t)
1589 class I:
1590 def __getitem__(self, i):
1591 if i < 0 or i > 2: raise IndexError
1592 return i + 4
1593 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001594 self.assertEqual(zip(), [])
1595 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001596 self.assertRaises(TypeError, zip, None)
1597 class G:
1598 pass
1599 self.assertRaises(TypeError, zip, a, G())
1600
1601 # Make sure zip doesn't try to allocate a billion elements for the
1602 # result list when one of its arguments doesn't say how long it is.
1603 # A MemoryError is the most likely failure mode.
1604 class SequenceWithoutALength:
1605 def __getitem__(self, i):
1606 if i == 5:
1607 raise IndexError
1608 else:
1609 return i
1610 self.assertEqual(
1611 zip(SequenceWithoutALength(), xrange(2**30)),
1612 list(enumerate(range(5)))
1613 )
1614
1615 class BadSeq:
1616 def __getitem__(self, i):
1617 if i == 5:
1618 raise ValueError
1619 else:
1620 return i
1621 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1622
Raymond Hettinger64958a12003-12-17 20:43:33 +00001623class TestSorted(unittest.TestCase):
1624
1625 def test_basic(self):
1626 data = range(100)
1627 copy = data[:]
1628 random.shuffle(copy)
1629 self.assertEqual(data, sorted(copy))
1630 self.assertNotEqual(data, copy)
1631
1632 data.reverse()
1633 random.shuffle(copy)
1634 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1635 self.assertNotEqual(data, copy)
1636 random.shuffle(copy)
1637 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1638 self.assertNotEqual(data, copy)
1639 random.shuffle(copy)
1640 self.assertEqual(data, sorted(copy, reverse=1))
1641 self.assertNotEqual(data, copy)
1642
1643 def test_inputtypes(self):
1644 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001645 types = [list, tuple]
1646 if have_unicode:
1647 types.insert(0, unicode)
1648 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001649 self.assertEqual(sorted(s), sorted(T(s)))
1650
1651 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001652 types = [set, frozenset, list, tuple, dict.fromkeys]
1653 if have_unicode:
1654 types.insert(0, unicode)
1655 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001656 self.assertEqual(sorted(s), sorted(T(s)))
1657
1658 def test_baddecorator(self):
1659 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1660 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1661
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001662def test_main(verbose=None):
1663 test_classes = (BuiltinTest, TestSorted)
1664
1665 run_unittest(*test_classes)
1666
1667 # verify reference counting
1668 if verbose and hasattr(sys, "gettotalrefcount"):
1669 import gc
1670 counts = [None] * 5
1671 for i in xrange(len(counts)):
1672 run_unittest(*test_classes)
1673 gc.collect()
1674 counts[i] = sys.gettotalrefcount()
1675 print counts
1676
Walter Dörwald919497e2003-01-19 16:23:59 +00001677
1678if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001679 test_main(verbose=True)