blob: ef4f4071c44d6679682d75ac881f3318354089d1 [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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00004from test.test_support import fcmp, have_unicode, TESTFN, unlink, run_unittest
5from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00006
Raymond Hettinger214b1c32004-07-02 06:41:07 +00007import sys, warnings, cStringIO, random, UserDict
Walter Dörwald919497e2003-01-19 16:23:59 +00008warnings.filterwarnings("ignore", "hex../oct.. of negative int",
9 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000010warnings.filterwarnings("ignore", "integer argument expected",
11 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000012
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000013# count the number of test runs.
14# used to skip running test_execfile() multiple times
15numruns = 0
16
Walter Dörwald919497e2003-01-19 16:23:59 +000017class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000018
Walter Dörwald919497e2003-01-19 16:23:59 +000019 def __init__(self, max):
20 self.max = max
21 self.sofar = []
22
23 def __len__(self): return len(self.sofar)
24
25 def __getitem__(self, i):
26 if not 0 <= i < self.max: raise IndexError
27 n = len(self.sofar)
28 while n <= i:
29 self.sofar.append(n*n)
30 n += 1
31 return self.sofar[i]
32
33class StrSquares:
34
35 def __init__(self, max):
36 self.max = max
37 self.sofar = []
38
39 def __len__(self):
40 return len(self.sofar)
41
42 def __getitem__(self, i):
43 if not 0 <= i < self.max:
44 raise IndexError
45 n = len(self.sofar)
46 while n <= i:
47 self.sofar.append(str(n*n))
48 n += 1
49 return self.sofar[i]
50
51class BitBucket:
52 def write(self, line):
53 pass
54
55L = [
56 ('0', 0),
57 ('1', 1),
58 ('9', 9),
59 ('10', 10),
60 ('99', 99),
61 ('100', 100),
62 ('314', 314),
63 (' 314', 314),
64 ('314 ', 314),
65 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000066 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000067 (' 1x', ValueError),
68 (' 1 ', 1),
69 (' 1\02 ', ValueError),
70 ('', ValueError),
71 (' ', ValueError),
72 (' \t\t ', ValueError)
73]
74if have_unicode:
75 L += [
76 (unicode('0'), 0),
77 (unicode('1'), 1),
78 (unicode('9'), 9),
79 (unicode('10'), 10),
80 (unicode('99'), 99),
81 (unicode('100'), 100),
82 (unicode('314'), 314),
83 (unicode(' 314'), 314),
84 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
85 (unicode(' \t\t 314 \t\t '), 314),
86 (unicode(' 1x'), ValueError),
87 (unicode(' 1 '), 1),
88 (unicode(' 1\02 '), ValueError),
89 (unicode(''), ValueError),
90 (unicode(' '), ValueError),
91 (unicode(' \t\t '), ValueError),
92 (unichr(0x200), ValueError),
93]
94
Raymond Hettinger96229b12005-03-11 06:49:40 +000095class TestFailingBool:
96 def __nonzero__(self):
97 raise RuntimeError
98
99class TestFailingIter:
100 def __iter__(self):
101 raise RuntimeError
102
Walter Dörwald919497e2003-01-19 16:23:59 +0000103class BuiltinTest(unittest.TestCase):
104
105 def test_import(self):
106 __import__('sys')
107 __import__('time')
108 __import__('string')
109 self.assertRaises(ImportError, __import__, 'spamspam')
110 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000111 self.assertRaises(ValueError, __import__, '')
Walter Dörwald919497e2003-01-19 16:23:59 +0000112
113 def test_abs(self):
114 # int
115 self.assertEqual(abs(0), 0)
116 self.assertEqual(abs(1234), 1234)
117 self.assertEqual(abs(-1234), 1234)
118 # float
119 self.assertEqual(abs(0.0), 0.0)
120 self.assertEqual(abs(3.14), 3.14)
121 self.assertEqual(abs(-3.14), 3.14)
122 # long
123 self.assertEqual(abs(0L), 0L)
124 self.assertEqual(abs(1234L), 1234L)
125 self.assertEqual(abs(-1234L), 1234L)
126 # str
127 self.assertRaises(TypeError, abs, 'a')
128
Raymond Hettinger96229b12005-03-11 06:49:40 +0000129 def test_all(self):
130 self.assertEqual(all([2, 4, 6]), True)
131 self.assertEqual(all([2, None, 6]), False)
132 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
133 self.assertRaises(RuntimeError, all, TestFailingIter())
134 self.assertRaises(TypeError, all, 10) # Non-iterable
135 self.assertRaises(TypeError, all) # No args
136 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
137 self.assertEqual(all([]), True) # Empty iterator
138 S = [50, 60]
139 self.assertEqual(all(x > 42 for x in S), True)
140 S = [50, 40, 60]
141 self.assertEqual(all(x > 42 for x in S), False)
142
143 def test_any(self):
144 self.assertEqual(any([None, None, None]), False)
145 self.assertEqual(any([None, 4, None]), True)
146 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
147 self.assertRaises(RuntimeError, all, TestFailingIter())
148 self.assertRaises(TypeError, any, 10) # Non-iterable
149 self.assertRaises(TypeError, any) # No args
150 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
151 self.assertEqual(any([]), False) # Empty iterator
152 S = [40, 60, 30]
153 self.assertEqual(any(x > 42 for x in S), True)
154 S = [10, 20, 30]
155 self.assertEqual(any(x > 42 for x in S), False)
156
Walter Dörwald919497e2003-01-19 16:23:59 +0000157 def test_callable(self):
158 self.assert_(callable(len))
159 def f(): pass
160 self.assert_(callable(f))
161 class C:
162 def meth(self): pass
163 self.assert_(callable(C))
164 x = C()
165 self.assert_(callable(x.meth))
166 self.assert_(not callable(x))
167 class D(C):
168 def __call__(self): pass
169 y = D()
170 self.assert_(callable(y))
171 y()
172
173 def test_chr(self):
174 self.assertEqual(chr(32), ' ')
175 self.assertEqual(chr(65), 'A')
176 self.assertEqual(chr(97), 'a')
177 self.assertEqual(chr(0xff), '\xff')
178 self.assertRaises(ValueError, chr, 256)
179 self.assertRaises(TypeError, chr)
180
181 def test_cmp(self):
182 self.assertEqual(cmp(-1, 1), -1)
183 self.assertEqual(cmp(1, -1), 1)
184 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000185 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000186 a = []; a.append(a)
187 b = []; b.append(b)
188 from UserList import UserList
189 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000190 self.assertRaises(RuntimeError, cmp, a, b)
191 self.assertRaises(RuntimeError, cmp, b, c)
192 self.assertRaises(RuntimeError, cmp, c, a)
193 self.assertRaises(RuntimeError, cmp, a, c)
194 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000195 a.pop(); b.pop(); c.pop()
196 self.assertRaises(TypeError, cmp)
197
198 def test_coerce(self):
199 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
200 self.assertEqual(coerce(1, 1L), (1L, 1L))
201 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
202 self.assertRaises(TypeError, coerce)
203 class BadNumber:
204 def __coerce__(self, other):
205 raise ValueError
206 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000207 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000208
209 def test_compile(self):
210 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000211 bom = '\xef\xbb\xbf'
212 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 self.assertRaises(TypeError, compile)
214 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
215 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000216 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000217 if have_unicode:
218 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000219 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
220 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000221
Walter Dörwald919497e2003-01-19 16:23:59 +0000222 def test_delattr(self):
223 import sys
224 sys.spam = 1
225 delattr(sys, 'spam')
226 self.assertRaises(TypeError, delattr)
227
228 def test_dir(self):
229 x = 1
230 self.assert_('x' in dir())
231 import sys
232 self.assert_('modules' in dir(sys))
233 self.assertRaises(TypeError, dir, 42, 42)
234
235 def test_divmod(self):
236 self.assertEqual(divmod(12, 7), (1, 5))
237 self.assertEqual(divmod(-12, 7), (-2, 2))
238 self.assertEqual(divmod(12, -7), (-2, -2))
239 self.assertEqual(divmod(-12, -7), (1, -5))
240
241 self.assertEqual(divmod(12L, 7L), (1L, 5L))
242 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
243 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
244 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
245
246 self.assertEqual(divmod(12, 7L), (1, 5L))
247 self.assertEqual(divmod(-12, 7L), (-2, 2L))
248 self.assertEqual(divmod(12L, -7), (-2L, -2))
249 self.assertEqual(divmod(-12L, -7), (1L, -5))
250
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000251 self.assertEqual(divmod(-sys.maxint-1, -1),
252 (sys.maxint+1, 0))
253
Walter Dörwald919497e2003-01-19 16:23:59 +0000254 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
255 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
256 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
257 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
258
259 self.assertRaises(TypeError, divmod)
260
261 def test_eval(self):
262 self.assertEqual(eval('1+1'), 2)
263 self.assertEqual(eval(' 1+1\n'), 2)
264 globals = {'a': 1, 'b': 2}
265 locals = {'b': 200, 'c': 300}
266 self.assertEqual(eval('a', globals) , 1)
267 self.assertEqual(eval('a', globals, locals), 1)
268 self.assertEqual(eval('b', globals, locals), 200)
269 self.assertEqual(eval('c', globals, locals), 300)
270 if have_unicode:
271 self.assertEqual(eval(unicode('1+1')), 2)
272 self.assertEqual(eval(unicode(' 1+1\n')), 2)
273 globals = {'a': 1, 'b': 2}
274 locals = {'b': 200, 'c': 300}
275 if have_unicode:
276 self.assertEqual(eval(unicode('a'), globals), 1)
277 self.assertEqual(eval(unicode('a'), globals, locals), 1)
278 self.assertEqual(eval(unicode('b'), globals, locals), 200)
279 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000280 bom = '\xef\xbb\xbf'
281 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000282 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
283 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000284 self.assertRaises(TypeError, eval)
285 self.assertRaises(TypeError, eval, ())
286
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000287 def test_general_eval(self):
288 # Tests that general mappings can be used for the locals argument
289
290 class M:
291 "Test mapping interface versus possible calls from eval()."
292 def __getitem__(self, key):
293 if key == 'a':
294 return 12
295 raise KeyError
296 def keys(self):
297 return list('xyz')
298
299 m = M()
300 g = globals()
301 self.assertEqual(eval('a', g, m), 12)
302 self.assertRaises(NameError, eval, 'b', g, m)
303 self.assertEqual(eval('dir()', g, m), list('xyz'))
304 self.assertEqual(eval('globals()', g, m), g)
305 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000306 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000307 class A:
308 "Non-mapping"
309 pass
310 m = A()
311 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000312
313 # Verify that dict subclasses work as well
314 class D(dict):
315 def __getitem__(self, key):
316 if key == 'a':
317 return 12
318 return dict.__getitem__(self, key)
319 def keys(self):
320 return list('xyz')
321
322 d = D()
323 self.assertEqual(eval('a', g, d), 12)
324 self.assertRaises(NameError, eval, 'b', g, d)
325 self.assertEqual(eval('dir()', g, d), list('xyz'))
326 self.assertEqual(eval('globals()', g, d), g)
327 self.assertEqual(eval('locals()', g, d), d)
328
329 # Verify locals stores (used by list comps)
330 eval('[locals() for i in (2,3)]', g, d)
331 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
332
333 class SpreadSheet:
334 "Sample application showing nested, calculated lookups."
335 _cells = {}
336 def __setitem__(self, key, formula):
337 self._cells[key] = formula
338 def __getitem__(self, key ):
339 return eval(self._cells[key], globals(), self)
340
341 ss = SpreadSheet()
342 ss['a1'] = '5'
343 ss['a2'] = 'a1*6'
344 ss['a3'] = 'a2*7'
345 self.assertEqual(ss['a3'], 210)
346
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000347 # Verify that dir() catches a non-list returned by eval
348 # SF bug #1004669
349 class C:
350 def __getitem__(self, item):
351 raise KeyError(item)
352 def keys(self):
353 return 'a'
354 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
355
Walter Dörwald919497e2003-01-19 16:23:59 +0000356 # Done outside of the method test_z to get the correct scope
357 z = 0
358 f = open(TESTFN, 'w')
359 f.write('z = z+1\n')
360 f.write('z = z*2\n')
361 f.close()
362 execfile(TESTFN)
363
364 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000365 global numruns
366 if numruns:
367 return
368 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000369
Walter Dörwald919497e2003-01-19 16:23:59 +0000370 globals = {'a': 1, 'b': 2}
371 locals = {'b': 200, 'c': 300}
372
373 self.assertEqual(self.__class__.z, 2)
374 globals['z'] = 0
375 execfile(TESTFN, globals)
376 self.assertEqual(globals['z'], 2)
377 locals['z'] = 0
378 execfile(TESTFN, globals, locals)
379 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000380
381 class M:
382 "Test mapping interface versus possible calls from execfile()."
383 def __init__(self):
384 self.z = 10
385 def __getitem__(self, key):
386 if key == 'z':
387 return self.z
388 raise KeyError
389 def __setitem__(self, key, value):
390 if key == 'z':
391 self.z = value
392 return
393 raise KeyError
394
395 locals = M()
396 locals['z'] = 0
397 execfile(TESTFN, globals, locals)
398 self.assertEqual(locals['z'], 2)
399
Walter Dörwald919497e2003-01-19 16:23:59 +0000400 unlink(TESTFN)
401 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000402 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000403 import os
404 self.assertRaises(IOError, execfile, os.curdir)
405 self.assertRaises(IOError, execfile, "I_dont_exist")
406
407 def test_filter(self):
408 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
409 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
410 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
411 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
412 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
413 def identity(item):
414 return 1
415 filter(identity, Squares(5))
416 self.assertRaises(TypeError, filter)
417 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000418 def __getitem__(self, index):
419 if index<4:
420 return 42
421 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000422 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
423 def badfunc():
424 pass
425 self.assertRaises(TypeError, filter, badfunc, range(5))
426
Walter Dörwaldbf517072003-01-27 15:57:14 +0000427 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 self.assertEqual(filter(None, (1, 2)), (1, 2))
429 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
430 self.assertRaises(TypeError, filter, 42, (1, 2))
431
Walter Dörwaldbf517072003-01-27 15:57:14 +0000432 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000433 self.assertEqual(filter(None, "12"), "12")
434 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
435 self.assertRaises(TypeError, filter, 42, "12")
436 class badstr(str):
437 def __getitem__(self, index):
438 raise ValueError
439 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000440
Walter Dörwald903f1e02003-02-04 16:28:00 +0000441 class badstr2(str):
442 def __getitem__(self, index):
443 return 42
444 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
445
446 class weirdstr(str):
447 def __getitem__(self, index):
448 return weirdstr(2*str.__getitem__(self, index))
449 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
450
Walter Dörwald5e61e242003-02-04 17:04:01 +0000451 class shiftstr(str):
452 def __getitem__(self, index):
453 return chr(ord(str.__getitem__(self, index))+1)
454 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
455
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000456 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000457 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000458 self.assertEqual(filter(None, unicode("12")), unicode("12"))
459 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
460 self.assertRaises(TypeError, filter, 42, unicode("12"))
461 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000462
Walter Dörwald903f1e02003-02-04 16:28:00 +0000463 class badunicode(unicode):
464 def __getitem__(self, index):
465 return 42
466 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
467
468 class weirdunicode(unicode):
469 def __getitem__(self, index):
470 return weirdunicode(2*unicode.__getitem__(self, index))
471 self.assertEqual(
472 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
473
Walter Dörwald5e61e242003-02-04 17:04:01 +0000474 class shiftunicode(unicode):
475 def __getitem__(self, index):
476 return unichr(ord(unicode.__getitem__(self, index))+1)
477 self.assertEqual(
478 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
479 unicode("345")
480 )
481
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000482 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000483 # test that filter() never returns tuple, str or unicode subclasses
484 # and that the result always goes through __getitem__
485 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000486 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000487 def __getitem__(self, index):
488 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000489 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000490 def __getitem__(self, index):
491 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000492 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000493 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000494 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000495 }
496 if have_unicode:
497 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000498 def __getitem__(self, index):
499 return 2*unicode.__getitem__(self, index)
500 inputs[unicode2] = {
501 unicode(): unicode(),
502 unicode("123"): unicode("112233")
503 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000504
Walter Dörwald1918f772003-02-10 13:19:13 +0000505 for (cls, inps) in inputs.iteritems():
506 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000507 # make sure the output goes through __getitem__
508 # even if func is None
509 self.assertEqual(
510 filter(funcs[0], cls(inp)),
511 filter(funcs[1], cls(inp))
512 )
513 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000514 outp = filter(func, cls(inp))
515 self.assertEqual(outp, exp)
516 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000517
Walter Dörwald919497e2003-01-19 16:23:59 +0000518 def test_float(self):
519 self.assertEqual(float(3.14), 3.14)
520 self.assertEqual(float(314), 314.0)
521 self.assertEqual(float(314L), 314.0)
522 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000523 self.assertRaises(ValueError, float, " 0x3.1 ")
524 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000525 if have_unicode:
526 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
527 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000528 # Implementation limitation in PyFloat_FromString()
529 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000530
Neal Norwitz5898fa22005-11-22 05:17:40 +0000531 def test_float_with_comma(self):
532 # set locale to something that doesn't use '.' for the decimal point
533 try:
534 import locale
Georg Brandled1e4972006-01-09 22:36:58 +0000535 orig_locale = locale.setlocale(locale.LC_NUMERIC)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000536 locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
537 except:
538 # if we can't set the locale, just ignore this test
539 return
540
541 try:
542 self.assertEqual(locale.localeconv()['decimal_point'], ',')
543 except:
544 # this test is worthless, just skip it and reset the locale
545 locale.setlocale(locale.LC_NUMERIC, orig_locale)
546 return
547
548 try:
549 self.assertEqual(float(" 3,14 "), 3.14)
550 self.assertEqual(float(" +3,14 "), 3.14)
551 self.assertEqual(float(" -3,14 "), -3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000552 self.assertRaises(ValueError, float, " 0x3.1 ")
553 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Neal Norwitz5898fa22005-11-22 05:17:40 +0000554 self.assertEqual(float(" 25.e-1 "), 2.5)
555 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
556 finally:
557 locale.setlocale(locale.LC_NUMERIC, orig_locale)
558
Brett Cannonc3647ac2005-04-26 03:45:26 +0000559 def test_floatconversion(self):
560 # Make sure that calls to __float__() work properly
561 class Foo0:
562 def __float__(self):
563 return 42.
564
565 class Foo1(object):
566 def __float__(self):
567 return 42.
568
569 class Foo2(float):
570 def __float__(self):
571 return 42.
572
573 class Foo3(float):
574 def __new__(cls, value=0.):
575 return float.__new__(cls, 2*value)
576
577 def __float__(self):
578 return self
579
580 class Foo4(float):
581 def __float__(self):
582 return 42
583
584 self.assertAlmostEqual(float(Foo0()), 42.)
585 self.assertAlmostEqual(float(Foo1()), 42.)
586 self.assertAlmostEqual(float(Foo2()), 42.)
587 self.assertAlmostEqual(float(Foo3(21)), 42.)
588 self.assertRaises(TypeError, float, Foo4(42))
589
Walter Dörwald919497e2003-01-19 16:23:59 +0000590 def test_getattr(self):
591 import sys
592 self.assert_(getattr(sys, 'stdout') is sys.stdout)
593 self.assertRaises(TypeError, getattr, sys, 1)
594 self.assertRaises(TypeError, getattr, sys, 1, "foo")
595 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000596 if have_unicode:
597 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000598
599 def test_hasattr(self):
600 import sys
601 self.assert_(hasattr(sys, 'stdout'))
602 self.assertRaises(TypeError, hasattr, sys, 1)
603 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000604 if have_unicode:
605 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000606
607 def test_hash(self):
608 hash(None)
609 self.assertEqual(hash(1), hash(1L))
610 self.assertEqual(hash(1), hash(1.0))
611 hash('spam')
612 if have_unicode:
613 self.assertEqual(hash('spam'), hash(unicode('spam')))
614 hash((0,1,2,3))
615 def f(): pass
616 self.assertRaises(TypeError, hash, [])
617 self.assertRaises(TypeError, hash, {})
618
619 def test_hex(self):
620 self.assertEqual(hex(16), '0x10')
621 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000622 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000623 self.assertEqual(hex(-16L), '-0x10L')
624 self.assertRaises(TypeError, hex, {})
625
626 def test_id(self):
627 id(None)
628 id(1)
629 id(1L)
630 id(1.0)
631 id('spam')
632 id((0,1,2,3))
633 id([0,1,2,3])
634 id({'spam': 1, 'eggs': 2, 'ham': 3})
635
Walter Dörwald919497e2003-01-19 16:23:59 +0000636 def test_int(self):
637 self.assertEqual(int(314), 314)
638 self.assertEqual(int(3.14), 3)
639 self.assertEqual(int(314L), 314)
640 # Check that conversion from float truncates towards zero
641 self.assertEqual(int(-3.14), -3)
642 self.assertEqual(int(3.9), 3)
643 self.assertEqual(int(-3.9), -3)
644 self.assertEqual(int(3.5), 3)
645 self.assertEqual(int(-3.5), -3)
646 # Different base:
647 self.assertEqual(int("10",16), 16L)
648 if have_unicode:
649 self.assertEqual(int(unicode("10"),16), 16L)
650 # Test conversion from strings and various anomalies
651 for s, v in L:
652 for sign in "", "+", "-":
653 for prefix in "", " ", "\t", " \t\t ":
654 ss = prefix + sign + s
655 vv = v
656 if sign == "-" and v is not ValueError:
657 vv = -v
658 try:
659 self.assertEqual(int(ss), vv)
660 except v:
661 pass
662
Walter Dörwald70a6b492004-02-12 17:35:32 +0000663 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 self.assertEqual(int(s)+1, -sys.maxint)
665 # should return long
666 int(s[1:])
667
668 # should return long
669 x = int(1e100)
670 self.assert_(isinstance(x, long))
671 x = int(-1e100)
672 self.assert_(isinstance(x, long))
673
674
675 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
676 # Worked by accident in Windows release build, but failed in debug build.
677 # Failed in all Linux builds.
678 x = -1-sys.maxint
679 self.assertEqual(x >> 1, x//2)
680
681 self.assertRaises(ValueError, int, '123\0')
682 self.assertRaises(ValueError, int, '53', 40)
683
684 x = int('1' * 600)
685 self.assert_(isinstance(x, long))
686
687 if have_unicode:
688 x = int(unichr(0x661) * 600)
689 self.assert_(isinstance(x, long))
690
691 self.assertRaises(TypeError, int, 1, 12)
692
693 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000694 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000695
Brett Cannonc3647ac2005-04-26 03:45:26 +0000696 def test_intconversion(self):
697 # Test __int__()
698 class Foo0:
699 def __int__(self):
700 return 42
701
702 class Foo1(object):
703 def __int__(self):
704 return 42
705
706 class Foo2(int):
707 def __int__(self):
708 return 42
709
710 class Foo3(int):
711 def __int__(self):
712 return self
713
714 class Foo4(int):
715 def __int__(self):
716 return 42L
717
718 class Foo5(int):
719 def __int__(self):
720 return 42.
721
722 self.assertEqual(int(Foo0()), 42)
723 self.assertEqual(int(Foo1()), 42)
724 self.assertEqual(int(Foo2()), 42)
725 self.assertEqual(int(Foo3()), 0)
726 self.assertEqual(int(Foo4()), 42L)
727 self.assertRaises(TypeError, int, Foo5())
728
Walter Dörwald919497e2003-01-19 16:23:59 +0000729 def test_intern(self):
730 self.assertRaises(TypeError, intern)
731 s = "never interned before"
732 self.assert_(intern(s) is s)
733 s2 = s.swapcase().swapcase()
734 self.assert_(intern(s2) is s)
735
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000736 # Subclasses of string can't be interned, because they
737 # provide too much opportunity for insane things to happen.
738 # We don't want them in the interned dict and if they aren't
739 # actually interned, we don't want to create the appearance
740 # that they are by allowing intern() to succeeed.
741 class S(str):
742 def __hash__(self):
743 return 123
744
745 self.assertRaises(TypeError, intern, S("abc"))
746
747 # It's still safe to pass these strings to routines that
748 # call intern internally, e.g. PyObject_SetAttr().
749 s = S("abc")
750 setattr(s, s, s)
751 self.assertEqual(getattr(s, s), s)
752
Walter Dörwald919497e2003-01-19 16:23:59 +0000753 def test_iter(self):
754 self.assertRaises(TypeError, iter)
755 self.assertRaises(TypeError, iter, 42, 42)
756 lists = [("1", "2"), ["1", "2"], "12"]
757 if have_unicode:
758 lists.append(unicode("12"))
759 for l in lists:
760 i = iter(l)
761 self.assertEqual(i.next(), '1')
762 self.assertEqual(i.next(), '2')
763 self.assertRaises(StopIteration, i.next)
764
765 def test_isinstance(self):
766 class C:
767 pass
768 class D(C):
769 pass
770 class E:
771 pass
772 c = C()
773 d = D()
774 e = E()
775 self.assert_(isinstance(c, C))
776 self.assert_(isinstance(d, C))
777 self.assert_(not isinstance(e, C))
778 self.assert_(not isinstance(c, D))
779 self.assert_(not isinstance('foo', E))
780 self.assertRaises(TypeError, isinstance, E, 'foo')
781 self.assertRaises(TypeError, isinstance)
782
783 def test_issubclass(self):
784 class C:
785 pass
786 class D(C):
787 pass
788 class E:
789 pass
790 c = C()
791 d = D()
792 e = E()
793 self.assert_(issubclass(D, C))
794 self.assert_(issubclass(C, C))
795 self.assert_(not issubclass(C, D))
796 self.assertRaises(TypeError, issubclass, 'foo', E)
797 self.assertRaises(TypeError, issubclass, E, 'foo')
798 self.assertRaises(TypeError, issubclass)
799
800 def test_len(self):
801 self.assertEqual(len('123'), 3)
802 self.assertEqual(len(()), 0)
803 self.assertEqual(len((1, 2, 3, 4)), 4)
804 self.assertEqual(len([1, 2, 3, 4]), 4)
805 self.assertEqual(len({}), 0)
806 self.assertEqual(len({'a':1, 'b': 2}), 2)
807 class BadSeq:
808 def __len__(self):
809 raise ValueError
810 self.assertRaises(ValueError, len, BadSeq())
811
812 def test_list(self):
813 self.assertEqual(list([]), [])
814 l0_3 = [0, 1, 2, 3]
815 l0_3_bis = list(l0_3)
816 self.assertEqual(l0_3, l0_3_bis)
817 self.assert_(l0_3 is not l0_3_bis)
818 self.assertEqual(list(()), [])
819 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
820 self.assertEqual(list(''), [])
821 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
822
823 if sys.maxint == 0x7fffffff:
824 # This test can currently only work on 32-bit machines.
825 # XXX If/when PySequence_Length() returns a ssize_t, it should be
826 # XXX re-enabled.
827 # Verify clearing of bug #556025.
828 # This assumes that the max data size (sys.maxint) == max
829 # address size this also assumes that the address size is at
830 # least 4 bytes with 8 byte addresses, the bug is not well
831 # tested
832 #
833 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
834 # earlier due to a newlib bug. See the following mailing list
835 # thread for the details:
836
837 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
838 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
839
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000840 # This code used to segfault in Py2.4a3
841 x = []
842 x.extend(-y for y in x)
843 self.assertEqual(x, [])
844
Walter Dörwald919497e2003-01-19 16:23:59 +0000845 def test_long(self):
846 self.assertEqual(long(314), 314L)
847 self.assertEqual(long(3.14), 3L)
848 self.assertEqual(long(314L), 314L)
849 # Check that conversion from float truncates towards zero
850 self.assertEqual(long(-3.14), -3L)
851 self.assertEqual(long(3.9), 3L)
852 self.assertEqual(long(-3.9), -3L)
853 self.assertEqual(long(3.5), 3L)
854 self.assertEqual(long(-3.5), -3L)
855 self.assertEqual(long("-3"), -3L)
856 if have_unicode:
857 self.assertEqual(long(unicode("-3")), -3L)
858 # Different base:
859 self.assertEqual(long("10",16), 16L)
860 if have_unicode:
861 self.assertEqual(long(unicode("10"),16), 16L)
862 # Check conversions from string (same test set as for int(), and then some)
863 LL = [
864 ('1' + '0'*20, 10L**20),
865 ('1' + '0'*100, 10L**100)
866 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000867 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000868 if have_unicode:
869 L2 += [
870 (unicode('1') + unicode('0')*20, 10L**20),
871 (unicode('1') + unicode('0')*100, 10L**100),
872 ]
873 for s, v in L2 + LL:
874 for sign in "", "+", "-":
875 for prefix in "", " ", "\t", " \t\t ":
876 ss = prefix + sign + s
877 vv = v
878 if sign == "-" and v is not ValueError:
879 vv = -v
880 try:
881 self.assertEqual(long(ss), long(vv))
882 except v:
883 pass
884
885 self.assertRaises(ValueError, long, '123\0')
886 self.assertRaises(ValueError, long, '53', 40)
887 self.assertRaises(TypeError, long, 1, 12)
888
Brett Cannonc3647ac2005-04-26 03:45:26 +0000889 def test_longconversion(self):
890 # Test __long__()
891 class Foo0:
892 def __long__(self):
893 return 42L
894
895 class Foo1(object):
896 def __long__(self):
897 return 42L
898
899 class Foo2(long):
900 def __long__(self):
901 return 42L
902
903 class Foo3(long):
904 def __long__(self):
905 return self
906
907 class Foo4(long):
908 def __long__(self):
909 return 42
910
911 class Foo5(long):
912 def __long__(self):
913 return 42.
914
915 self.assertEqual(long(Foo0()), 42L)
916 self.assertEqual(long(Foo1()), 42L)
917 self.assertEqual(long(Foo2()), 42L)
918 self.assertEqual(long(Foo3()), 0)
919 self.assertEqual(long(Foo4()), 42)
920 self.assertRaises(TypeError, long, Foo5())
921
Walter Dörwald919497e2003-01-19 16:23:59 +0000922 def test_map(self):
923 self.assertEqual(
924 map(None, 'hello world'),
925 ['h','e','l','l','o',' ','w','o','r','l','d']
926 )
927 self.assertEqual(
928 map(None, 'abcd', 'efg'),
929 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
930 )
931 self.assertEqual(
932 map(None, range(10)),
933 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
934 )
935 self.assertEqual(
936 map(lambda x: x*x, range(1,4)),
937 [1, 4, 9]
938 )
939 try:
940 from math import sqrt
941 except ImportError:
942 def sqrt(x):
943 return pow(x, 0.5)
944 self.assertEqual(
945 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
946 [[4.0, 2.0], [9.0, 3.0]]
947 )
948 self.assertEqual(
949 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
950 [10, 4, 6]
951 )
952
953 def plus(*v):
954 accu = 0
955 for i in v: accu = accu + i
956 return accu
957 self.assertEqual(
958 map(plus, [1, 3, 7]),
959 [1, 3, 7]
960 )
961 self.assertEqual(
962 map(plus, [1, 3, 7], [4, 9, 2]),
963 [1+4, 3+9, 7+2]
964 )
965 self.assertEqual(
966 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
967 [1+4+1, 3+9+1, 7+2+0]
968 )
969 self.assertEqual(
970 map(None, Squares(10)),
971 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
972 )
973 self.assertEqual(
974 map(int, Squares(10)),
975 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
976 )
977 self.assertEqual(
978 map(None, Squares(3), Squares(2)),
979 [(0,0), (1,1), (4,None)]
980 )
981 self.assertEqual(
982 map(max, Squares(3), Squares(2)),
983 [0, 1, 4]
984 )
985 self.assertRaises(TypeError, map)
986 self.assertRaises(TypeError, map, lambda x: x, 42)
987 self.assertEqual(map(None, [42]), [42])
988 class BadSeq:
989 def __getitem__(self, index):
990 raise ValueError
991 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000992 def badfunc(x):
993 raise RuntimeError
994 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000995
996 def test_max(self):
997 self.assertEqual(max('123123'), '3')
998 self.assertEqual(max(1, 2, 3), 3)
999 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1000 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1001
1002 self.assertEqual(max(1, 2L, 3.0), 3.0)
1003 self.assertEqual(max(1L, 2.0, 3), 3)
1004 self.assertEqual(max(1.0, 2, 3L), 3L)
1005
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001006 for stmt in (
1007 "max(key=int)", # no args
1008 "max(1, key=int)", # single arg not iterable
1009 "max(1, 2, keystone=int)", # wrong keyword
1010 "max(1, 2, key=int, abc=int)", # two many keywords
1011 "max(1, 2, key=1)", # keyfunc is not callable
1012 ):
Tim Peters7f061872004-12-07 21:17:46 +00001013 try:
1014 exec(stmt) in globals()
1015 except TypeError:
1016 pass
1017 else:
1018 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001019
1020 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1021 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1022 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1023
1024 data = [random.randrange(200) for i in range(100)]
1025 keys = dict((elem, random.randrange(50)) for elem in data)
1026 f = keys.__getitem__
1027 self.assertEqual(max(data, key=f),
1028 sorted(reversed(data), key=f)[-1])
1029
Walter Dörwald919497e2003-01-19 16:23:59 +00001030 def test_min(self):
1031 self.assertEqual(min('123123'), '1')
1032 self.assertEqual(min(1, 2, 3), 1)
1033 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1034 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1035
1036 self.assertEqual(min(1, 2L, 3.0), 1)
1037 self.assertEqual(min(1L, 2.0, 3), 1L)
1038 self.assertEqual(min(1.0, 2, 3L), 1.0)
1039
1040 self.assertRaises(TypeError, min)
1041 self.assertRaises(TypeError, min, 42)
1042 self.assertRaises(ValueError, min, ())
1043 class BadSeq:
1044 def __getitem__(self, index):
1045 raise ValueError
1046 self.assertRaises(ValueError, min, BadSeq())
1047 class BadNumber:
1048 def __cmp__(self, other):
1049 raise ValueError
1050 self.assertRaises(ValueError, min, (42, BadNumber()))
1051
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001052 for stmt in (
1053 "min(key=int)", # no args
1054 "min(1, key=int)", # single arg not iterable
1055 "min(1, 2, keystone=int)", # wrong keyword
1056 "min(1, 2, key=int, abc=int)", # two many keywords
1057 "min(1, 2, key=1)", # keyfunc is not callable
1058 ):
Tim Peters7f061872004-12-07 21:17:46 +00001059 try:
1060 exec(stmt) in globals()
1061 except TypeError:
1062 pass
1063 else:
1064 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001065
1066 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1067 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1068 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1069
1070 data = [random.randrange(200) for i in range(100)]
1071 keys = dict((elem, random.randrange(50)) for elem in data)
1072 f = keys.__getitem__
1073 self.assertEqual(min(data, key=f),
1074 sorted(data, key=f)[0])
1075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 def test_oct(self):
1077 self.assertEqual(oct(100), '0144')
1078 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001079 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 self.assertEqual(oct(-100L), '-0144L')
1081 self.assertRaises(TypeError, oct, ())
1082
1083 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001084 fp = open(TESTFN, 'w')
1085 try:
1086 fp.write('1+1\n')
1087 fp.write('1+1\n')
1088 fp.write('The quick brown fox jumps over the lazy dog')
1089 fp.write('.\n')
1090 fp.write('Dear John\n')
1091 fp.write('XXX'*100)
1092 fp.write('YYY'*100)
1093 finally:
1094 fp.close()
1095
1096 def test_open(self):
1097 self.write_testfile()
1098 fp = open(TESTFN, 'r')
1099 try:
1100 self.assertEqual(fp.readline(4), '1+1\n')
1101 self.assertEqual(fp.readline(4), '1+1\n')
1102 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1103 self.assertEqual(fp.readline(4), 'Dear')
1104 self.assertEqual(fp.readline(100), ' John\n')
1105 self.assertEqual(fp.read(300), 'XXX'*100)
1106 self.assertEqual(fp.read(1000), 'YYY'*100)
1107 finally:
1108 fp.close()
1109 unlink(TESTFN)
1110
1111 def test_ord(self):
1112 self.assertEqual(ord(' '), 32)
1113 self.assertEqual(ord('A'), 65)
1114 self.assertEqual(ord('a'), 97)
1115 if have_unicode:
1116 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1117 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001118 if have_unicode:
1119 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001120
1121 def test_pow(self):
1122 self.assertEqual(pow(0,0), 1)
1123 self.assertEqual(pow(0,1), 0)
1124 self.assertEqual(pow(1,0), 1)
1125 self.assertEqual(pow(1,1), 1)
1126
1127 self.assertEqual(pow(2,0), 1)
1128 self.assertEqual(pow(2,10), 1024)
1129 self.assertEqual(pow(2,20), 1024*1024)
1130 self.assertEqual(pow(2,30), 1024*1024*1024)
1131
1132 self.assertEqual(pow(-2,0), 1)
1133 self.assertEqual(pow(-2,1), -2)
1134 self.assertEqual(pow(-2,2), 4)
1135 self.assertEqual(pow(-2,3), -8)
1136
1137 self.assertEqual(pow(0L,0), 1)
1138 self.assertEqual(pow(0L,1), 0)
1139 self.assertEqual(pow(1L,0), 1)
1140 self.assertEqual(pow(1L,1), 1)
1141
1142 self.assertEqual(pow(2L,0), 1)
1143 self.assertEqual(pow(2L,10), 1024)
1144 self.assertEqual(pow(2L,20), 1024*1024)
1145 self.assertEqual(pow(2L,30), 1024*1024*1024)
1146
1147 self.assertEqual(pow(-2L,0), 1)
1148 self.assertEqual(pow(-2L,1), -2)
1149 self.assertEqual(pow(-2L,2), 4)
1150 self.assertEqual(pow(-2L,3), -8)
1151
1152 self.assertAlmostEqual(pow(0.,0), 1.)
1153 self.assertAlmostEqual(pow(0.,1), 0.)
1154 self.assertAlmostEqual(pow(1.,0), 1.)
1155 self.assertAlmostEqual(pow(1.,1), 1.)
1156
1157 self.assertAlmostEqual(pow(2.,0), 1.)
1158 self.assertAlmostEqual(pow(2.,10), 1024.)
1159 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1160 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1161
1162 self.assertAlmostEqual(pow(-2.,0), 1.)
1163 self.assertAlmostEqual(pow(-2.,1), -2.)
1164 self.assertAlmostEqual(pow(-2.,2), 4.)
1165 self.assertAlmostEqual(pow(-2.,3), -8.)
1166
1167 for x in 2, 2L, 2.0:
1168 for y in 10, 10L, 10.0:
1169 for z in 1000, 1000L, 1000.0:
1170 if isinstance(x, float) or \
1171 isinstance(y, float) or \
1172 isinstance(z, float):
1173 self.assertRaises(TypeError, pow, x, y, z)
1174 else:
1175 self.assertAlmostEqual(pow(x, y, z), 24.0)
1176
1177 self.assertRaises(TypeError, pow, -1, -2, 3)
1178 self.assertRaises(ValueError, pow, 1, 2, 0)
1179 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1180 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1181 self.assertRaises(ValueError, pow, -342.43, 0.234)
1182
1183 self.assertRaises(TypeError, pow)
1184
1185 def test_range(self):
1186 self.assertEqual(range(3), [0, 1, 2])
1187 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1188 self.assertEqual(range(0), [])
1189 self.assertEqual(range(-3), [])
1190 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1191 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1192
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001193 # Now test range() with longs
1194 self.assertEqual(range(-2**100), [])
1195 self.assertEqual(range(0, -2**100), [])
1196 self.assertEqual(range(0, 2**100, -1), [])
1197 self.assertEqual(range(0, 2**100, -1), [])
1198
1199 a = long(10 * sys.maxint)
1200 b = long(100 * sys.maxint)
1201 c = long(50 * sys.maxint)
1202
1203 self.assertEqual(range(a, a+2), [a, a+1])
1204 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1205 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1206
1207 seq = range(a, b, c)
1208 self.assert_(a in seq)
1209 self.assert_(b not in seq)
1210 self.assertEqual(len(seq), 2)
1211
1212 seq = range(b, a, -c)
1213 self.assert_(b in seq)
1214 self.assert_(a not in seq)
1215 self.assertEqual(len(seq), 2)
1216
1217 seq = range(-a, -b, -c)
1218 self.assert_(-a in seq)
1219 self.assert_(-b not in seq)
1220 self.assertEqual(len(seq), 2)
1221
Walter Dörwald919497e2003-01-19 16:23:59 +00001222 self.assertRaises(TypeError, range)
1223 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1224 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001225 self.assertRaises(ValueError, range, a, a + 1, long(0))
1226
1227 class badzero(int):
1228 def __cmp__(self, other):
1229 raise RuntimeError
1230 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001231
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001232 # Reject floats when it would require PyLongs to represent.
1233 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001234 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001235
Walter Dörwald357981e2003-04-15 18:59:28 +00001236 self.assertRaises(TypeError, range, 0, "spam")
1237 self.assertRaises(TypeError, range, 0, 42, "spam")
1238
1239 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1240 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1241
Walter Dörwald919497e2003-01-19 16:23:59 +00001242 def test_reduce(self):
1243 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1244 self.assertEqual(
1245 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1246 ['a','c','d','w']
1247 )
1248 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1249 self.assertEqual(
1250 reduce(lambda x, y: x*y, range(2,21), 1L),
1251 2432902008176640000L
1252 )
1253 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1254 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1255 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1256 self.assertRaises(TypeError, reduce)
1257 self.assertRaises(TypeError, reduce, 42, 42)
1258 self.assertRaises(TypeError, reduce, 42, 42, 42)
1259 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1260 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1261 self.assertRaises(TypeError, reduce, 42, (42, 42))
1262
1263 class BadSeq:
1264 def __getitem__(self, index):
1265 raise ValueError
1266 self.assertRaises(ValueError, reduce, 42, BadSeq())
1267
1268 def test_reload(self):
1269 import marshal
1270 reload(marshal)
1271 import string
1272 reload(string)
1273 ## import sys
1274 ## self.assertRaises(ImportError, reload, sys)
1275
1276 def test_repr(self):
1277 self.assertEqual(repr(''), '\'\'')
1278 self.assertEqual(repr(0), '0')
1279 self.assertEqual(repr(0L), '0L')
1280 self.assertEqual(repr(()), '()')
1281 self.assertEqual(repr([]), '[]')
1282 self.assertEqual(repr({}), '{}')
1283 a = []
1284 a.append(a)
1285 self.assertEqual(repr(a), '[[...]]')
1286 a = {}
1287 a[0] = a
1288 self.assertEqual(repr(a), '{0: {...}}')
1289
1290 def test_round(self):
1291 self.assertEqual(round(0.0), 0.0)
1292 self.assertEqual(round(1.0), 1.0)
1293 self.assertEqual(round(10.0), 10.0)
1294 self.assertEqual(round(1000000000.0), 1000000000.0)
1295 self.assertEqual(round(1e20), 1e20)
1296
1297 self.assertEqual(round(-1.0), -1.0)
1298 self.assertEqual(round(-10.0), -10.0)
1299 self.assertEqual(round(-1000000000.0), -1000000000.0)
1300 self.assertEqual(round(-1e20), -1e20)
1301
1302 self.assertEqual(round(0.1), 0.0)
1303 self.assertEqual(round(1.1), 1.0)
1304 self.assertEqual(round(10.1), 10.0)
1305 self.assertEqual(round(1000000000.1), 1000000000.0)
1306
1307 self.assertEqual(round(-1.1), -1.0)
1308 self.assertEqual(round(-10.1), -10.0)
1309 self.assertEqual(round(-1000000000.1), -1000000000.0)
1310
1311 self.assertEqual(round(0.9), 1.0)
1312 self.assertEqual(round(9.9), 10.0)
1313 self.assertEqual(round(999999999.9), 1000000000.0)
1314
1315 self.assertEqual(round(-0.9), -1.0)
1316 self.assertEqual(round(-9.9), -10.0)
1317 self.assertEqual(round(-999999999.9), -1000000000.0)
1318
1319 self.assertEqual(round(-8.0, -1), -10.0)
1320
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001321 # test new kwargs
1322 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1323
Walter Dörwald919497e2003-01-19 16:23:59 +00001324 self.assertRaises(TypeError, round)
1325
1326 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001327 setattr(sys, 'spam', 1)
1328 self.assertEqual(sys.spam, 1)
1329 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1330 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001331
1332 def test_str(self):
1333 self.assertEqual(str(''), '')
1334 self.assertEqual(str(0), '0')
1335 self.assertEqual(str(0L), '0')
1336 self.assertEqual(str(()), '()')
1337 self.assertEqual(str([]), '[]')
1338 self.assertEqual(str({}), '{}')
1339 a = []
1340 a.append(a)
1341 self.assertEqual(str(a), '[[...]]')
1342 a = {}
1343 a[0] = a
1344 self.assertEqual(str(a), '{0: {...}}')
1345
Alex Martellia70b1912003-04-22 08:12:33 +00001346 def test_sum(self):
1347 self.assertEqual(sum([]), 0)
1348 self.assertEqual(sum(range(2,8)), 27)
1349 self.assertEqual(sum(iter(range(2,8))), 27)
1350 self.assertEqual(sum(Squares(10)), 285)
1351 self.assertEqual(sum(iter(Squares(10))), 285)
1352 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1353
1354 self.assertRaises(TypeError, sum)
1355 self.assertRaises(TypeError, sum, 42)
1356 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1357 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1358 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1359 self.assertRaises(TypeError, sum, [{2:3}])
1360 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1361
1362 class BadSeq:
1363 def __getitem__(self, index):
1364 raise ValueError
1365 self.assertRaises(ValueError, sum, BadSeq())
1366
Walter Dörwald919497e2003-01-19 16:23:59 +00001367 def test_tuple(self):
1368 self.assertEqual(tuple(()), ())
1369 t0_3 = (0, 1, 2, 3)
1370 t0_3_bis = tuple(t0_3)
1371 self.assert_(t0_3 is t0_3_bis)
1372 self.assertEqual(tuple([]), ())
1373 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1374 self.assertEqual(tuple(''), ())
1375 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1376
1377 def test_type(self):
1378 self.assertEqual(type(''), type('123'))
1379 self.assertNotEqual(type(''), type(()))
1380
1381 def test_unichr(self):
1382 if have_unicode:
1383 self.assertEqual(unichr(32), unicode(' '))
1384 self.assertEqual(unichr(65), unicode('A'))
1385 self.assertEqual(unichr(97), unicode('a'))
1386 self.assertEqual(
1387 unichr(sys.maxunicode),
1388 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1389 )
1390 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1391 self.assertRaises(TypeError, unichr)
1392
Guido van Rossumfee7b932005-01-16 00:21:28 +00001393 # We don't want self in vars(), so these are static methods
1394
1395 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001396 def get_vars_f0():
1397 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001398
Guido van Rossumfee7b932005-01-16 00:21:28 +00001399 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001400 def get_vars_f2():
1401 BuiltinTest.get_vars_f0()
1402 a = 1
1403 b = 2
1404 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001405
1406 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001407 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001408 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001409 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001410 self.assertEqual(self.get_vars_f0(), {})
1411 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1412 self.assertRaises(TypeError, vars, 42, 42)
1413 self.assertRaises(TypeError, vars, 42)
1414
1415 def test_zip(self):
1416 a = (1, 2, 3)
1417 b = (4, 5, 6)
1418 t = [(1, 4), (2, 5), (3, 6)]
1419 self.assertEqual(zip(a, b), t)
1420 b = [4, 5, 6]
1421 self.assertEqual(zip(a, b), t)
1422 b = (4, 5, 6, 7)
1423 self.assertEqual(zip(a, b), t)
1424 class I:
1425 def __getitem__(self, i):
1426 if i < 0 or i > 2: raise IndexError
1427 return i + 4
1428 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001429 self.assertEqual(zip(), [])
1430 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001431 self.assertRaises(TypeError, zip, None)
1432 class G:
1433 pass
1434 self.assertRaises(TypeError, zip, a, G())
1435
1436 # Make sure zip doesn't try to allocate a billion elements for the
1437 # result list when one of its arguments doesn't say how long it is.
1438 # A MemoryError is the most likely failure mode.
1439 class SequenceWithoutALength:
1440 def __getitem__(self, i):
1441 if i == 5:
1442 raise IndexError
1443 else:
1444 return i
1445 self.assertEqual(
1446 zip(SequenceWithoutALength(), xrange(2**30)),
1447 list(enumerate(range(5)))
1448 )
1449
1450 class BadSeq:
1451 def __getitem__(self, i):
1452 if i == 5:
1453 raise ValueError
1454 else:
1455 return i
1456 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1457
Raymond Hettinger64958a12003-12-17 20:43:33 +00001458class TestSorted(unittest.TestCase):
1459
1460 def test_basic(self):
1461 data = range(100)
1462 copy = data[:]
1463 random.shuffle(copy)
1464 self.assertEqual(data, sorted(copy))
1465 self.assertNotEqual(data, copy)
1466
1467 data.reverse()
1468 random.shuffle(copy)
1469 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1470 self.assertNotEqual(data, copy)
1471 random.shuffle(copy)
1472 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1473 self.assertNotEqual(data, copy)
1474 random.shuffle(copy)
1475 self.assertEqual(data, sorted(copy, reverse=1))
1476 self.assertNotEqual(data, copy)
1477
1478 def test_inputtypes(self):
1479 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001480 types = [list, tuple]
1481 if have_unicode:
1482 types.insert(0, unicode)
1483 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001484 self.assertEqual(sorted(s), sorted(T(s)))
1485
1486 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001487 types = [set, frozenset, list, tuple, dict.fromkeys]
1488 if have_unicode:
1489 types.insert(0, unicode)
1490 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001491 self.assertEqual(sorted(s), sorted(T(s)))
1492
1493 def test_baddecorator(self):
1494 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1495 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1496
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001497def test_main(verbose=None):
1498 test_classes = (BuiltinTest, TestSorted)
1499
1500 run_unittest(*test_classes)
1501
1502 # verify reference counting
1503 if verbose and hasattr(sys, "gettotalrefcount"):
1504 import gc
1505 counts = [None] * 5
1506 for i in xrange(len(counts)):
1507 run_unittest(*test_classes)
1508 gc.collect()
1509 counts[i] = sys.gettotalrefcount()
1510 print counts
1511
Walter Dörwald919497e2003-01-19 16:23:59 +00001512
1513if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001514 test_main(verbose=True)