blob: c8a4822c7f5374c5233130343fb3b142fead9244 [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)
111
112 def test_abs(self):
113 # int
114 self.assertEqual(abs(0), 0)
115 self.assertEqual(abs(1234), 1234)
116 self.assertEqual(abs(-1234), 1234)
117 # float
118 self.assertEqual(abs(0.0), 0.0)
119 self.assertEqual(abs(3.14), 3.14)
120 self.assertEqual(abs(-3.14), 3.14)
121 # long
122 self.assertEqual(abs(0L), 0L)
123 self.assertEqual(abs(1234L), 1234L)
124 self.assertEqual(abs(-1234L), 1234L)
125 # str
126 self.assertRaises(TypeError, abs, 'a')
127
Raymond Hettinger96229b12005-03-11 06:49:40 +0000128 def test_all(self):
129 self.assertEqual(all([2, 4, 6]), True)
130 self.assertEqual(all([2, None, 6]), False)
131 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
132 self.assertRaises(RuntimeError, all, TestFailingIter())
133 self.assertRaises(TypeError, all, 10) # Non-iterable
134 self.assertRaises(TypeError, all) # No args
135 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
136 self.assertEqual(all([]), True) # Empty iterator
137 S = [50, 60]
138 self.assertEqual(all(x > 42 for x in S), True)
139 S = [50, 40, 60]
140 self.assertEqual(all(x > 42 for x in S), False)
141
142 def test_any(self):
143 self.assertEqual(any([None, None, None]), False)
144 self.assertEqual(any([None, 4, None]), True)
145 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
146 self.assertRaises(RuntimeError, all, TestFailingIter())
147 self.assertRaises(TypeError, any, 10) # Non-iterable
148 self.assertRaises(TypeError, any) # No args
149 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
150 self.assertEqual(any([]), False) # Empty iterator
151 S = [40, 60, 30]
152 self.assertEqual(any(x > 42 for x in S), True)
153 S = [10, 20, 30]
154 self.assertEqual(any(x > 42 for x in S), False)
155
Walter Dörwald919497e2003-01-19 16:23:59 +0000156 def test_apply(self):
157 def f0(*args):
158 self.assertEqual(args, ())
159 def f1(a1):
160 self.assertEqual(a1, 1)
161 def f2(a1, a2):
162 self.assertEqual(a1, 1)
163 self.assertEqual(a2, 2)
164 def f3(a1, a2, a3):
165 self.assertEqual(a1, 1)
166 self.assertEqual(a2, 2)
167 self.assertEqual(a3, 3)
168 apply(f0, ())
169 apply(f1, (1,))
170 apply(f2, (1, 2))
171 apply(f3, (1, 2, 3))
172
173 # A PyCFunction that takes only positional parameters should allow an
174 # empty keyword dictionary to pass without a complaint, but raise a
175 # TypeError if the dictionary is non-empty.
176 apply(id, (1,), {})
177 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
178 self.assertRaises(TypeError, apply)
179 self.assertRaises(TypeError, apply, id, 42)
180 self.assertRaises(TypeError, apply, id, (42,), 42)
181
182 def test_callable(self):
183 self.assert_(callable(len))
184 def f(): pass
185 self.assert_(callable(f))
186 class C:
187 def meth(self): pass
188 self.assert_(callable(C))
189 x = C()
190 self.assert_(callable(x.meth))
191 self.assert_(not callable(x))
192 class D(C):
193 def __call__(self): pass
194 y = D()
195 self.assert_(callable(y))
196 y()
197
198 def test_chr(self):
199 self.assertEqual(chr(32), ' ')
200 self.assertEqual(chr(65), 'A')
201 self.assertEqual(chr(97), 'a')
202 self.assertEqual(chr(0xff), '\xff')
203 self.assertRaises(ValueError, chr, 256)
204 self.assertRaises(TypeError, chr)
205
206 def test_cmp(self):
207 self.assertEqual(cmp(-1, 1), -1)
208 self.assertEqual(cmp(1, -1), 1)
209 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000210 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 a = []; a.append(a)
212 b = []; b.append(b)
213 from UserList import UserList
214 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000215 self.assertRaises(RuntimeError, cmp, a, b)
216 self.assertRaises(RuntimeError, cmp, b, c)
217 self.assertRaises(RuntimeError, cmp, c, a)
218 self.assertRaises(RuntimeError, cmp, a, c)
219 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 a.pop(); b.pop(); c.pop()
221 self.assertRaises(TypeError, cmp)
222
223 def test_coerce(self):
224 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
225 self.assertEqual(coerce(1, 1L), (1L, 1L))
226 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
227 self.assertRaises(TypeError, coerce)
228 class BadNumber:
229 def __coerce__(self, other):
230 raise ValueError
231 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000232 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000233
234 def test_compile(self):
235 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000236 bom = '\xef\xbb\xbf'
237 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000238 self.assertRaises(TypeError, compile)
239 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
240 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000241 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000242 if have_unicode:
243 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000244 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
245 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000246
Walter Dörwald919497e2003-01-19 16:23:59 +0000247 def test_delattr(self):
248 import sys
249 sys.spam = 1
250 delattr(sys, 'spam')
251 self.assertRaises(TypeError, delattr)
252
253 def test_dir(self):
254 x = 1
255 self.assert_('x' in dir())
256 import sys
257 self.assert_('modules' in dir(sys))
258 self.assertRaises(TypeError, dir, 42, 42)
259
260 def test_divmod(self):
261 self.assertEqual(divmod(12, 7), (1, 5))
262 self.assertEqual(divmod(-12, 7), (-2, 2))
263 self.assertEqual(divmod(12, -7), (-2, -2))
264 self.assertEqual(divmod(-12, -7), (1, -5))
265
266 self.assertEqual(divmod(12L, 7L), (1L, 5L))
267 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
268 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
269 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
270
271 self.assertEqual(divmod(12, 7L), (1, 5L))
272 self.assertEqual(divmod(-12, 7L), (-2, 2L))
273 self.assertEqual(divmod(12L, -7), (-2L, -2))
274 self.assertEqual(divmod(-12L, -7), (1L, -5))
275
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000276 self.assertEqual(divmod(-sys.maxint-1, -1),
277 (sys.maxint+1, 0))
278
Walter Dörwald919497e2003-01-19 16:23:59 +0000279 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
280 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
281 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
282 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
283
284 self.assertRaises(TypeError, divmod)
285
286 def test_eval(self):
287 self.assertEqual(eval('1+1'), 2)
288 self.assertEqual(eval(' 1+1\n'), 2)
289 globals = {'a': 1, 'b': 2}
290 locals = {'b': 200, 'c': 300}
291 self.assertEqual(eval('a', globals) , 1)
292 self.assertEqual(eval('a', globals, locals), 1)
293 self.assertEqual(eval('b', globals, locals), 200)
294 self.assertEqual(eval('c', globals, locals), 300)
295 if have_unicode:
296 self.assertEqual(eval(unicode('1+1')), 2)
297 self.assertEqual(eval(unicode(' 1+1\n')), 2)
298 globals = {'a': 1, 'b': 2}
299 locals = {'b': 200, 'c': 300}
300 if have_unicode:
301 self.assertEqual(eval(unicode('a'), globals), 1)
302 self.assertEqual(eval(unicode('a'), globals, locals), 1)
303 self.assertEqual(eval(unicode('b'), globals, locals), 200)
304 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000305 bom = '\xef\xbb\xbf'
306 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000307 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
308 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000309 self.assertRaises(TypeError, eval)
310 self.assertRaises(TypeError, eval, ())
311
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000312 def test_general_eval(self):
313 # Tests that general mappings can be used for the locals argument
314
315 class M:
316 "Test mapping interface versus possible calls from eval()."
317 def __getitem__(self, key):
318 if key == 'a':
319 return 12
320 raise KeyError
321 def keys(self):
322 return list('xyz')
323
324 m = M()
325 g = globals()
326 self.assertEqual(eval('a', g, m), 12)
327 self.assertRaises(NameError, eval, 'b', g, m)
328 self.assertEqual(eval('dir()', g, m), list('xyz'))
329 self.assertEqual(eval('globals()', g, m), g)
330 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000331 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000332 class A:
333 "Non-mapping"
334 pass
335 m = A()
336 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000337
338 # Verify that dict subclasses work as well
339 class D(dict):
340 def __getitem__(self, key):
341 if key == 'a':
342 return 12
343 return dict.__getitem__(self, key)
344 def keys(self):
345 return list('xyz')
346
347 d = D()
348 self.assertEqual(eval('a', g, d), 12)
349 self.assertRaises(NameError, eval, 'b', g, d)
350 self.assertEqual(eval('dir()', g, d), list('xyz'))
351 self.assertEqual(eval('globals()', g, d), g)
352 self.assertEqual(eval('locals()', g, d), d)
353
354 # Verify locals stores (used by list comps)
355 eval('[locals() for i in (2,3)]', g, d)
356 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
357
358 class SpreadSheet:
359 "Sample application showing nested, calculated lookups."
360 _cells = {}
361 def __setitem__(self, key, formula):
362 self._cells[key] = formula
363 def __getitem__(self, key ):
364 return eval(self._cells[key], globals(), self)
365
366 ss = SpreadSheet()
367 ss['a1'] = '5'
368 ss['a2'] = 'a1*6'
369 ss['a3'] = 'a2*7'
370 self.assertEqual(ss['a3'], 210)
371
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000372 # Verify that dir() catches a non-list returned by eval
373 # SF bug #1004669
374 class C:
375 def __getitem__(self, item):
376 raise KeyError(item)
377 def keys(self):
378 return 'a'
379 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
380
Walter Dörwald919497e2003-01-19 16:23:59 +0000381 # Done outside of the method test_z to get the correct scope
382 z = 0
383 f = open(TESTFN, 'w')
384 f.write('z = z+1\n')
385 f.write('z = z*2\n')
386 f.close()
387 execfile(TESTFN)
388
389 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000390 global numruns
391 if numruns:
392 return
393 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000394
Walter Dörwald919497e2003-01-19 16:23:59 +0000395 globals = {'a': 1, 'b': 2}
396 locals = {'b': 200, 'c': 300}
397
398 self.assertEqual(self.__class__.z, 2)
399 globals['z'] = 0
400 execfile(TESTFN, globals)
401 self.assertEqual(globals['z'], 2)
402 locals['z'] = 0
403 execfile(TESTFN, globals, locals)
404 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000405
406 class M:
407 "Test mapping interface versus possible calls from execfile()."
408 def __init__(self):
409 self.z = 10
410 def __getitem__(self, key):
411 if key == 'z':
412 return self.z
413 raise KeyError
414 def __setitem__(self, key, value):
415 if key == 'z':
416 self.z = value
417 return
418 raise KeyError
419
420 locals = M()
421 locals['z'] = 0
422 execfile(TESTFN, globals, locals)
423 self.assertEqual(locals['z'], 2)
424
Walter Dörwald919497e2003-01-19 16:23:59 +0000425 unlink(TESTFN)
426 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000427 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 import os
429 self.assertRaises(IOError, execfile, os.curdir)
430 self.assertRaises(IOError, execfile, "I_dont_exist")
431
432 def test_filter(self):
433 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
434 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
435 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
436 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
437 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
438 def identity(item):
439 return 1
440 filter(identity, Squares(5))
441 self.assertRaises(TypeError, filter)
442 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000443 def __getitem__(self, index):
444 if index<4:
445 return 42
446 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000447 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
448 def badfunc():
449 pass
450 self.assertRaises(TypeError, filter, badfunc, range(5))
451
Walter Dörwaldbf517072003-01-27 15:57:14 +0000452 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 self.assertEqual(filter(None, (1, 2)), (1, 2))
454 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
455 self.assertRaises(TypeError, filter, 42, (1, 2))
456
Walter Dörwaldbf517072003-01-27 15:57:14 +0000457 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000458 self.assertEqual(filter(None, "12"), "12")
459 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
460 self.assertRaises(TypeError, filter, 42, "12")
461 class badstr(str):
462 def __getitem__(self, index):
463 raise ValueError
464 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000465
Walter Dörwald903f1e02003-02-04 16:28:00 +0000466 class badstr2(str):
467 def __getitem__(self, index):
468 return 42
469 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
470
471 class weirdstr(str):
472 def __getitem__(self, index):
473 return weirdstr(2*str.__getitem__(self, index))
474 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
475
Walter Dörwald5e61e242003-02-04 17:04:01 +0000476 class shiftstr(str):
477 def __getitem__(self, index):
478 return chr(ord(str.__getitem__(self, index))+1)
479 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
480
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000481 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000482 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000483 self.assertEqual(filter(None, unicode("12")), unicode("12"))
484 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
485 self.assertRaises(TypeError, filter, 42, unicode("12"))
486 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000487
Walter Dörwald903f1e02003-02-04 16:28:00 +0000488 class badunicode(unicode):
489 def __getitem__(self, index):
490 return 42
491 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
492
493 class weirdunicode(unicode):
494 def __getitem__(self, index):
495 return weirdunicode(2*unicode.__getitem__(self, index))
496 self.assertEqual(
497 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
498
Walter Dörwald5e61e242003-02-04 17:04:01 +0000499 class shiftunicode(unicode):
500 def __getitem__(self, index):
501 return unichr(ord(unicode.__getitem__(self, index))+1)
502 self.assertEqual(
503 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
504 unicode("345")
505 )
506
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000507 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000508 # test that filter() never returns tuple, str or unicode subclasses
509 # and that the result always goes through __getitem__
510 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000511 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000512 def __getitem__(self, index):
513 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000514 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000515 def __getitem__(self, index):
516 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000517 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000518 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000519 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000520 }
521 if have_unicode:
522 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000523 def __getitem__(self, index):
524 return 2*unicode.__getitem__(self, index)
525 inputs[unicode2] = {
526 unicode(): unicode(),
527 unicode("123"): unicode("112233")
528 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000529
Walter Dörwald1918f772003-02-10 13:19:13 +0000530 for (cls, inps) in inputs.iteritems():
531 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000532 # make sure the output goes through __getitem__
533 # even if func is None
534 self.assertEqual(
535 filter(funcs[0], cls(inp)),
536 filter(funcs[1], cls(inp))
537 )
538 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000539 outp = filter(func, cls(inp))
540 self.assertEqual(outp, exp)
541 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000542
Walter Dörwald919497e2003-01-19 16:23:59 +0000543 def test_float(self):
544 self.assertEqual(float(3.14), 3.14)
545 self.assertEqual(float(314), 314.0)
546 self.assertEqual(float(314L), 314.0)
547 self.assertEqual(float(" 3.14 "), 3.14)
548 if have_unicode:
549 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
550 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000551 # Implementation limitation in PyFloat_FromString()
552 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000553
Neal Norwitz5898fa22005-11-22 05:17:40 +0000554 def test_float_with_comma(self):
555 # set locale to something that doesn't use '.' for the decimal point
556 try:
557 import locale
558 orig_locale = locale.setlocale(locale.LC_NUMERIC, '')
559 locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
560 except:
561 # if we can't set the locale, just ignore this test
562 return
563
564 try:
565 self.assertEqual(locale.localeconv()['decimal_point'], ',')
566 except:
567 # this test is worthless, just skip it and reset the locale
568 locale.setlocale(locale.LC_NUMERIC, orig_locale)
569 return
570
571 try:
572 self.assertEqual(float(" 3,14 "), 3.14)
573 self.assertEqual(float(" +3,14 "), 3.14)
574 self.assertEqual(float(" -3,14 "), -3.14)
575 self.assertEqual(float(" 0x3.1 "), 3.0625)
576 self.assertEqual(float(" -0x3.p-1 "), -1.5)
577 self.assertEqual(float(" 25.e-1 "), 2.5)
578 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
579 finally:
580 locale.setlocale(locale.LC_NUMERIC, orig_locale)
581
Brett Cannonc3647ac2005-04-26 03:45:26 +0000582 def test_floatconversion(self):
583 # Make sure that calls to __float__() work properly
584 class Foo0:
585 def __float__(self):
586 return 42.
587
588 class Foo1(object):
589 def __float__(self):
590 return 42.
591
592 class Foo2(float):
593 def __float__(self):
594 return 42.
595
596 class Foo3(float):
597 def __new__(cls, value=0.):
598 return float.__new__(cls, 2*value)
599
600 def __float__(self):
601 return self
602
603 class Foo4(float):
604 def __float__(self):
605 return 42
606
607 self.assertAlmostEqual(float(Foo0()), 42.)
608 self.assertAlmostEqual(float(Foo1()), 42.)
609 self.assertAlmostEqual(float(Foo2()), 42.)
610 self.assertAlmostEqual(float(Foo3(21)), 42.)
611 self.assertRaises(TypeError, float, Foo4(42))
612
Walter Dörwald919497e2003-01-19 16:23:59 +0000613 def test_getattr(self):
614 import sys
615 self.assert_(getattr(sys, 'stdout') is sys.stdout)
616 self.assertRaises(TypeError, getattr, sys, 1)
617 self.assertRaises(TypeError, getattr, sys, 1, "foo")
618 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000619 if have_unicode:
620 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000621
622 def test_hasattr(self):
623 import sys
624 self.assert_(hasattr(sys, 'stdout'))
625 self.assertRaises(TypeError, hasattr, sys, 1)
626 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000627 if have_unicode:
628 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000629
630 def test_hash(self):
631 hash(None)
632 self.assertEqual(hash(1), hash(1L))
633 self.assertEqual(hash(1), hash(1.0))
634 hash('spam')
635 if have_unicode:
636 self.assertEqual(hash('spam'), hash(unicode('spam')))
637 hash((0,1,2,3))
638 def f(): pass
639 self.assertRaises(TypeError, hash, [])
640 self.assertRaises(TypeError, hash, {})
641
642 def test_hex(self):
643 self.assertEqual(hex(16), '0x10')
644 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000645 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000646 self.assertEqual(hex(-16L), '-0x10L')
647 self.assertRaises(TypeError, hex, {})
648
649 def test_id(self):
650 id(None)
651 id(1)
652 id(1L)
653 id(1.0)
654 id('spam')
655 id((0,1,2,3))
656 id([0,1,2,3])
657 id({'spam': 1, 'eggs': 2, 'ham': 3})
658
659 # Test input() later, together with raw_input
660
661 def test_int(self):
662 self.assertEqual(int(314), 314)
663 self.assertEqual(int(3.14), 3)
664 self.assertEqual(int(314L), 314)
665 # Check that conversion from float truncates towards zero
666 self.assertEqual(int(-3.14), -3)
667 self.assertEqual(int(3.9), 3)
668 self.assertEqual(int(-3.9), -3)
669 self.assertEqual(int(3.5), 3)
670 self.assertEqual(int(-3.5), -3)
671 # Different base:
672 self.assertEqual(int("10",16), 16L)
673 if have_unicode:
674 self.assertEqual(int(unicode("10"),16), 16L)
675 # Test conversion from strings and various anomalies
676 for s, v in L:
677 for sign in "", "+", "-":
678 for prefix in "", " ", "\t", " \t\t ":
679 ss = prefix + sign + s
680 vv = v
681 if sign == "-" and v is not ValueError:
682 vv = -v
683 try:
684 self.assertEqual(int(ss), vv)
685 except v:
686 pass
687
Walter Dörwald70a6b492004-02-12 17:35:32 +0000688 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000689 self.assertEqual(int(s)+1, -sys.maxint)
690 # should return long
691 int(s[1:])
692
693 # should return long
694 x = int(1e100)
695 self.assert_(isinstance(x, long))
696 x = int(-1e100)
697 self.assert_(isinstance(x, long))
698
699
700 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
701 # Worked by accident in Windows release build, but failed in debug build.
702 # Failed in all Linux builds.
703 x = -1-sys.maxint
704 self.assertEqual(x >> 1, x//2)
705
706 self.assertRaises(ValueError, int, '123\0')
707 self.assertRaises(ValueError, int, '53', 40)
708
709 x = int('1' * 600)
710 self.assert_(isinstance(x, long))
711
712 if have_unicode:
713 x = int(unichr(0x661) * 600)
714 self.assert_(isinstance(x, long))
715
716 self.assertRaises(TypeError, int, 1, 12)
717
718 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000719 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000720
Brett Cannonc3647ac2005-04-26 03:45:26 +0000721 def test_intconversion(self):
722 # Test __int__()
723 class Foo0:
724 def __int__(self):
725 return 42
726
727 class Foo1(object):
728 def __int__(self):
729 return 42
730
731 class Foo2(int):
732 def __int__(self):
733 return 42
734
735 class Foo3(int):
736 def __int__(self):
737 return self
738
739 class Foo4(int):
740 def __int__(self):
741 return 42L
742
743 class Foo5(int):
744 def __int__(self):
745 return 42.
746
747 self.assertEqual(int(Foo0()), 42)
748 self.assertEqual(int(Foo1()), 42)
749 self.assertEqual(int(Foo2()), 42)
750 self.assertEqual(int(Foo3()), 0)
751 self.assertEqual(int(Foo4()), 42L)
752 self.assertRaises(TypeError, int, Foo5())
753
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 def test_intern(self):
755 self.assertRaises(TypeError, intern)
756 s = "never interned before"
757 self.assert_(intern(s) is s)
758 s2 = s.swapcase().swapcase()
759 self.assert_(intern(s2) is s)
760
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000761 # Subclasses of string can't be interned, because they
762 # provide too much opportunity for insane things to happen.
763 # We don't want them in the interned dict and if they aren't
764 # actually interned, we don't want to create the appearance
765 # that they are by allowing intern() to succeeed.
766 class S(str):
767 def __hash__(self):
768 return 123
769
770 self.assertRaises(TypeError, intern, S("abc"))
771
772 # It's still safe to pass these strings to routines that
773 # call intern internally, e.g. PyObject_SetAttr().
774 s = S("abc")
775 setattr(s, s, s)
776 self.assertEqual(getattr(s, s), s)
777
Walter Dörwald919497e2003-01-19 16:23:59 +0000778 def test_iter(self):
779 self.assertRaises(TypeError, iter)
780 self.assertRaises(TypeError, iter, 42, 42)
781 lists = [("1", "2"), ["1", "2"], "12"]
782 if have_unicode:
783 lists.append(unicode("12"))
784 for l in lists:
785 i = iter(l)
786 self.assertEqual(i.next(), '1')
787 self.assertEqual(i.next(), '2')
788 self.assertRaises(StopIteration, i.next)
789
790 def test_isinstance(self):
791 class C:
792 pass
793 class D(C):
794 pass
795 class E:
796 pass
797 c = C()
798 d = D()
799 e = E()
800 self.assert_(isinstance(c, C))
801 self.assert_(isinstance(d, C))
802 self.assert_(not isinstance(e, C))
803 self.assert_(not isinstance(c, D))
804 self.assert_(not isinstance('foo', E))
805 self.assertRaises(TypeError, isinstance, E, 'foo')
806 self.assertRaises(TypeError, isinstance)
807
808 def test_issubclass(self):
809 class C:
810 pass
811 class D(C):
812 pass
813 class E:
814 pass
815 c = C()
816 d = D()
817 e = E()
818 self.assert_(issubclass(D, C))
819 self.assert_(issubclass(C, C))
820 self.assert_(not issubclass(C, D))
821 self.assertRaises(TypeError, issubclass, 'foo', E)
822 self.assertRaises(TypeError, issubclass, E, 'foo')
823 self.assertRaises(TypeError, issubclass)
824
825 def test_len(self):
826 self.assertEqual(len('123'), 3)
827 self.assertEqual(len(()), 0)
828 self.assertEqual(len((1, 2, 3, 4)), 4)
829 self.assertEqual(len([1, 2, 3, 4]), 4)
830 self.assertEqual(len({}), 0)
831 self.assertEqual(len({'a':1, 'b': 2}), 2)
832 class BadSeq:
833 def __len__(self):
834 raise ValueError
835 self.assertRaises(ValueError, len, BadSeq())
836
837 def test_list(self):
838 self.assertEqual(list([]), [])
839 l0_3 = [0, 1, 2, 3]
840 l0_3_bis = list(l0_3)
841 self.assertEqual(l0_3, l0_3_bis)
842 self.assert_(l0_3 is not l0_3_bis)
843 self.assertEqual(list(()), [])
844 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
845 self.assertEqual(list(''), [])
846 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
847
848 if sys.maxint == 0x7fffffff:
849 # This test can currently only work on 32-bit machines.
850 # XXX If/when PySequence_Length() returns a ssize_t, it should be
851 # XXX re-enabled.
852 # Verify clearing of bug #556025.
853 # This assumes that the max data size (sys.maxint) == max
854 # address size this also assumes that the address size is at
855 # least 4 bytes with 8 byte addresses, the bug is not well
856 # tested
857 #
858 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
859 # earlier due to a newlib bug. See the following mailing list
860 # thread for the details:
861
862 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
863 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
864
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000865 # This code used to segfault in Py2.4a3
866 x = []
867 x.extend(-y for y in x)
868 self.assertEqual(x, [])
869
Walter Dörwald919497e2003-01-19 16:23:59 +0000870 def test_long(self):
871 self.assertEqual(long(314), 314L)
872 self.assertEqual(long(3.14), 3L)
873 self.assertEqual(long(314L), 314L)
874 # Check that conversion from float truncates towards zero
875 self.assertEqual(long(-3.14), -3L)
876 self.assertEqual(long(3.9), 3L)
877 self.assertEqual(long(-3.9), -3L)
878 self.assertEqual(long(3.5), 3L)
879 self.assertEqual(long(-3.5), -3L)
880 self.assertEqual(long("-3"), -3L)
881 if have_unicode:
882 self.assertEqual(long(unicode("-3")), -3L)
883 # Different base:
884 self.assertEqual(long("10",16), 16L)
885 if have_unicode:
886 self.assertEqual(long(unicode("10"),16), 16L)
887 # Check conversions from string (same test set as for int(), and then some)
888 LL = [
889 ('1' + '0'*20, 10L**20),
890 ('1' + '0'*100, 10L**100)
891 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000892 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000893 if have_unicode:
894 L2 += [
895 (unicode('1') + unicode('0')*20, 10L**20),
896 (unicode('1') + unicode('0')*100, 10L**100),
897 ]
898 for s, v in L2 + LL:
899 for sign in "", "+", "-":
900 for prefix in "", " ", "\t", " \t\t ":
901 ss = prefix + sign + s
902 vv = v
903 if sign == "-" and v is not ValueError:
904 vv = -v
905 try:
906 self.assertEqual(long(ss), long(vv))
907 except v:
908 pass
909
910 self.assertRaises(ValueError, long, '123\0')
911 self.assertRaises(ValueError, long, '53', 40)
912 self.assertRaises(TypeError, long, 1, 12)
913
Brett Cannonc3647ac2005-04-26 03:45:26 +0000914 def test_longconversion(self):
915 # Test __long__()
916 class Foo0:
917 def __long__(self):
918 return 42L
919
920 class Foo1(object):
921 def __long__(self):
922 return 42L
923
924 class Foo2(long):
925 def __long__(self):
926 return 42L
927
928 class Foo3(long):
929 def __long__(self):
930 return self
931
932 class Foo4(long):
933 def __long__(self):
934 return 42
935
936 class Foo5(long):
937 def __long__(self):
938 return 42.
939
940 self.assertEqual(long(Foo0()), 42L)
941 self.assertEqual(long(Foo1()), 42L)
942 self.assertEqual(long(Foo2()), 42L)
943 self.assertEqual(long(Foo3()), 0)
944 self.assertEqual(long(Foo4()), 42)
945 self.assertRaises(TypeError, long, Foo5())
946
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 def test_map(self):
948 self.assertEqual(
949 map(None, 'hello world'),
950 ['h','e','l','l','o',' ','w','o','r','l','d']
951 )
952 self.assertEqual(
953 map(None, 'abcd', 'efg'),
954 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
955 )
956 self.assertEqual(
957 map(None, range(10)),
958 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
959 )
960 self.assertEqual(
961 map(lambda x: x*x, range(1,4)),
962 [1, 4, 9]
963 )
964 try:
965 from math import sqrt
966 except ImportError:
967 def sqrt(x):
968 return pow(x, 0.5)
969 self.assertEqual(
970 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
971 [[4.0, 2.0], [9.0, 3.0]]
972 )
973 self.assertEqual(
974 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
975 [10, 4, 6]
976 )
977
978 def plus(*v):
979 accu = 0
980 for i in v: accu = accu + i
981 return accu
982 self.assertEqual(
983 map(plus, [1, 3, 7]),
984 [1, 3, 7]
985 )
986 self.assertEqual(
987 map(plus, [1, 3, 7], [4, 9, 2]),
988 [1+4, 3+9, 7+2]
989 )
990 self.assertEqual(
991 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
992 [1+4+1, 3+9+1, 7+2+0]
993 )
994 self.assertEqual(
995 map(None, Squares(10)),
996 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
997 )
998 self.assertEqual(
999 map(int, Squares(10)),
1000 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1001 )
1002 self.assertEqual(
1003 map(None, Squares(3), Squares(2)),
1004 [(0,0), (1,1), (4,None)]
1005 )
1006 self.assertEqual(
1007 map(max, Squares(3), Squares(2)),
1008 [0, 1, 4]
1009 )
1010 self.assertRaises(TypeError, map)
1011 self.assertRaises(TypeError, map, lambda x: x, 42)
1012 self.assertEqual(map(None, [42]), [42])
1013 class BadSeq:
1014 def __getitem__(self, index):
1015 raise ValueError
1016 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001017 def badfunc(x):
1018 raise RuntimeError
1019 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001020
1021 def test_max(self):
1022 self.assertEqual(max('123123'), '3')
1023 self.assertEqual(max(1, 2, 3), 3)
1024 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1025 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1026
1027 self.assertEqual(max(1, 2L, 3.0), 3.0)
1028 self.assertEqual(max(1L, 2.0, 3), 3)
1029 self.assertEqual(max(1.0, 2, 3L), 3L)
1030
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001031 for stmt in (
1032 "max(key=int)", # no args
1033 "max(1, key=int)", # single arg not iterable
1034 "max(1, 2, keystone=int)", # wrong keyword
1035 "max(1, 2, key=int, abc=int)", # two many keywords
1036 "max(1, 2, key=1)", # keyfunc is not callable
1037 ):
Tim Peters7f061872004-12-07 21:17:46 +00001038 try:
1039 exec(stmt) in globals()
1040 except TypeError:
1041 pass
1042 else:
1043 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001044
1045 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1046 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1047 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1048
1049 data = [random.randrange(200) for i in range(100)]
1050 keys = dict((elem, random.randrange(50)) for elem in data)
1051 f = keys.__getitem__
1052 self.assertEqual(max(data, key=f),
1053 sorted(reversed(data), key=f)[-1])
1054
Walter Dörwald919497e2003-01-19 16:23:59 +00001055 def test_min(self):
1056 self.assertEqual(min('123123'), '1')
1057 self.assertEqual(min(1, 2, 3), 1)
1058 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1059 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1060
1061 self.assertEqual(min(1, 2L, 3.0), 1)
1062 self.assertEqual(min(1L, 2.0, 3), 1L)
1063 self.assertEqual(min(1.0, 2, 3L), 1.0)
1064
1065 self.assertRaises(TypeError, min)
1066 self.assertRaises(TypeError, min, 42)
1067 self.assertRaises(ValueError, min, ())
1068 class BadSeq:
1069 def __getitem__(self, index):
1070 raise ValueError
1071 self.assertRaises(ValueError, min, BadSeq())
1072 class BadNumber:
1073 def __cmp__(self, other):
1074 raise ValueError
1075 self.assertRaises(ValueError, min, (42, BadNumber()))
1076
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001077 for stmt in (
1078 "min(key=int)", # no args
1079 "min(1, key=int)", # single arg not iterable
1080 "min(1, 2, keystone=int)", # wrong keyword
1081 "min(1, 2, key=int, abc=int)", # two many keywords
1082 "min(1, 2, key=1)", # keyfunc is not callable
1083 ):
Tim Peters7f061872004-12-07 21:17:46 +00001084 try:
1085 exec(stmt) in globals()
1086 except TypeError:
1087 pass
1088 else:
1089 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001090
1091 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1092 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1093 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1094
1095 data = [random.randrange(200) for i in range(100)]
1096 keys = dict((elem, random.randrange(50)) for elem in data)
1097 f = keys.__getitem__
1098 self.assertEqual(min(data, key=f),
1099 sorted(data, key=f)[0])
1100
Walter Dörwald919497e2003-01-19 16:23:59 +00001101 def test_oct(self):
1102 self.assertEqual(oct(100), '0144')
1103 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001104 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001105 self.assertEqual(oct(-100L), '-0144L')
1106 self.assertRaises(TypeError, oct, ())
1107
1108 def write_testfile(self):
1109 # NB the first 4 lines are also used to test input and raw_input, below
1110 fp = open(TESTFN, 'w')
1111 try:
1112 fp.write('1+1\n')
1113 fp.write('1+1\n')
1114 fp.write('The quick brown fox jumps over the lazy dog')
1115 fp.write('.\n')
1116 fp.write('Dear John\n')
1117 fp.write('XXX'*100)
1118 fp.write('YYY'*100)
1119 finally:
1120 fp.close()
1121
1122 def test_open(self):
1123 self.write_testfile()
1124 fp = open(TESTFN, 'r')
1125 try:
1126 self.assertEqual(fp.readline(4), '1+1\n')
1127 self.assertEqual(fp.readline(4), '1+1\n')
1128 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1129 self.assertEqual(fp.readline(4), 'Dear')
1130 self.assertEqual(fp.readline(100), ' John\n')
1131 self.assertEqual(fp.read(300), 'XXX'*100)
1132 self.assertEqual(fp.read(1000), 'YYY'*100)
1133 finally:
1134 fp.close()
1135 unlink(TESTFN)
1136
1137 def test_ord(self):
1138 self.assertEqual(ord(' '), 32)
1139 self.assertEqual(ord('A'), 65)
1140 self.assertEqual(ord('a'), 97)
1141 if have_unicode:
1142 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1143 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001144 if have_unicode:
1145 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001146
1147 def test_pow(self):
1148 self.assertEqual(pow(0,0), 1)
1149 self.assertEqual(pow(0,1), 0)
1150 self.assertEqual(pow(1,0), 1)
1151 self.assertEqual(pow(1,1), 1)
1152
1153 self.assertEqual(pow(2,0), 1)
1154 self.assertEqual(pow(2,10), 1024)
1155 self.assertEqual(pow(2,20), 1024*1024)
1156 self.assertEqual(pow(2,30), 1024*1024*1024)
1157
1158 self.assertEqual(pow(-2,0), 1)
1159 self.assertEqual(pow(-2,1), -2)
1160 self.assertEqual(pow(-2,2), 4)
1161 self.assertEqual(pow(-2,3), -8)
1162
1163 self.assertEqual(pow(0L,0), 1)
1164 self.assertEqual(pow(0L,1), 0)
1165 self.assertEqual(pow(1L,0), 1)
1166 self.assertEqual(pow(1L,1), 1)
1167
1168 self.assertEqual(pow(2L,0), 1)
1169 self.assertEqual(pow(2L,10), 1024)
1170 self.assertEqual(pow(2L,20), 1024*1024)
1171 self.assertEqual(pow(2L,30), 1024*1024*1024)
1172
1173 self.assertEqual(pow(-2L,0), 1)
1174 self.assertEqual(pow(-2L,1), -2)
1175 self.assertEqual(pow(-2L,2), 4)
1176 self.assertEqual(pow(-2L,3), -8)
1177
1178 self.assertAlmostEqual(pow(0.,0), 1.)
1179 self.assertAlmostEqual(pow(0.,1), 0.)
1180 self.assertAlmostEqual(pow(1.,0), 1.)
1181 self.assertAlmostEqual(pow(1.,1), 1.)
1182
1183 self.assertAlmostEqual(pow(2.,0), 1.)
1184 self.assertAlmostEqual(pow(2.,10), 1024.)
1185 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1186 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1187
1188 self.assertAlmostEqual(pow(-2.,0), 1.)
1189 self.assertAlmostEqual(pow(-2.,1), -2.)
1190 self.assertAlmostEqual(pow(-2.,2), 4.)
1191 self.assertAlmostEqual(pow(-2.,3), -8.)
1192
1193 for x in 2, 2L, 2.0:
1194 for y in 10, 10L, 10.0:
1195 for z in 1000, 1000L, 1000.0:
1196 if isinstance(x, float) or \
1197 isinstance(y, float) or \
1198 isinstance(z, float):
1199 self.assertRaises(TypeError, pow, x, y, z)
1200 else:
1201 self.assertAlmostEqual(pow(x, y, z), 24.0)
1202
1203 self.assertRaises(TypeError, pow, -1, -2, 3)
1204 self.assertRaises(ValueError, pow, 1, 2, 0)
1205 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1206 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1207 self.assertRaises(ValueError, pow, -342.43, 0.234)
1208
1209 self.assertRaises(TypeError, pow)
1210
1211 def test_range(self):
1212 self.assertEqual(range(3), [0, 1, 2])
1213 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1214 self.assertEqual(range(0), [])
1215 self.assertEqual(range(-3), [])
1216 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1217 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1218
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001219 # Now test range() with longs
1220 self.assertEqual(range(-2**100), [])
1221 self.assertEqual(range(0, -2**100), [])
1222 self.assertEqual(range(0, 2**100, -1), [])
1223 self.assertEqual(range(0, 2**100, -1), [])
1224
1225 a = long(10 * sys.maxint)
1226 b = long(100 * sys.maxint)
1227 c = long(50 * sys.maxint)
1228
1229 self.assertEqual(range(a, a+2), [a, a+1])
1230 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1231 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1232
1233 seq = range(a, b, c)
1234 self.assert_(a in seq)
1235 self.assert_(b not in seq)
1236 self.assertEqual(len(seq), 2)
1237
1238 seq = range(b, a, -c)
1239 self.assert_(b in seq)
1240 self.assert_(a not in seq)
1241 self.assertEqual(len(seq), 2)
1242
1243 seq = range(-a, -b, -c)
1244 self.assert_(-a in seq)
1245 self.assert_(-b not in seq)
1246 self.assertEqual(len(seq), 2)
1247
Walter Dörwald919497e2003-01-19 16:23:59 +00001248 self.assertRaises(TypeError, range)
1249 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1250 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001251 self.assertRaises(ValueError, range, a, a + 1, long(0))
1252
1253 class badzero(int):
1254 def __cmp__(self, other):
1255 raise RuntimeError
1256 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001257
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001258 # Reject floats when it would require PyLongs to represent.
1259 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001260 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001261
Walter Dörwald357981e2003-04-15 18:59:28 +00001262 self.assertRaises(TypeError, range, 0, "spam")
1263 self.assertRaises(TypeError, range, 0, 42, "spam")
1264
1265 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1266 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1267
Walter Dörwald919497e2003-01-19 16:23:59 +00001268 def test_input_and_raw_input(self):
1269 self.write_testfile()
1270 fp = open(TESTFN, 'r')
1271 savestdin = sys.stdin
1272 savestdout = sys.stdout # Eats the echo
1273 try:
1274 sys.stdin = fp
1275 sys.stdout = BitBucket()
1276 self.assertEqual(input(), 2)
1277 self.assertEqual(input('testing\n'), 2)
1278 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1279 self.assertEqual(raw_input('testing\n'), 'Dear John')
1280 sys.stdin = cStringIO.StringIO("NULL\0")
1281 self.assertRaises(TypeError, input, 42, 42)
1282 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1283 self.assertEqual(input(), 'whitespace')
1284 sys.stdin = cStringIO.StringIO()
1285 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001286
1287 # SF 876178: make sure input() respect future options.
1288 sys.stdin = cStringIO.StringIO('1/2')
1289 sys.stdout = cStringIO.StringIO()
1290 exec compile('print input()', 'test_builtin_tmp', 'exec')
1291 sys.stdin.seek(0, 0)
1292 exec compile('from __future__ import division;print input()',
1293 'test_builtin_tmp', 'exec')
1294 sys.stdin.seek(0, 0)
1295 exec compile('print input()', 'test_builtin_tmp', 'exec')
1296 self.assertEqual(sys.stdout.getvalue().splitlines(),
1297 ['0', '0.5', '0'])
1298
Walter Dörwald919497e2003-01-19 16:23:59 +00001299 del sys.stdout
1300 self.assertRaises(RuntimeError, input, 'prompt')
1301 del sys.stdin
1302 self.assertRaises(RuntimeError, input, 'prompt')
1303 finally:
1304 sys.stdin = savestdin
1305 sys.stdout = savestdout
1306 fp.close()
1307 unlink(TESTFN)
1308
1309 def test_reduce(self):
1310 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1311 self.assertEqual(
1312 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1313 ['a','c','d','w']
1314 )
1315 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1316 self.assertEqual(
1317 reduce(lambda x, y: x*y, range(2,21), 1L),
1318 2432902008176640000L
1319 )
1320 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1321 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1322 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1323 self.assertRaises(TypeError, reduce)
1324 self.assertRaises(TypeError, reduce, 42, 42)
1325 self.assertRaises(TypeError, reduce, 42, 42, 42)
1326 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1327 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1328 self.assertRaises(TypeError, reduce, 42, (42, 42))
1329
1330 class BadSeq:
1331 def __getitem__(self, index):
1332 raise ValueError
1333 self.assertRaises(ValueError, reduce, 42, BadSeq())
1334
1335 def test_reload(self):
1336 import marshal
1337 reload(marshal)
1338 import string
1339 reload(string)
1340 ## import sys
1341 ## self.assertRaises(ImportError, reload, sys)
1342
1343 def test_repr(self):
1344 self.assertEqual(repr(''), '\'\'')
1345 self.assertEqual(repr(0), '0')
1346 self.assertEqual(repr(0L), '0L')
1347 self.assertEqual(repr(()), '()')
1348 self.assertEqual(repr([]), '[]')
1349 self.assertEqual(repr({}), '{}')
1350 a = []
1351 a.append(a)
1352 self.assertEqual(repr(a), '[[...]]')
1353 a = {}
1354 a[0] = a
1355 self.assertEqual(repr(a), '{0: {...}}')
1356
1357 def test_round(self):
1358 self.assertEqual(round(0.0), 0.0)
1359 self.assertEqual(round(1.0), 1.0)
1360 self.assertEqual(round(10.0), 10.0)
1361 self.assertEqual(round(1000000000.0), 1000000000.0)
1362 self.assertEqual(round(1e20), 1e20)
1363
1364 self.assertEqual(round(-1.0), -1.0)
1365 self.assertEqual(round(-10.0), -10.0)
1366 self.assertEqual(round(-1000000000.0), -1000000000.0)
1367 self.assertEqual(round(-1e20), -1e20)
1368
1369 self.assertEqual(round(0.1), 0.0)
1370 self.assertEqual(round(1.1), 1.0)
1371 self.assertEqual(round(10.1), 10.0)
1372 self.assertEqual(round(1000000000.1), 1000000000.0)
1373
1374 self.assertEqual(round(-1.1), -1.0)
1375 self.assertEqual(round(-10.1), -10.0)
1376 self.assertEqual(round(-1000000000.1), -1000000000.0)
1377
1378 self.assertEqual(round(0.9), 1.0)
1379 self.assertEqual(round(9.9), 10.0)
1380 self.assertEqual(round(999999999.9), 1000000000.0)
1381
1382 self.assertEqual(round(-0.9), -1.0)
1383 self.assertEqual(round(-9.9), -10.0)
1384 self.assertEqual(round(-999999999.9), -1000000000.0)
1385
1386 self.assertEqual(round(-8.0, -1), -10.0)
1387
1388 self.assertRaises(TypeError, round)
1389
1390 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001391 setattr(sys, 'spam', 1)
1392 self.assertEqual(sys.spam, 1)
1393 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1394 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001395
1396 def test_str(self):
1397 self.assertEqual(str(''), '')
1398 self.assertEqual(str(0), '0')
1399 self.assertEqual(str(0L), '0')
1400 self.assertEqual(str(()), '()')
1401 self.assertEqual(str([]), '[]')
1402 self.assertEqual(str({}), '{}')
1403 a = []
1404 a.append(a)
1405 self.assertEqual(str(a), '[[...]]')
1406 a = {}
1407 a[0] = a
1408 self.assertEqual(str(a), '{0: {...}}')
1409
Alex Martellia70b1912003-04-22 08:12:33 +00001410 def test_sum(self):
1411 self.assertEqual(sum([]), 0)
1412 self.assertEqual(sum(range(2,8)), 27)
1413 self.assertEqual(sum(iter(range(2,8))), 27)
1414 self.assertEqual(sum(Squares(10)), 285)
1415 self.assertEqual(sum(iter(Squares(10))), 285)
1416 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1417
1418 self.assertRaises(TypeError, sum)
1419 self.assertRaises(TypeError, sum, 42)
1420 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1421 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1422 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1423 self.assertRaises(TypeError, sum, [{2:3}])
1424 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1425
1426 class BadSeq:
1427 def __getitem__(self, index):
1428 raise ValueError
1429 self.assertRaises(ValueError, sum, BadSeq())
1430
Walter Dörwald919497e2003-01-19 16:23:59 +00001431 def test_tuple(self):
1432 self.assertEqual(tuple(()), ())
1433 t0_3 = (0, 1, 2, 3)
1434 t0_3_bis = tuple(t0_3)
1435 self.assert_(t0_3 is t0_3_bis)
1436 self.assertEqual(tuple([]), ())
1437 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1438 self.assertEqual(tuple(''), ())
1439 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1440
1441 def test_type(self):
1442 self.assertEqual(type(''), type('123'))
1443 self.assertNotEqual(type(''), type(()))
1444
1445 def test_unichr(self):
1446 if have_unicode:
1447 self.assertEqual(unichr(32), unicode(' '))
1448 self.assertEqual(unichr(65), unicode('A'))
1449 self.assertEqual(unichr(97), unicode('a'))
1450 self.assertEqual(
1451 unichr(sys.maxunicode),
1452 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1453 )
1454 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1455 self.assertRaises(TypeError, unichr)
1456
Guido van Rossumfee7b932005-01-16 00:21:28 +00001457 # We don't want self in vars(), so these are static methods
1458
1459 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001460 def get_vars_f0():
1461 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001462
Guido van Rossumfee7b932005-01-16 00:21:28 +00001463 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001464 def get_vars_f2():
1465 BuiltinTest.get_vars_f0()
1466 a = 1
1467 b = 2
1468 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001469
1470 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001471 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001472 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001473 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001474 self.assertEqual(self.get_vars_f0(), {})
1475 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1476 self.assertRaises(TypeError, vars, 42, 42)
1477 self.assertRaises(TypeError, vars, 42)
1478
1479 def test_zip(self):
1480 a = (1, 2, 3)
1481 b = (4, 5, 6)
1482 t = [(1, 4), (2, 5), (3, 6)]
1483 self.assertEqual(zip(a, b), t)
1484 b = [4, 5, 6]
1485 self.assertEqual(zip(a, b), t)
1486 b = (4, 5, 6, 7)
1487 self.assertEqual(zip(a, b), t)
1488 class I:
1489 def __getitem__(self, i):
1490 if i < 0 or i > 2: raise IndexError
1491 return i + 4
1492 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001493 self.assertEqual(zip(), [])
1494 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001495 self.assertRaises(TypeError, zip, None)
1496 class G:
1497 pass
1498 self.assertRaises(TypeError, zip, a, G())
1499
1500 # Make sure zip doesn't try to allocate a billion elements for the
1501 # result list when one of its arguments doesn't say how long it is.
1502 # A MemoryError is the most likely failure mode.
1503 class SequenceWithoutALength:
1504 def __getitem__(self, i):
1505 if i == 5:
1506 raise IndexError
1507 else:
1508 return i
1509 self.assertEqual(
1510 zip(SequenceWithoutALength(), xrange(2**30)),
1511 list(enumerate(range(5)))
1512 )
1513
1514 class BadSeq:
1515 def __getitem__(self, i):
1516 if i == 5:
1517 raise ValueError
1518 else:
1519 return i
1520 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1521
Raymond Hettinger64958a12003-12-17 20:43:33 +00001522class TestSorted(unittest.TestCase):
1523
1524 def test_basic(self):
1525 data = range(100)
1526 copy = data[:]
1527 random.shuffle(copy)
1528 self.assertEqual(data, sorted(copy))
1529 self.assertNotEqual(data, copy)
1530
1531 data.reverse()
1532 random.shuffle(copy)
1533 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1534 self.assertNotEqual(data, copy)
1535 random.shuffle(copy)
1536 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1537 self.assertNotEqual(data, copy)
1538 random.shuffle(copy)
1539 self.assertEqual(data, sorted(copy, reverse=1))
1540 self.assertNotEqual(data, copy)
1541
1542 def test_inputtypes(self):
1543 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001544 types = [list, tuple]
1545 if have_unicode:
1546 types.insert(0, unicode)
1547 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001548 self.assertEqual(sorted(s), sorted(T(s)))
1549
1550 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001551 types = [set, frozenset, list, tuple, dict.fromkeys]
1552 if have_unicode:
1553 types.insert(0, unicode)
1554 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001555 self.assertEqual(sorted(s), sorted(T(s)))
1556
1557 def test_baddecorator(self):
1558 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1559 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1560
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001561def test_main(verbose=None):
1562 test_classes = (BuiltinTest, TestSorted)
1563
1564 run_unittest(*test_classes)
1565
1566 # verify reference counting
1567 if verbose and hasattr(sys, "gettotalrefcount"):
1568 import gc
1569 counts = [None] * 5
1570 for i in xrange(len(counts)):
1571 run_unittest(*test_classes)
1572 gc.collect()
1573 counts[i] = sys.gettotalrefcount()
1574 print counts
1575
Walter Dörwald919497e2003-01-19 16:23:59 +00001576
1577if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001578 test_main(verbose=True)