blob: d2f70ff14329d9c00f384627adaefb0c0610dba1 [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:
Jack Diederich4dafcc42006-11-28 19:15:13 +000097 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000098 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)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000119 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000120 # float
121 self.assertEqual(abs(0.0), 0.0)
122 self.assertEqual(abs(3.14), 3.14)
123 self.assertEqual(abs(-3.14), 3.14)
124 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000125 self.assertEqual(abs(0), 0)
126 self.assertEqual(abs(1234), 1234)
127 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000128 # str
129 self.assertRaises(TypeError, abs, 'a')
130
Raymond Hettinger96229b12005-03-11 06:49:40 +0000131 def test_all(self):
132 self.assertEqual(all([2, 4, 6]), True)
133 self.assertEqual(all([2, None, 6]), False)
134 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
135 self.assertRaises(RuntimeError, all, TestFailingIter())
136 self.assertRaises(TypeError, all, 10) # Non-iterable
137 self.assertRaises(TypeError, all) # No args
138 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
139 self.assertEqual(all([]), True) # Empty iterator
140 S = [50, 60]
141 self.assertEqual(all(x > 42 for x in S), True)
142 S = [50, 40, 60]
143 self.assertEqual(all(x > 42 for x in S), False)
144
145 def test_any(self):
146 self.assertEqual(any([None, None, None]), False)
147 self.assertEqual(any([None, 4, None]), True)
148 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
149 self.assertRaises(RuntimeError, all, TestFailingIter())
150 self.assertRaises(TypeError, any, 10) # Non-iterable
151 self.assertRaises(TypeError, any) # No args
152 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
153 self.assertEqual(any([]), False) # Empty iterator
154 S = [40, 60, 30]
155 self.assertEqual(any(x > 42 for x in S), True)
156 S = [10, 20, 30]
157 self.assertEqual(any(x > 42 for x in S), False)
158
Thomas Wouters89f507f2006-12-13 04:49:30 +0000159 def test_neg(self):
160 x = -sys.maxint-1
161 self.assert_(isinstance(x, int))
162 self.assertEqual(-x, sys.maxint+1)
163
Walter Dörwald919497e2003-01-19 16:23:59 +0000164 def test_callable(self):
165 self.assert_(callable(len))
166 def f(): pass
167 self.assert_(callable(f))
168 class C:
169 def meth(self): pass
170 self.assert_(callable(C))
171 x = C()
172 self.assert_(callable(x.meth))
173 self.assert_(not callable(x))
174 class D(C):
175 def __call__(self): pass
176 y = D()
177 self.assert_(callable(y))
178 y()
179
180 def test_chr(self):
181 self.assertEqual(chr(32), ' ')
182 self.assertEqual(chr(65), 'A')
183 self.assertEqual(chr(97), 'a')
184 self.assertEqual(chr(0xff), '\xff')
185 self.assertRaises(ValueError, chr, 256)
186 self.assertRaises(TypeError, chr)
187
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000188 def XXX_test_cmp(self):
189 # cmp() is no longer supported
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 self.assertEqual(cmp(-1, 1), -1)
191 self.assertEqual(cmp(1, -1), 1)
192 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000193 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000194 a = []; a.append(a)
195 b = []; b.append(b)
196 from UserList import UserList
197 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000198 self.assertRaises(RuntimeError, cmp, a, b)
199 self.assertRaises(RuntimeError, cmp, b, c)
200 self.assertRaises(RuntimeError, cmp, c, a)
201 self.assertRaises(RuntimeError, cmp, a, c)
202 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 a.pop(); b.pop(); c.pop()
204 self.assertRaises(TypeError, cmp)
205
Walter Dörwald919497e2003-01-19 16:23:59 +0000206 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000207 compile('print(1)\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000208 bom = '\xef\xbb\xbf'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000209 compile(bom + 'print(1)\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000210 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000211 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
212 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000213 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000214 if have_unicode:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000215 compile(unicode('print(u"\xc3\xa5")\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000216 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
217 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000218
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 def test_delattr(self):
220 import sys
221 sys.spam = 1
222 delattr(sys, 'spam')
223 self.assertRaises(TypeError, delattr)
224
225 def test_dir(self):
226 x = 1
227 self.assert_('x' in dir())
228 import sys
229 self.assert_('modules' in dir(sys))
230 self.assertRaises(TypeError, dir, 42, 42)
231
232 def test_divmod(self):
233 self.assertEqual(divmod(12, 7), (1, 5))
234 self.assertEqual(divmod(-12, 7), (-2, 2))
235 self.assertEqual(divmod(12, -7), (-2, -2))
236 self.assertEqual(divmod(-12, -7), (1, -5))
237
Guido van Rossume2a383d2007-01-15 16:59:06 +0000238 self.assertEqual(divmod(12, 7), (1, 5))
239 self.assertEqual(divmod(-12, 7), (-2, 2))
240 self.assertEqual(divmod(12, -7), (-2, -2))
241 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000242
Guido van Rossume2a383d2007-01-15 16:59:06 +0000243 self.assertEqual(divmod(12, 7), (1, 5))
244 self.assertEqual(divmod(-12, 7), (-2, 2))
245 self.assertEqual(divmod(12, -7), (-2, -2))
246 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000247
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000248 self.assertEqual(divmod(-sys.maxint-1, -1),
249 (sys.maxint+1, 0))
250
Walter Dörwald919497e2003-01-19 16:23:59 +0000251 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
252 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
253 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
254 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
255
256 self.assertRaises(TypeError, divmod)
257
258 def test_eval(self):
259 self.assertEqual(eval('1+1'), 2)
260 self.assertEqual(eval(' 1+1\n'), 2)
261 globals = {'a': 1, 'b': 2}
262 locals = {'b': 200, 'c': 300}
263 self.assertEqual(eval('a', globals) , 1)
264 self.assertEqual(eval('a', globals, locals), 1)
265 self.assertEqual(eval('b', globals, locals), 200)
266 self.assertEqual(eval('c', globals, locals), 300)
267 if have_unicode:
268 self.assertEqual(eval(unicode('1+1')), 2)
269 self.assertEqual(eval(unicode(' 1+1\n')), 2)
270 globals = {'a': 1, 'b': 2}
271 locals = {'b': 200, 'c': 300}
272 if have_unicode:
273 self.assertEqual(eval(unicode('a'), globals), 1)
274 self.assertEqual(eval(unicode('a'), globals, locals), 1)
275 self.assertEqual(eval(unicode('b'), globals, locals), 200)
276 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000277 bom = '\xef\xbb\xbf'
278 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000279 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
280 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000281 self.assertRaises(TypeError, eval)
282 self.assertRaises(TypeError, eval, ())
283
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000284 def test_general_eval(self):
285 # Tests that general mappings can be used for the locals argument
286
287 class M:
288 "Test mapping interface versus possible calls from eval()."
289 def __getitem__(self, key):
290 if key == 'a':
291 return 12
292 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000293 def keys(self):
294 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000295
296 m = M()
297 g = globals()
298 self.assertEqual(eval('a', g, m), 12)
299 self.assertRaises(NameError, eval, 'b', g, m)
300 self.assertEqual(eval('dir()', g, m), list('xyz'))
301 self.assertEqual(eval('globals()', g, m), g)
302 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000303 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000304 class A:
305 "Non-mapping"
306 pass
307 m = A()
308 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000309
310 # Verify that dict subclasses work as well
311 class D(dict):
312 def __getitem__(self, key):
313 if key == 'a':
314 return 12
315 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000316 def keys(self):
317 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000318
319 d = D()
320 self.assertEqual(eval('a', g, d), 12)
321 self.assertRaises(NameError, eval, 'b', g, d)
322 self.assertEqual(eval('dir()', g, d), list('xyz'))
323 self.assertEqual(eval('globals()', g, d), g)
324 self.assertEqual(eval('locals()', g, d), d)
325
326 # Verify locals stores (used by list comps)
327 eval('[locals() for i in (2,3)]', g, d)
328 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
329
330 class SpreadSheet:
331 "Sample application showing nested, calculated lookups."
332 _cells = {}
333 def __setitem__(self, key, formula):
334 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000335 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000336 return eval(self._cells[key], globals(), self)
337
338 ss = SpreadSheet()
339 ss['a1'] = '5'
340 ss['a2'] = 'a1*6'
341 ss['a3'] = 'a2*7'
342 self.assertEqual(ss['a3'], 210)
343
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000344 # Verify that dir() catches a non-list returned by eval
345 # SF bug #1004669
346 class C:
347 def __getitem__(self, item):
348 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000349 def keys(self):
350 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000351 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
352
Walter Dörwald919497e2003-01-19 16:23:59 +0000353 # Done outside of the method test_z to get the correct scope
354 z = 0
355 f = open(TESTFN, 'w')
356 f.write('z = z+1\n')
357 f.write('z = z*2\n')
358 f.close()
359 execfile(TESTFN)
360
361 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000362 global numruns
363 if numruns:
364 return
365 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000366
Walter Dörwald919497e2003-01-19 16:23:59 +0000367 globals = {'a': 1, 'b': 2}
368 locals = {'b': 200, 'c': 300}
369
370 self.assertEqual(self.__class__.z, 2)
371 globals['z'] = 0
372 execfile(TESTFN, globals)
373 self.assertEqual(globals['z'], 2)
374 locals['z'] = 0
375 execfile(TESTFN, globals, locals)
376 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000377
378 class M:
379 "Test mapping interface versus possible calls from execfile()."
380 def __init__(self):
381 self.z = 10
382 def __getitem__(self, key):
383 if key == 'z':
384 return self.z
385 raise KeyError
386 def __setitem__(self, key, value):
387 if key == 'z':
388 self.z = value
389 return
390 raise KeyError
391
392 locals = M()
393 locals['z'] = 0
394 execfile(TESTFN, globals, locals)
395 self.assertEqual(locals['z'], 2)
396
Walter Dörwald919497e2003-01-19 16:23:59 +0000397 unlink(TESTFN)
398 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000399 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000400 import os
401 self.assertRaises(IOError, execfile, os.curdir)
402 self.assertRaises(IOError, execfile, "I_dont_exist")
403
Georg Brandl7cae87c2006-09-06 06:51:57 +0000404 def test_exec(self):
405 g = {}
406 exec('z = 1', g)
407 if '__builtins__' in g:
408 del g['__builtins__']
409 self.assertEqual(g, {'z': 1})
410
411 exec(u'z = 1+1', g)
412 if '__builtins__' in g:
413 del g['__builtins__']
414 self.assertEqual(g, {'z': 2})
415 g = {}
416 l = {}
417
418 import warnings
419 warnings.filterwarnings("ignore", "global statement", module="<string>")
420 exec('global a; a = 1; b = 2', g, l)
421 if '__builtins__' in g:
422 del g['__builtins__']
423 if '__builtins__' in l:
424 del l['__builtins__']
425 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
426
Walter Dörwald919497e2003-01-19 16:23:59 +0000427 def test_filter(self):
428 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
429 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
430 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
431 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
432 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
433 def identity(item):
434 return 1
435 filter(identity, Squares(5))
436 self.assertRaises(TypeError, filter)
437 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000438 def __getitem__(self, index):
439 if index<4:
440 return 42
441 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000442 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
443 def badfunc():
444 pass
445 self.assertRaises(TypeError, filter, badfunc, range(5))
446
Walter Dörwaldbf517072003-01-27 15:57:14 +0000447 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000448 self.assertEqual(filter(None, (1, 2)), (1, 2))
449 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
450 self.assertRaises(TypeError, filter, 42, (1, 2))
451
Walter Dörwaldbf517072003-01-27 15:57:14 +0000452 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 self.assertEqual(filter(None, "12"), "12")
454 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
455 self.assertRaises(TypeError, filter, 42, "12")
456 class badstr(str):
457 def __getitem__(self, index):
458 raise ValueError
459 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000460
Walter Dörwald903f1e02003-02-04 16:28:00 +0000461 class badstr2(str):
462 def __getitem__(self, index):
463 return 42
464 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
465
466 class weirdstr(str):
467 def __getitem__(self, index):
468 return weirdstr(2*str.__getitem__(self, index))
469 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
470
Walter Dörwald5e61e242003-02-04 17:04:01 +0000471 class shiftstr(str):
472 def __getitem__(self, index):
473 return chr(ord(str.__getitem__(self, index))+1)
474 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
475
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000476 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000477 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000478 self.assertEqual(filter(None, unicode("12")), unicode("12"))
479 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
480 self.assertRaises(TypeError, filter, 42, unicode("12"))
481 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000482
Walter Dörwald903f1e02003-02-04 16:28:00 +0000483 class badunicode(unicode):
484 def __getitem__(self, index):
485 return 42
486 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
487
488 class weirdunicode(unicode):
489 def __getitem__(self, index):
490 return weirdunicode(2*unicode.__getitem__(self, index))
491 self.assertEqual(
492 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
493
Walter Dörwald5e61e242003-02-04 17:04:01 +0000494 class shiftunicode(unicode):
495 def __getitem__(self, index):
496 return unichr(ord(unicode.__getitem__(self, index))+1)
497 self.assertEqual(
498 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
499 unicode("345")
500 )
501
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000502 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000503 # test that filter() never returns tuple, str or unicode subclasses
504 # and that the result always goes through __getitem__
505 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000506 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000507 def __getitem__(self, index):
508 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000509 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000510 def __getitem__(self, index):
511 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000512 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000513 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000514 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000515 }
516 if have_unicode:
517 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000518 def __getitem__(self, index):
519 return 2*unicode.__getitem__(self, index)
520 inputs[unicode2] = {
521 unicode(): unicode(),
522 unicode("123"): unicode("112233")
523 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000524
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000525 for (cls, inps) in inputs.items():
526 for (inp, exp) in inps.items():
Tim Petersf2715e02003-02-19 02:35:07 +0000527 # make sure the output goes through __getitem__
528 # even if func is None
529 self.assertEqual(
530 filter(funcs[0], cls(inp)),
531 filter(funcs[1], cls(inp))
532 )
533 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000534 outp = filter(func, cls(inp))
535 self.assertEqual(outp, exp)
536 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000537
Walter Dörwald919497e2003-01-19 16:23:59 +0000538 def test_float(self):
539 self.assertEqual(float(3.14), 3.14)
540 self.assertEqual(float(314), 314.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000541 self.assertEqual(float(314), 314.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000542 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000543 self.assertRaises(ValueError, float, " 0x3.1 ")
544 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000545 if have_unicode:
546 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
547 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000548 # Implementation limitation in PyFloat_FromString()
549 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000550
Thomas Wouters477c8d52006-05-27 19:21:47 +0000551 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000552 def test_float_with_comma(self):
553 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000554 # float must not accept the locale specific decimal point but
555 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000556 import locale
557 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000558 return
559
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000560 self.assertEqual(float(" 3.14 "), 3.14)
561 self.assertEqual(float("+3.14 "), 3.14)
562 self.assertEqual(float("-3.14 "), -3.14)
563 self.assertEqual(float(".14 "), .14)
564 self.assertEqual(float("3. "), 3.0)
565 self.assertEqual(float("3.e3 "), 3000.0)
566 self.assertEqual(float("3.2e3 "), 3200.0)
567 self.assertEqual(float("2.5e-1 "), 0.25)
568 self.assertEqual(float("5e-1"), 0.5)
569 self.assertRaises(ValueError, float, " 3,14 ")
570 self.assertRaises(ValueError, float, " +3,14 ")
571 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000572 self.assertRaises(ValueError, float, " 0x3.1 ")
573 self.assertRaises(ValueError, float, " -0x3.p-1 ")
574 self.assertEqual(float(" 25.e-1 "), 2.5)
575 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000576
Brett Cannonc3647ac2005-04-26 03:45:26 +0000577 def test_floatconversion(self):
578 # Make sure that calls to __float__() work properly
579 class Foo0:
580 def __float__(self):
581 return 42.
582
583 class Foo1(object):
584 def __float__(self):
585 return 42.
586
587 class Foo2(float):
588 def __float__(self):
589 return 42.
590
591 class Foo3(float):
592 def __new__(cls, value=0.):
593 return float.__new__(cls, 2*value)
594
595 def __float__(self):
596 return self
597
598 class Foo4(float):
599 def __float__(self):
600 return 42
601
602 self.assertAlmostEqual(float(Foo0()), 42.)
603 self.assertAlmostEqual(float(Foo1()), 42.)
604 self.assertAlmostEqual(float(Foo2()), 42.)
605 self.assertAlmostEqual(float(Foo3(21)), 42.)
606 self.assertRaises(TypeError, float, Foo4(42))
607
Walter Dörwald919497e2003-01-19 16:23:59 +0000608 def test_getattr(self):
609 import sys
610 self.assert_(getattr(sys, 'stdout') is sys.stdout)
611 self.assertRaises(TypeError, getattr, sys, 1)
612 self.assertRaises(TypeError, getattr, sys, 1, "foo")
613 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000614 if have_unicode:
615 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000616
617 def test_hasattr(self):
618 import sys
619 self.assert_(hasattr(sys, 'stdout'))
620 self.assertRaises(TypeError, hasattr, sys, 1)
621 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000622 if have_unicode:
623 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000624
625 def test_hash(self):
626 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000627 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000628 self.assertEqual(hash(1), hash(1.0))
629 hash('spam')
630 if have_unicode:
631 self.assertEqual(hash('spam'), hash(unicode('spam')))
632 hash((0,1,2,3))
633 def f(): pass
634 self.assertRaises(TypeError, hash, [])
635 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000636 # Bug 1536021: Allow hash to return long objects
637 class X:
638 def __hash__(self):
639 return 2**100
640 self.assertEquals(type(hash(X())), int)
641 class Y(object):
642 def __hash__(self):
643 return 2**100
644 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000645 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000646 def __hash__(self):
647 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000648 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000649
650 def test_hex(self):
651 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000652 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000653 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000654 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 self.assertRaises(TypeError, hex, {})
656
657 def test_id(self):
658 id(None)
659 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000660 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000661 id(1.0)
662 id('spam')
663 id((0,1,2,3))
664 id([0,1,2,3])
665 id({'spam': 1, 'eggs': 2, 'ham': 3})
666
Guido van Rossuma88a0332007-02-26 16:59:55 +0000667 # Test input() later, alphabetized as if it were raw_input
668
Walter Dörwald919497e2003-01-19 16:23:59 +0000669 def test_int(self):
670 self.assertEqual(int(314), 314)
671 self.assertEqual(int(3.14), 3)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000672 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000673 # Check that conversion from float truncates towards zero
674 self.assertEqual(int(-3.14), -3)
675 self.assertEqual(int(3.9), 3)
676 self.assertEqual(int(-3.9), -3)
677 self.assertEqual(int(3.5), 3)
678 self.assertEqual(int(-3.5), -3)
679 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000680 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000682 self.assertEqual(int(unicode("10"),16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000683 # Test conversion from strings and various anomalies
684 for s, v in L:
685 for sign in "", "+", "-":
686 for prefix in "", " ", "\t", " \t\t ":
687 ss = prefix + sign + s
688 vv = v
689 if sign == "-" and v is not ValueError:
690 vv = -v
691 try:
692 self.assertEqual(int(ss), vv)
693 except v:
694 pass
695
Walter Dörwald70a6b492004-02-12 17:35:32 +0000696 s = repr(-1-sys.maxint)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000697 x = int(s)
698 self.assertEqual(x+1, -sys.maxint)
699 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000700 # should return long
Thomas Wouters89f507f2006-12-13 04:49:30 +0000701 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000702
703 # should return long
704 x = int(1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000705 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000706 x = int(-1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000707 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000708
709
710 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
711 # Worked by accident in Windows release build, but failed in debug build.
712 # Failed in all Linux builds.
713 x = -1-sys.maxint
714 self.assertEqual(x >> 1, x//2)
715
716 self.assertRaises(ValueError, int, '123\0')
717 self.assertRaises(ValueError, int, '53', 40)
718
Thomas Wouters89f507f2006-12-13 04:49:30 +0000719 # SF bug 1545497: embedded NULs were not detected with
720 # explicit base
721 self.assertRaises(ValueError, int, '123\0', 10)
722 self.assertRaises(ValueError, int, '123\x00 245', 20)
723
Walter Dörwald919497e2003-01-19 16:23:59 +0000724 x = int('1' * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000725 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000726
727 if have_unicode:
728 x = int(unichr(0x661) * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000729 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000730
731 self.assertRaises(TypeError, int, 1, 12)
732
733 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000734 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000735
Thomas Wouters477c8d52006-05-27 19:21:47 +0000736 # SF bug 1334662: int(string, base) wrong answers
737 # Various representations of 2**32 evaluated to 0
738 # rather than 2**32 in previous versions
739
Guido van Rossume2a383d2007-01-15 16:59:06 +0000740 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
741 self.assertEqual(int('102002022201221111211', 3), 4294967296)
742 self.assertEqual(int('10000000000000000', 4), 4294967296)
743 self.assertEqual(int('32244002423141', 5), 4294967296)
744 self.assertEqual(int('1550104015504', 6), 4294967296)
745 self.assertEqual(int('211301422354', 7), 4294967296)
746 self.assertEqual(int('40000000000', 8), 4294967296)
747 self.assertEqual(int('12068657454', 9), 4294967296)
748 self.assertEqual(int('4294967296', 10), 4294967296)
749 self.assertEqual(int('1904440554', 11), 4294967296)
750 self.assertEqual(int('9ba461594', 12), 4294967296)
751 self.assertEqual(int('535a79889', 13), 4294967296)
752 self.assertEqual(int('2ca5b7464', 14), 4294967296)
753 self.assertEqual(int('1a20dcd81', 15), 4294967296)
754 self.assertEqual(int('100000000', 16), 4294967296)
755 self.assertEqual(int('a7ffda91', 17), 4294967296)
756 self.assertEqual(int('704he7g4', 18), 4294967296)
757 self.assertEqual(int('4f5aff66', 19), 4294967296)
758 self.assertEqual(int('3723ai4g', 20), 4294967296)
759 self.assertEqual(int('281d55i4', 21), 4294967296)
760 self.assertEqual(int('1fj8b184', 22), 4294967296)
761 self.assertEqual(int('1606k7ic', 23), 4294967296)
762 self.assertEqual(int('mb994ag', 24), 4294967296)
763 self.assertEqual(int('hek2mgl', 25), 4294967296)
764 self.assertEqual(int('dnchbnm', 26), 4294967296)
765 self.assertEqual(int('b28jpdm', 27), 4294967296)
766 self.assertEqual(int('8pfgih4', 28), 4294967296)
767 self.assertEqual(int('76beigg', 29), 4294967296)
768 self.assertEqual(int('5qmcpqg', 30), 4294967296)
769 self.assertEqual(int('4q0jto4', 31), 4294967296)
770 self.assertEqual(int('4000000', 32), 4294967296)
771 self.assertEqual(int('3aokq94', 33), 4294967296)
772 self.assertEqual(int('2qhxjli', 34), 4294967296)
773 self.assertEqual(int('2br45qb', 35), 4294967296)
774 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000775
776 # SF bug 1334662: int(string, base) wrong answers
777 # Checks for proper evaluation of 2**32 + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000778 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
779 self.assertEqual(int('102002022201221111212', 3), 4294967297)
780 self.assertEqual(int('10000000000000001', 4), 4294967297)
781 self.assertEqual(int('32244002423142', 5), 4294967297)
782 self.assertEqual(int('1550104015505', 6), 4294967297)
783 self.assertEqual(int('211301422355', 7), 4294967297)
784 self.assertEqual(int('40000000001', 8), 4294967297)
785 self.assertEqual(int('12068657455', 9), 4294967297)
786 self.assertEqual(int('4294967297', 10), 4294967297)
787 self.assertEqual(int('1904440555', 11), 4294967297)
788 self.assertEqual(int('9ba461595', 12), 4294967297)
789 self.assertEqual(int('535a7988a', 13), 4294967297)
790 self.assertEqual(int('2ca5b7465', 14), 4294967297)
791 self.assertEqual(int('1a20dcd82', 15), 4294967297)
792 self.assertEqual(int('100000001', 16), 4294967297)
793 self.assertEqual(int('a7ffda92', 17), 4294967297)
794 self.assertEqual(int('704he7g5', 18), 4294967297)
795 self.assertEqual(int('4f5aff67', 19), 4294967297)
796 self.assertEqual(int('3723ai4h', 20), 4294967297)
797 self.assertEqual(int('281d55i5', 21), 4294967297)
798 self.assertEqual(int('1fj8b185', 22), 4294967297)
799 self.assertEqual(int('1606k7id', 23), 4294967297)
800 self.assertEqual(int('mb994ah', 24), 4294967297)
801 self.assertEqual(int('hek2mgm', 25), 4294967297)
802 self.assertEqual(int('dnchbnn', 26), 4294967297)
803 self.assertEqual(int('b28jpdn', 27), 4294967297)
804 self.assertEqual(int('8pfgih5', 28), 4294967297)
805 self.assertEqual(int('76beigh', 29), 4294967297)
806 self.assertEqual(int('5qmcpqh', 30), 4294967297)
807 self.assertEqual(int('4q0jto5', 31), 4294967297)
808 self.assertEqual(int('4000001', 32), 4294967297)
809 self.assertEqual(int('3aokq95', 33), 4294967297)
810 self.assertEqual(int('2qhxjlj', 34), 4294967297)
811 self.assertEqual(int('2br45qc', 35), 4294967297)
812 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000813
Brett Cannonc3647ac2005-04-26 03:45:26 +0000814 def test_intconversion(self):
815 # Test __int__()
816 class Foo0:
817 def __int__(self):
818 return 42
819
820 class Foo1(object):
821 def __int__(self):
822 return 42
823
824 class Foo2(int):
825 def __int__(self):
826 return 42
827
828 class Foo3(int):
829 def __int__(self):
830 return self
831
832 class Foo4(int):
833 def __int__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000834 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000835
836 class Foo5(int):
837 def __int__(self):
838 return 42.
839
840 self.assertEqual(int(Foo0()), 42)
841 self.assertEqual(int(Foo1()), 42)
842 self.assertEqual(int(Foo2()), 42)
843 self.assertEqual(int(Foo3()), 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000844 self.assertEqual(int(Foo4()), 42)
Brett Cannonc3647ac2005-04-26 03:45:26 +0000845 self.assertRaises(TypeError, int, Foo5())
846
Walter Dörwald919497e2003-01-19 16:23:59 +0000847 def test_iter(self):
848 self.assertRaises(TypeError, iter)
849 self.assertRaises(TypeError, iter, 42, 42)
850 lists = [("1", "2"), ["1", "2"], "12"]
851 if have_unicode:
852 lists.append(unicode("12"))
853 for l in lists:
854 i = iter(l)
855 self.assertEqual(i.next(), '1')
856 self.assertEqual(i.next(), '2')
857 self.assertRaises(StopIteration, i.next)
858
859 def test_isinstance(self):
860 class C:
861 pass
862 class D(C):
863 pass
864 class E:
865 pass
866 c = C()
867 d = D()
868 e = E()
869 self.assert_(isinstance(c, C))
870 self.assert_(isinstance(d, C))
871 self.assert_(not isinstance(e, C))
872 self.assert_(not isinstance(c, D))
873 self.assert_(not isinstance('foo', E))
874 self.assertRaises(TypeError, isinstance, E, 'foo')
875 self.assertRaises(TypeError, isinstance)
876
877 def test_issubclass(self):
878 class C:
879 pass
880 class D(C):
881 pass
882 class E:
883 pass
884 c = C()
885 d = D()
886 e = E()
887 self.assert_(issubclass(D, C))
888 self.assert_(issubclass(C, C))
889 self.assert_(not issubclass(C, D))
890 self.assertRaises(TypeError, issubclass, 'foo', E)
891 self.assertRaises(TypeError, issubclass, E, 'foo')
892 self.assertRaises(TypeError, issubclass)
893
894 def test_len(self):
895 self.assertEqual(len('123'), 3)
896 self.assertEqual(len(()), 0)
897 self.assertEqual(len((1, 2, 3, 4)), 4)
898 self.assertEqual(len([1, 2, 3, 4]), 4)
899 self.assertEqual(len({}), 0)
900 self.assertEqual(len({'a':1, 'b': 2}), 2)
901 class BadSeq:
902 def __len__(self):
903 raise ValueError
904 self.assertRaises(ValueError, len, BadSeq())
905
906 def test_list(self):
907 self.assertEqual(list([]), [])
908 l0_3 = [0, 1, 2, 3]
909 l0_3_bis = list(l0_3)
910 self.assertEqual(l0_3, l0_3_bis)
911 self.assert_(l0_3 is not l0_3_bis)
912 self.assertEqual(list(()), [])
913 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
914 self.assertEqual(list(''), [])
915 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
916
917 if sys.maxint == 0x7fffffff:
918 # This test can currently only work on 32-bit machines.
919 # XXX If/when PySequence_Length() returns a ssize_t, it should be
920 # XXX re-enabled.
921 # Verify clearing of bug #556025.
922 # This assumes that the max data size (sys.maxint) == max
923 # address size this also assumes that the address size is at
924 # least 4 bytes with 8 byte addresses, the bug is not well
925 # tested
926 #
927 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
928 # earlier due to a newlib bug. See the following mailing list
929 # thread for the details:
930
931 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
932 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
933
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000934 # This code used to segfault in Py2.4a3
935 x = []
936 x.extend(-y for y in x)
937 self.assertEqual(x, [])
938
Walter Dörwald919497e2003-01-19 16:23:59 +0000939 def test_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000940 self.assertEqual(int(314), 314)
941 self.assertEqual(int(3.14), 3)
942 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000943 # Check that conversion from float truncates towards zero
Guido van Rossume2a383d2007-01-15 16:59:06 +0000944 self.assertEqual(int(-3.14), -3)
945 self.assertEqual(int(3.9), 3)
946 self.assertEqual(int(-3.9), -3)
947 self.assertEqual(int(3.5), 3)
948 self.assertEqual(int(-3.5), -3)
949 self.assertEqual(int("-3"), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000950 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000951 self.assertEqual(int(unicode("-3")), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000952 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000953 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000954 if have_unicode:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000955 self.assertEqual(int(unicode("10"),16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000956 # Check conversions from string (same test set as for int(), and then some)
957 LL = [
Guido van Rossume2a383d2007-01-15 16:59:06 +0000958 ('1' + '0'*20, 10**20),
959 ('1' + '0'*100, 10**100)
Walter Dörwald919497e2003-01-19 16:23:59 +0000960 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000961 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 if have_unicode:
963 L2 += [
Guido van Rossume2a383d2007-01-15 16:59:06 +0000964 (unicode('1') + unicode('0')*20, 10**20),
965 (unicode('1') + unicode('0')*100, 10**100),
Walter Dörwald919497e2003-01-19 16:23:59 +0000966 ]
967 for s, v in L2 + LL:
968 for sign in "", "+", "-":
969 for prefix in "", " ", "\t", " \t\t ":
970 ss = prefix + sign + s
971 vv = v
972 if sign == "-" and v is not ValueError:
973 vv = -v
974 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000975 self.assertEqual(int(ss), int(vv))
Walter Dörwald919497e2003-01-19 16:23:59 +0000976 except v:
977 pass
978
Guido van Rossume2a383d2007-01-15 16:59:06 +0000979 self.assertRaises(ValueError, int, '123\0')
980 self.assertRaises(ValueError, int, '53', 40)
981 self.assertRaises(TypeError, int, 1, 12)
Walter Dörwald919497e2003-01-19 16:23:59 +0000982
Guido van Rossume2a383d2007-01-15 16:59:06 +0000983 self.assertEqual(int('100000000000000000000000000000000', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000984 4294967296)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000985 self.assertEqual(int('102002022201221111211', 3), 4294967296)
986 self.assertEqual(int('10000000000000000', 4), 4294967296)
987 self.assertEqual(int('32244002423141', 5), 4294967296)
988 self.assertEqual(int('1550104015504', 6), 4294967296)
989 self.assertEqual(int('211301422354', 7), 4294967296)
990 self.assertEqual(int('40000000000', 8), 4294967296)
991 self.assertEqual(int('12068657454', 9), 4294967296)
992 self.assertEqual(int('4294967296', 10), 4294967296)
993 self.assertEqual(int('1904440554', 11), 4294967296)
994 self.assertEqual(int('9ba461594', 12), 4294967296)
995 self.assertEqual(int('535a79889', 13), 4294967296)
996 self.assertEqual(int('2ca5b7464', 14), 4294967296)
997 self.assertEqual(int('1a20dcd81', 15), 4294967296)
998 self.assertEqual(int('100000000', 16), 4294967296)
999 self.assertEqual(int('a7ffda91', 17), 4294967296)
1000 self.assertEqual(int('704he7g4', 18), 4294967296)
1001 self.assertEqual(int('4f5aff66', 19), 4294967296)
1002 self.assertEqual(int('3723ai4g', 20), 4294967296)
1003 self.assertEqual(int('281d55i4', 21), 4294967296)
1004 self.assertEqual(int('1fj8b184', 22), 4294967296)
1005 self.assertEqual(int('1606k7ic', 23), 4294967296)
1006 self.assertEqual(int('mb994ag', 24), 4294967296)
1007 self.assertEqual(int('hek2mgl', 25), 4294967296)
1008 self.assertEqual(int('dnchbnm', 26), 4294967296)
1009 self.assertEqual(int('b28jpdm', 27), 4294967296)
1010 self.assertEqual(int('8pfgih4', 28), 4294967296)
1011 self.assertEqual(int('76beigg', 29), 4294967296)
1012 self.assertEqual(int('5qmcpqg', 30), 4294967296)
1013 self.assertEqual(int('4q0jto4', 31), 4294967296)
1014 self.assertEqual(int('4000000', 32), 4294967296)
1015 self.assertEqual(int('3aokq94', 33), 4294967296)
1016 self.assertEqual(int('2qhxjli', 34), 4294967296)
1017 self.assertEqual(int('2br45qb', 35), 4294967296)
1018 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001019
Guido van Rossume2a383d2007-01-15 16:59:06 +00001020 self.assertEqual(int('100000000000000000000000000000001', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +00001021 4294967297)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001022 self.assertEqual(int('102002022201221111212', 3), 4294967297)
1023 self.assertEqual(int('10000000000000001', 4), 4294967297)
1024 self.assertEqual(int('32244002423142', 5), 4294967297)
1025 self.assertEqual(int('1550104015505', 6), 4294967297)
1026 self.assertEqual(int('211301422355', 7), 4294967297)
1027 self.assertEqual(int('40000000001', 8), 4294967297)
1028 self.assertEqual(int('12068657455', 9), 4294967297)
1029 self.assertEqual(int('4294967297', 10), 4294967297)
1030 self.assertEqual(int('1904440555', 11), 4294967297)
1031 self.assertEqual(int('9ba461595', 12), 4294967297)
1032 self.assertEqual(int('535a7988a', 13), 4294967297)
1033 self.assertEqual(int('2ca5b7465', 14), 4294967297)
1034 self.assertEqual(int('1a20dcd82', 15), 4294967297)
1035 self.assertEqual(int('100000001', 16), 4294967297)
1036 self.assertEqual(int('a7ffda92', 17), 4294967297)
1037 self.assertEqual(int('704he7g5', 18), 4294967297)
1038 self.assertEqual(int('4f5aff67', 19), 4294967297)
1039 self.assertEqual(int('3723ai4h', 20), 4294967297)
1040 self.assertEqual(int('281d55i5', 21), 4294967297)
1041 self.assertEqual(int('1fj8b185', 22), 4294967297)
1042 self.assertEqual(int('1606k7id', 23), 4294967297)
1043 self.assertEqual(int('mb994ah', 24), 4294967297)
1044 self.assertEqual(int('hek2mgm', 25), 4294967297)
1045 self.assertEqual(int('dnchbnn', 26), 4294967297)
1046 self.assertEqual(int('b28jpdn', 27), 4294967297)
1047 self.assertEqual(int('8pfgih5', 28), 4294967297)
1048 self.assertEqual(int('76beigh', 29), 4294967297)
1049 self.assertEqual(int('5qmcpqh', 30), 4294967297)
1050 self.assertEqual(int('4q0jto5', 31), 4294967297)
1051 self.assertEqual(int('4000001', 32), 4294967297)
1052 self.assertEqual(int('3aokq95', 33), 4294967297)
1053 self.assertEqual(int('2qhxjlj', 34), 4294967297)
1054 self.assertEqual(int('2br45qc', 35), 4294967297)
1055 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056
1057
Brett Cannonc3647ac2005-04-26 03:45:26 +00001058 def test_longconversion(self):
1059 # Test __long__()
1060 class Foo0:
1061 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001062 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001063
1064 class Foo1(object):
1065 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001066 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001067
Guido van Rossume2a383d2007-01-15 16:59:06 +00001068 class Foo2(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001069 def __long__(self):
1070 return 42
1071
Guido van Rossume2a383d2007-01-15 16:59:06 +00001072 class Foo3(int):
1073 def __long__(self):
1074 return self
1075
1076 class Foo4(int):
1077 def __long__(self):
1078 return 42
1079
1080 class Foo5(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001081 def __long__(self):
1082 return 42.
1083
Guido van Rossume2a383d2007-01-15 16:59:06 +00001084 self.assertEqual(int(Foo0()), 42)
1085 self.assertEqual(int(Foo1()), 42)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001086 # XXX invokes __int__ now
1087 # self.assertEqual(long(Foo2()), 42L)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001088 self.assertEqual(int(Foo3()), 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001089 # XXX likewise
1090 # self.assertEqual(long(Foo4()), 42)
1091 # self.assertRaises(TypeError, long, Foo5())
Brett Cannonc3647ac2005-04-26 03:45:26 +00001092
Walter Dörwald919497e2003-01-19 16:23:59 +00001093 def test_map(self):
1094 self.assertEqual(
1095 map(None, 'hello world'),
1096 ['h','e','l','l','o',' ','w','o','r','l','d']
1097 )
1098 self.assertEqual(
1099 map(None, 'abcd', 'efg'),
1100 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1101 )
1102 self.assertEqual(
1103 map(None, range(10)),
1104 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1105 )
1106 self.assertEqual(
1107 map(lambda x: x*x, range(1,4)),
1108 [1, 4, 9]
1109 )
1110 try:
1111 from math import sqrt
1112 except ImportError:
1113 def sqrt(x):
1114 return pow(x, 0.5)
1115 self.assertEqual(
1116 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1117 [[4.0, 2.0], [9.0, 3.0]]
1118 )
1119 self.assertEqual(
1120 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1121 [10, 4, 6]
1122 )
1123
1124 def plus(*v):
1125 accu = 0
1126 for i in v: accu = accu + i
1127 return accu
1128 self.assertEqual(
1129 map(plus, [1, 3, 7]),
1130 [1, 3, 7]
1131 )
1132 self.assertEqual(
1133 map(plus, [1, 3, 7], [4, 9, 2]),
1134 [1+4, 3+9, 7+2]
1135 )
1136 self.assertEqual(
1137 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1138 [1+4+1, 3+9+1, 7+2+0]
1139 )
1140 self.assertEqual(
1141 map(None, Squares(10)),
1142 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1143 )
1144 self.assertEqual(
1145 map(int, Squares(10)),
1146 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1147 )
1148 self.assertEqual(
1149 map(None, Squares(3), Squares(2)),
1150 [(0,0), (1,1), (4,None)]
1151 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001152 def Max(a, b):
1153 if a is None:
1154 return b
1155 if b is None:
1156 return a
1157 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001158 self.assertEqual(
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001159 map(Max, Squares(3), Squares(2)),
Walter Dörwald919497e2003-01-19 16:23:59 +00001160 [0, 1, 4]
1161 )
1162 self.assertRaises(TypeError, map)
1163 self.assertRaises(TypeError, map, lambda x: x, 42)
1164 self.assertEqual(map(None, [42]), [42])
1165 class BadSeq:
1166 def __getitem__(self, index):
1167 raise ValueError
1168 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001169 def badfunc(x):
1170 raise RuntimeError
1171 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001172
1173 def test_max(self):
1174 self.assertEqual(max('123123'), '3')
1175 self.assertEqual(max(1, 2, 3), 3)
1176 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1177 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1178
Guido van Rossume2a383d2007-01-15 16:59:06 +00001179 self.assertEqual(max(1, 2, 3.0), 3.0)
1180 self.assertEqual(max(1, 2.0, 3), 3)
1181 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001182
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001183 for stmt in (
1184 "max(key=int)", # no args
1185 "max(1, key=int)", # single arg not iterable
1186 "max(1, 2, keystone=int)", # wrong keyword
1187 "max(1, 2, key=int, abc=int)", # two many keywords
1188 "max(1, 2, key=1)", # keyfunc is not callable
1189 ):
Tim Peters7f061872004-12-07 21:17:46 +00001190 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001191 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001192 except TypeError:
1193 pass
1194 else:
1195 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001196
1197 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1198 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1199 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1200
1201 data = [random.randrange(200) for i in range(100)]
1202 keys = dict((elem, random.randrange(50)) for elem in data)
1203 f = keys.__getitem__
1204 self.assertEqual(max(data, key=f),
1205 sorted(reversed(data), key=f)[-1])
1206
Walter Dörwald919497e2003-01-19 16:23:59 +00001207 def test_min(self):
1208 self.assertEqual(min('123123'), '1')
1209 self.assertEqual(min(1, 2, 3), 1)
1210 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1211 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1212
Guido van Rossume2a383d2007-01-15 16:59:06 +00001213 self.assertEqual(min(1, 2, 3.0), 1)
1214 self.assertEqual(min(1, 2.0, 3), 1)
1215 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001216
1217 self.assertRaises(TypeError, min)
1218 self.assertRaises(TypeError, min, 42)
1219 self.assertRaises(ValueError, min, ())
1220 class BadSeq:
1221 def __getitem__(self, index):
1222 raise ValueError
1223 self.assertRaises(ValueError, min, BadSeq())
1224 class BadNumber:
1225 def __cmp__(self, other):
1226 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001227 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001228
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001229 for stmt in (
1230 "min(key=int)", # no args
1231 "min(1, key=int)", # single arg not iterable
1232 "min(1, 2, keystone=int)", # wrong keyword
1233 "min(1, 2, key=int, abc=int)", # two many keywords
1234 "min(1, 2, key=1)", # keyfunc is not callable
1235 ):
Tim Peters7f061872004-12-07 21:17:46 +00001236 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001237 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001238 except TypeError:
1239 pass
1240 else:
1241 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001242
1243 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1244 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1245 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1246
1247 data = [random.randrange(200) for i in range(100)]
1248 keys = dict((elem, random.randrange(50)) for elem in data)
1249 f = keys.__getitem__
1250 self.assertEqual(min(data, key=f),
1251 sorted(data, key=f)[0])
1252
Walter Dörwald919497e2003-01-19 16:23:59 +00001253 def test_oct(self):
1254 self.assertEqual(oct(100), '0144')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001255 self.assertEqual(oct(100), '0144')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001256 self.assertEqual(oct(-100), '-0144')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001257 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001258 self.assertRaises(TypeError, oct, ())
1259
1260 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001261 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 fp = open(TESTFN, 'w')
1263 try:
1264 fp.write('1+1\n')
1265 fp.write('1+1\n')
1266 fp.write('The quick brown fox jumps over the lazy dog')
1267 fp.write('.\n')
1268 fp.write('Dear John\n')
1269 fp.write('XXX'*100)
1270 fp.write('YYY'*100)
1271 finally:
1272 fp.close()
1273
1274 def test_open(self):
1275 self.write_testfile()
1276 fp = open(TESTFN, 'r')
1277 try:
1278 self.assertEqual(fp.readline(4), '1+1\n')
1279 self.assertEqual(fp.readline(4), '1+1\n')
1280 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1281 self.assertEqual(fp.readline(4), 'Dear')
1282 self.assertEqual(fp.readline(100), ' John\n')
1283 self.assertEqual(fp.read(300), 'XXX'*100)
1284 self.assertEqual(fp.read(1000), 'YYY'*100)
1285 finally:
1286 fp.close()
1287 unlink(TESTFN)
1288
1289 def test_ord(self):
1290 self.assertEqual(ord(' '), 32)
1291 self.assertEqual(ord('A'), 65)
1292 self.assertEqual(ord('a'), 97)
1293 if have_unicode:
1294 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1295 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001296 if have_unicode:
1297 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001298
1299 def test_pow(self):
1300 self.assertEqual(pow(0,0), 1)
1301 self.assertEqual(pow(0,1), 0)
1302 self.assertEqual(pow(1,0), 1)
1303 self.assertEqual(pow(1,1), 1)
1304
1305 self.assertEqual(pow(2,0), 1)
1306 self.assertEqual(pow(2,10), 1024)
1307 self.assertEqual(pow(2,20), 1024*1024)
1308 self.assertEqual(pow(2,30), 1024*1024*1024)
1309
1310 self.assertEqual(pow(-2,0), 1)
1311 self.assertEqual(pow(-2,1), -2)
1312 self.assertEqual(pow(-2,2), 4)
1313 self.assertEqual(pow(-2,3), -8)
1314
Guido van Rossume2a383d2007-01-15 16:59:06 +00001315 self.assertEqual(pow(0,0), 1)
1316 self.assertEqual(pow(0,1), 0)
1317 self.assertEqual(pow(1,0), 1)
1318 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001319
Guido van Rossume2a383d2007-01-15 16:59:06 +00001320 self.assertEqual(pow(2,0), 1)
1321 self.assertEqual(pow(2,10), 1024)
1322 self.assertEqual(pow(2,20), 1024*1024)
1323 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +00001324
Guido van Rossume2a383d2007-01-15 16:59:06 +00001325 self.assertEqual(pow(-2,0), 1)
1326 self.assertEqual(pow(-2,1), -2)
1327 self.assertEqual(pow(-2,2), 4)
1328 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +00001329
1330 self.assertAlmostEqual(pow(0.,0), 1.)
1331 self.assertAlmostEqual(pow(0.,1), 0.)
1332 self.assertAlmostEqual(pow(1.,0), 1.)
1333 self.assertAlmostEqual(pow(1.,1), 1.)
1334
1335 self.assertAlmostEqual(pow(2.,0), 1.)
1336 self.assertAlmostEqual(pow(2.,10), 1024.)
1337 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1338 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1339
1340 self.assertAlmostEqual(pow(-2.,0), 1.)
1341 self.assertAlmostEqual(pow(-2.,1), -2.)
1342 self.assertAlmostEqual(pow(-2.,2), 4.)
1343 self.assertAlmostEqual(pow(-2.,3), -8.)
1344
Guido van Rossume2a383d2007-01-15 16:59:06 +00001345 for x in 2, 2, 2.0:
1346 for y in 10, 10, 10.0:
1347 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001348 if isinstance(x, float) or \
1349 isinstance(y, float) or \
1350 isinstance(z, float):
1351 self.assertRaises(TypeError, pow, x, y, z)
1352 else:
1353 self.assertAlmostEqual(pow(x, y, z), 24.0)
1354
1355 self.assertRaises(TypeError, pow, -1, -2, 3)
1356 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001357 self.assertRaises(TypeError, pow, -1, -2, 3)
1358 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001359 self.assertRaises(ValueError, pow, -342.43, 0.234)
1360
1361 self.assertRaises(TypeError, pow)
1362
1363 def test_range(self):
1364 self.assertEqual(range(3), [0, 1, 2])
1365 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1366 self.assertEqual(range(0), [])
1367 self.assertEqual(range(-3), [])
1368 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1369 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1370
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001371 # Now test range() with longs
1372 self.assertEqual(range(-2**100), [])
1373 self.assertEqual(range(0, -2**100), [])
1374 self.assertEqual(range(0, 2**100, -1), [])
1375 self.assertEqual(range(0, 2**100, -1), [])
1376
Guido van Rossume2a383d2007-01-15 16:59:06 +00001377 a = int(10 * sys.maxint)
1378 b = int(100 * sys.maxint)
1379 c = int(50 * sys.maxint)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001380
1381 self.assertEqual(range(a, a+2), [a, a+1])
Guido van Rossume2a383d2007-01-15 16:59:06 +00001382 self.assertEqual(range(a+2, a, -1), [a+2, a+1])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001383 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1384
1385 seq = range(a, b, c)
1386 self.assert_(a in seq)
1387 self.assert_(b not in seq)
1388 self.assertEqual(len(seq), 2)
1389
1390 seq = range(b, a, -c)
1391 self.assert_(b in seq)
1392 self.assert_(a not in seq)
1393 self.assertEqual(len(seq), 2)
1394
1395 seq = range(-a, -b, -c)
1396 self.assert_(-a in seq)
1397 self.assert_(-b not in seq)
1398 self.assertEqual(len(seq), 2)
1399
Walter Dörwald919497e2003-01-19 16:23:59 +00001400 self.assertRaises(TypeError, range)
1401 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1402 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001403 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001404
1405 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001406 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001407 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001408 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1409
1410 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001411 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001412
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001413 # Reject floats when it would require PyLongs to represent.
1414 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001415 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001416
Walter Dörwald357981e2003-04-15 18:59:28 +00001417 self.assertRaises(TypeError, range, 0, "spam")
1418 self.assertRaises(TypeError, range, 0, 42, "spam")
1419
1420 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1421 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1422
Guido van Rossuma88a0332007-02-26 16:59:55 +00001423 def test_input(self):
1424 self.write_testfile()
1425 fp = open(TESTFN, 'r')
1426 savestdin = sys.stdin
1427 savestdout = sys.stdout # Eats the echo
1428 try:
1429 sys.stdin = fp
1430 sys.stdout = BitBucket()
1431 self.assertEqual(input(), "1+1")
1432 self.assertEqual(input('testing\n'), "1+1")
1433 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1434 self.assertEqual(input('testing\n'), 'Dear John')
1435
1436 # SF 1535165: don't segfault on closed stdin
1437 # sys.stdout must be a regular file for triggering
1438 sys.stdout = savestdout
1439 sys.stdin.close()
1440 self.assertRaises(ValueError, input)
1441
1442 sys.stdout = BitBucket()
1443 sys.stdin = cStringIO.StringIO("NULL\0")
1444 self.assertRaises(TypeError, input, 42, 42)
1445 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1446 self.assertEqual(input(), " 'whitespace'")
1447 sys.stdin = cStringIO.StringIO()
1448 self.assertRaises(EOFError, input)
1449
1450 del sys.stdout
1451 self.assertRaises(RuntimeError, input, 'prompt')
1452 del sys.stdin
1453 self.assertRaises(RuntimeError, input, 'prompt')
1454 finally:
1455 sys.stdin = savestdin
1456 sys.stdout = savestdout
1457 fp.close()
1458 unlink(TESTFN)
1459
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 def test_reload(self):
1461 import marshal
1462 reload(marshal)
1463 import string
1464 reload(string)
1465 ## import sys
1466 ## self.assertRaises(ImportError, reload, sys)
1467
1468 def test_repr(self):
1469 self.assertEqual(repr(''), '\'\'')
1470 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001471 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001472 self.assertEqual(repr(()), '()')
1473 self.assertEqual(repr([]), '[]')
1474 self.assertEqual(repr({}), '{}')
1475 a = []
1476 a.append(a)
1477 self.assertEqual(repr(a), '[[...]]')
1478 a = {}
1479 a[0] = a
1480 self.assertEqual(repr(a), '{0: {...}}')
1481
1482 def test_round(self):
1483 self.assertEqual(round(0.0), 0.0)
1484 self.assertEqual(round(1.0), 1.0)
1485 self.assertEqual(round(10.0), 10.0)
1486 self.assertEqual(round(1000000000.0), 1000000000.0)
1487 self.assertEqual(round(1e20), 1e20)
1488
1489 self.assertEqual(round(-1.0), -1.0)
1490 self.assertEqual(round(-10.0), -10.0)
1491 self.assertEqual(round(-1000000000.0), -1000000000.0)
1492 self.assertEqual(round(-1e20), -1e20)
1493
1494 self.assertEqual(round(0.1), 0.0)
1495 self.assertEqual(round(1.1), 1.0)
1496 self.assertEqual(round(10.1), 10.0)
1497 self.assertEqual(round(1000000000.1), 1000000000.0)
1498
1499 self.assertEqual(round(-1.1), -1.0)
1500 self.assertEqual(round(-10.1), -10.0)
1501 self.assertEqual(round(-1000000000.1), -1000000000.0)
1502
1503 self.assertEqual(round(0.9), 1.0)
1504 self.assertEqual(round(9.9), 10.0)
1505 self.assertEqual(round(999999999.9), 1000000000.0)
1506
1507 self.assertEqual(round(-0.9), -1.0)
1508 self.assertEqual(round(-9.9), -10.0)
1509 self.assertEqual(round(-999999999.9), -1000000000.0)
1510
1511 self.assertEqual(round(-8.0, -1), -10.0)
1512
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513 # test new kwargs
1514 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1515
Walter Dörwald919497e2003-01-19 16:23:59 +00001516 self.assertRaises(TypeError, round)
1517
1518 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001519 setattr(sys, 'spam', 1)
1520 self.assertEqual(sys.spam, 1)
1521 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1522 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001523
1524 def test_str(self):
1525 self.assertEqual(str(''), '')
1526 self.assertEqual(str(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001527 self.assertEqual(str(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001528 self.assertEqual(str(()), '()')
1529 self.assertEqual(str([]), '[]')
1530 self.assertEqual(str({}), '{}')
1531 a = []
1532 a.append(a)
1533 self.assertEqual(str(a), '[[...]]')
1534 a = {}
1535 a[0] = a
1536 self.assertEqual(str(a), '{0: {...}}')
1537
Alex Martellia70b1912003-04-22 08:12:33 +00001538 def test_sum(self):
1539 self.assertEqual(sum([]), 0)
1540 self.assertEqual(sum(range(2,8)), 27)
1541 self.assertEqual(sum(iter(range(2,8))), 27)
1542 self.assertEqual(sum(Squares(10)), 285)
1543 self.assertEqual(sum(iter(Squares(10))), 285)
1544 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1545
1546 self.assertRaises(TypeError, sum)
1547 self.assertRaises(TypeError, sum, 42)
1548 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1549 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1550 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1551 self.assertRaises(TypeError, sum, [{2:3}])
1552 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1553
1554 class BadSeq:
1555 def __getitem__(self, index):
1556 raise ValueError
1557 self.assertRaises(ValueError, sum, BadSeq())
1558
Walter Dörwald919497e2003-01-19 16:23:59 +00001559 def test_tuple(self):
1560 self.assertEqual(tuple(()), ())
1561 t0_3 = (0, 1, 2, 3)
1562 t0_3_bis = tuple(t0_3)
1563 self.assert_(t0_3 is t0_3_bis)
1564 self.assertEqual(tuple([]), ())
1565 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1566 self.assertEqual(tuple(''), ())
1567 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1568
1569 def test_type(self):
1570 self.assertEqual(type(''), type('123'))
1571 self.assertNotEqual(type(''), type(()))
1572
1573 def test_unichr(self):
1574 if have_unicode:
1575 self.assertEqual(unichr(32), unicode(' '))
1576 self.assertEqual(unichr(65), unicode('A'))
1577 self.assertEqual(unichr(97), unicode('a'))
1578 self.assertEqual(
1579 unichr(sys.maxunicode),
1580 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1581 )
1582 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1583 self.assertRaises(TypeError, unichr)
1584
Guido van Rossumfee7b932005-01-16 00:21:28 +00001585 # We don't want self in vars(), so these are static methods
1586
1587 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001588 def get_vars_f0():
1589 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001590
Guido van Rossumfee7b932005-01-16 00:21:28 +00001591 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001592 def get_vars_f2():
1593 BuiltinTest.get_vars_f0()
1594 a = 1
1595 b = 2
1596 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001597
1598 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001599 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001600 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001601 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001602 self.assertEqual(self.get_vars_f0(), {})
1603 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1604 self.assertRaises(TypeError, vars, 42, 42)
1605 self.assertRaises(TypeError, vars, 42)
1606
1607 def test_zip(self):
1608 a = (1, 2, 3)
1609 b = (4, 5, 6)
1610 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001611 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001612 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001613 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001614 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001615 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001616 class I:
1617 def __getitem__(self, i):
1618 if i < 0 or i > 2: raise IndexError
1619 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001620 self.assertEqual(list(zip(a, I())), t)
1621 self.assertEqual(list(zip()), [])
1622 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001623 self.assertRaises(TypeError, zip, None)
1624 class G:
1625 pass
1626 self.assertRaises(TypeError, zip, a, G())
1627
1628 # Make sure zip doesn't try to allocate a billion elements for the
1629 # result list when one of its arguments doesn't say how long it is.
1630 # A MemoryError is the most likely failure mode.
1631 class SequenceWithoutALength:
1632 def __getitem__(self, i):
1633 if i == 5:
1634 raise IndexError
1635 else:
1636 return i
1637 self.assertEqual(
Guido van Rossum801f0d72006-08-24 19:48:10 +00001638 list(zip(SequenceWithoutALength(), xrange(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001639 list(enumerate(range(5)))
1640 )
1641
1642 class BadSeq:
1643 def __getitem__(self, i):
1644 if i == 5:
1645 raise ValueError
1646 else:
1647 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001648 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001649
Raymond Hettinger64958a12003-12-17 20:43:33 +00001650class TestSorted(unittest.TestCase):
1651
1652 def test_basic(self):
1653 data = range(100)
1654 copy = data[:]
1655 random.shuffle(copy)
1656 self.assertEqual(data, sorted(copy))
1657 self.assertNotEqual(data, copy)
1658
1659 data.reverse()
1660 random.shuffle(copy)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001661 self.assertEqual(data, sorted(copy, cmp=lambda x, y: (x < y) - (x > y)))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001662 self.assertNotEqual(data, copy)
1663 random.shuffle(copy)
1664 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1665 self.assertNotEqual(data, copy)
1666 random.shuffle(copy)
1667 self.assertEqual(data, sorted(copy, reverse=1))
1668 self.assertNotEqual(data, copy)
1669
1670 def test_inputtypes(self):
1671 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001672 types = [list, tuple]
1673 if have_unicode:
1674 types.insert(0, unicode)
1675 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001676 self.assertEqual(sorted(s), sorted(T(s)))
1677
1678 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001679 types = [set, frozenset, list, tuple, dict.fromkeys]
1680 if have_unicode:
1681 types.insert(0, unicode)
1682 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001683 self.assertEqual(sorted(s), sorted(T(s)))
1684
1685 def test_baddecorator(self):
1686 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1687 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1688
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001689def test_main(verbose=None):
1690 test_classes = (BuiltinTest, TestSorted)
1691
1692 run_unittest(*test_classes)
1693
1694 # verify reference counting
1695 if verbose and hasattr(sys, "gettotalrefcount"):
1696 import gc
1697 counts = [None] * 5
1698 for i in xrange(len(counts)):
1699 run_unittest(*test_classes)
1700 gc.collect()
1701 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001702 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001703
Walter Dörwald919497e2003-01-19 16:23:59 +00001704
1705if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001706 test_main(verbose=True)