blob: dd008745c9ba763a3ef967493441a59474161cb1 [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)
551
Neal Norwitz5898fa22005-11-22 05:17:40 +0000552 def test_float_with_comma(self):
553 # set locale to something that doesn't use '.' for the decimal point
554 try:
555 import locale
556 orig_locale = locale.setlocale(locale.LC_NUMERIC, '')
557 locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
558 except:
559 # if we can't set the locale, just ignore this test
560 return
561
562 try:
563 self.assertEqual(locale.localeconv()['decimal_point'], ',')
564 except:
565 # this test is worthless, just skip it and reset the locale
566 locale.setlocale(locale.LC_NUMERIC, orig_locale)
567 return
568
569 try:
570 self.assertEqual(float(" 3,14 "), 3.14)
571 self.assertEqual(float(" +3,14 "), 3.14)
572 self.assertEqual(float(" -3,14 "), -3.14)
573 self.assertEqual(float(" 0x3.1 "), 3.0625)
574 self.assertEqual(float(" -0x3.p-1 "), -1.5)
575 self.assertEqual(float(" 25.e-1 "), 2.5)
576 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
577 finally:
578 locale.setlocale(locale.LC_NUMERIC, orig_locale)
579
Brett Cannonc3647ac2005-04-26 03:45:26 +0000580 def test_floatconversion(self):
581 # Make sure that calls to __float__() work properly
582 class Foo0:
583 def __float__(self):
584 return 42.
585
586 class Foo1(object):
587 def __float__(self):
588 return 42.
589
590 class Foo2(float):
591 def __float__(self):
592 return 42.
593
594 class Foo3(float):
595 def __new__(cls, value=0.):
596 return float.__new__(cls, 2*value)
597
598 def __float__(self):
599 return self
600
601 class Foo4(float):
602 def __float__(self):
603 return 42
604
605 self.assertAlmostEqual(float(Foo0()), 42.)
606 self.assertAlmostEqual(float(Foo1()), 42.)
607 self.assertAlmostEqual(float(Foo2()), 42.)
608 self.assertAlmostEqual(float(Foo3(21)), 42.)
609 self.assertRaises(TypeError, float, Foo4(42))
610
Walter Dörwald919497e2003-01-19 16:23:59 +0000611 def test_getattr(self):
612 import sys
613 self.assert_(getattr(sys, 'stdout') is sys.stdout)
614 self.assertRaises(TypeError, getattr, sys, 1)
615 self.assertRaises(TypeError, getattr, sys, 1, "foo")
616 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000617 if have_unicode:
618 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000619
620 def test_hasattr(self):
621 import sys
622 self.assert_(hasattr(sys, 'stdout'))
623 self.assertRaises(TypeError, hasattr, sys, 1)
624 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000625 if have_unicode:
626 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000627
628 def test_hash(self):
629 hash(None)
630 self.assertEqual(hash(1), hash(1L))
631 self.assertEqual(hash(1), hash(1.0))
632 hash('spam')
633 if have_unicode:
634 self.assertEqual(hash('spam'), hash(unicode('spam')))
635 hash((0,1,2,3))
636 def f(): pass
637 self.assertRaises(TypeError, hash, [])
638 self.assertRaises(TypeError, hash, {})
639
640 def test_hex(self):
641 self.assertEqual(hex(16), '0x10')
642 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000643 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000644 self.assertEqual(hex(-16L), '-0x10L')
645 self.assertRaises(TypeError, hex, {})
646
647 def test_id(self):
648 id(None)
649 id(1)
650 id(1L)
651 id(1.0)
652 id('spam')
653 id((0,1,2,3))
654 id([0,1,2,3])
655 id({'spam': 1, 'eggs': 2, 'ham': 3})
656
657 # Test input() later, together with raw_input
658
659 def test_int(self):
660 self.assertEqual(int(314), 314)
661 self.assertEqual(int(3.14), 3)
662 self.assertEqual(int(314L), 314)
663 # Check that conversion from float truncates towards zero
664 self.assertEqual(int(-3.14), -3)
665 self.assertEqual(int(3.9), 3)
666 self.assertEqual(int(-3.9), -3)
667 self.assertEqual(int(3.5), 3)
668 self.assertEqual(int(-3.5), -3)
669 # Different base:
670 self.assertEqual(int("10",16), 16L)
671 if have_unicode:
672 self.assertEqual(int(unicode("10"),16), 16L)
673 # Test conversion from strings and various anomalies
674 for s, v in L:
675 for sign in "", "+", "-":
676 for prefix in "", " ", "\t", " \t\t ":
677 ss = prefix + sign + s
678 vv = v
679 if sign == "-" and v is not ValueError:
680 vv = -v
681 try:
682 self.assertEqual(int(ss), vv)
683 except v:
684 pass
685
Walter Dörwald70a6b492004-02-12 17:35:32 +0000686 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000687 self.assertEqual(int(s)+1, -sys.maxint)
688 # should return long
689 int(s[1:])
690
691 # should return long
692 x = int(1e100)
693 self.assert_(isinstance(x, long))
694 x = int(-1e100)
695 self.assert_(isinstance(x, long))
696
697
698 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
699 # Worked by accident in Windows release build, but failed in debug build.
700 # Failed in all Linux builds.
701 x = -1-sys.maxint
702 self.assertEqual(x >> 1, x//2)
703
704 self.assertRaises(ValueError, int, '123\0')
705 self.assertRaises(ValueError, int, '53', 40)
706
707 x = int('1' * 600)
708 self.assert_(isinstance(x, long))
709
710 if have_unicode:
711 x = int(unichr(0x661) * 600)
712 self.assert_(isinstance(x, long))
713
714 self.assertRaises(TypeError, int, 1, 12)
715
716 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000717 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000718
Brett Cannonc3647ac2005-04-26 03:45:26 +0000719 def test_intconversion(self):
720 # Test __int__()
721 class Foo0:
722 def __int__(self):
723 return 42
724
725 class Foo1(object):
726 def __int__(self):
727 return 42
728
729 class Foo2(int):
730 def __int__(self):
731 return 42
732
733 class Foo3(int):
734 def __int__(self):
735 return self
736
737 class Foo4(int):
738 def __int__(self):
739 return 42L
740
741 class Foo5(int):
742 def __int__(self):
743 return 42.
744
745 self.assertEqual(int(Foo0()), 42)
746 self.assertEqual(int(Foo1()), 42)
747 self.assertEqual(int(Foo2()), 42)
748 self.assertEqual(int(Foo3()), 0)
749 self.assertEqual(int(Foo4()), 42L)
750 self.assertRaises(TypeError, int, Foo5())
751
Walter Dörwald919497e2003-01-19 16:23:59 +0000752 def test_intern(self):
753 self.assertRaises(TypeError, intern)
754 s = "never interned before"
755 self.assert_(intern(s) is s)
756 s2 = s.swapcase().swapcase()
757 self.assert_(intern(s2) is s)
758
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000759 # Subclasses of string can't be interned, because they
760 # provide too much opportunity for insane things to happen.
761 # We don't want them in the interned dict and if they aren't
762 # actually interned, we don't want to create the appearance
763 # that they are by allowing intern() to succeeed.
764 class S(str):
765 def __hash__(self):
766 return 123
767
768 self.assertRaises(TypeError, intern, S("abc"))
769
770 # It's still safe to pass these strings to routines that
771 # call intern internally, e.g. PyObject_SetAttr().
772 s = S("abc")
773 setattr(s, s, s)
774 self.assertEqual(getattr(s, s), s)
775
Walter Dörwald919497e2003-01-19 16:23:59 +0000776 def test_iter(self):
777 self.assertRaises(TypeError, iter)
778 self.assertRaises(TypeError, iter, 42, 42)
779 lists = [("1", "2"), ["1", "2"], "12"]
780 if have_unicode:
781 lists.append(unicode("12"))
782 for l in lists:
783 i = iter(l)
784 self.assertEqual(i.next(), '1')
785 self.assertEqual(i.next(), '2')
786 self.assertRaises(StopIteration, i.next)
787
788 def test_isinstance(self):
789 class C:
790 pass
791 class D(C):
792 pass
793 class E:
794 pass
795 c = C()
796 d = D()
797 e = E()
798 self.assert_(isinstance(c, C))
799 self.assert_(isinstance(d, C))
800 self.assert_(not isinstance(e, C))
801 self.assert_(not isinstance(c, D))
802 self.assert_(not isinstance('foo', E))
803 self.assertRaises(TypeError, isinstance, E, 'foo')
804 self.assertRaises(TypeError, isinstance)
805
806 def test_issubclass(self):
807 class C:
808 pass
809 class D(C):
810 pass
811 class E:
812 pass
813 c = C()
814 d = D()
815 e = E()
816 self.assert_(issubclass(D, C))
817 self.assert_(issubclass(C, C))
818 self.assert_(not issubclass(C, D))
819 self.assertRaises(TypeError, issubclass, 'foo', E)
820 self.assertRaises(TypeError, issubclass, E, 'foo')
821 self.assertRaises(TypeError, issubclass)
822
823 def test_len(self):
824 self.assertEqual(len('123'), 3)
825 self.assertEqual(len(()), 0)
826 self.assertEqual(len((1, 2, 3, 4)), 4)
827 self.assertEqual(len([1, 2, 3, 4]), 4)
828 self.assertEqual(len({}), 0)
829 self.assertEqual(len({'a':1, 'b': 2}), 2)
830 class BadSeq:
831 def __len__(self):
832 raise ValueError
833 self.assertRaises(ValueError, len, BadSeq())
834
835 def test_list(self):
836 self.assertEqual(list([]), [])
837 l0_3 = [0, 1, 2, 3]
838 l0_3_bis = list(l0_3)
839 self.assertEqual(l0_3, l0_3_bis)
840 self.assert_(l0_3 is not l0_3_bis)
841 self.assertEqual(list(()), [])
842 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
843 self.assertEqual(list(''), [])
844 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
845
846 if sys.maxint == 0x7fffffff:
847 # This test can currently only work on 32-bit machines.
848 # XXX If/when PySequence_Length() returns a ssize_t, it should be
849 # XXX re-enabled.
850 # Verify clearing of bug #556025.
851 # This assumes that the max data size (sys.maxint) == max
852 # address size this also assumes that the address size is at
853 # least 4 bytes with 8 byte addresses, the bug is not well
854 # tested
855 #
856 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
857 # earlier due to a newlib bug. See the following mailing list
858 # thread for the details:
859
860 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
861 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
862
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000863 # This code used to segfault in Py2.4a3
864 x = []
865 x.extend(-y for y in x)
866 self.assertEqual(x, [])
867
Walter Dörwald919497e2003-01-19 16:23:59 +0000868 def test_long(self):
869 self.assertEqual(long(314), 314L)
870 self.assertEqual(long(3.14), 3L)
871 self.assertEqual(long(314L), 314L)
872 # Check that conversion from float truncates towards zero
873 self.assertEqual(long(-3.14), -3L)
874 self.assertEqual(long(3.9), 3L)
875 self.assertEqual(long(-3.9), -3L)
876 self.assertEqual(long(3.5), 3L)
877 self.assertEqual(long(-3.5), -3L)
878 self.assertEqual(long("-3"), -3L)
879 if have_unicode:
880 self.assertEqual(long(unicode("-3")), -3L)
881 # Different base:
882 self.assertEqual(long("10",16), 16L)
883 if have_unicode:
884 self.assertEqual(long(unicode("10"),16), 16L)
885 # Check conversions from string (same test set as for int(), and then some)
886 LL = [
887 ('1' + '0'*20, 10L**20),
888 ('1' + '0'*100, 10L**100)
889 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000890 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000891 if have_unicode:
892 L2 += [
893 (unicode('1') + unicode('0')*20, 10L**20),
894 (unicode('1') + unicode('0')*100, 10L**100),
895 ]
896 for s, v in L2 + LL:
897 for sign in "", "+", "-":
898 for prefix in "", " ", "\t", " \t\t ":
899 ss = prefix + sign + s
900 vv = v
901 if sign == "-" and v is not ValueError:
902 vv = -v
903 try:
904 self.assertEqual(long(ss), long(vv))
905 except v:
906 pass
907
908 self.assertRaises(ValueError, long, '123\0')
909 self.assertRaises(ValueError, long, '53', 40)
910 self.assertRaises(TypeError, long, 1, 12)
911
Brett Cannonc3647ac2005-04-26 03:45:26 +0000912 def test_longconversion(self):
913 # Test __long__()
914 class Foo0:
915 def __long__(self):
916 return 42L
917
918 class Foo1(object):
919 def __long__(self):
920 return 42L
921
922 class Foo2(long):
923 def __long__(self):
924 return 42L
925
926 class Foo3(long):
927 def __long__(self):
928 return self
929
930 class Foo4(long):
931 def __long__(self):
932 return 42
933
934 class Foo5(long):
935 def __long__(self):
936 return 42.
937
938 self.assertEqual(long(Foo0()), 42L)
939 self.assertEqual(long(Foo1()), 42L)
940 self.assertEqual(long(Foo2()), 42L)
941 self.assertEqual(long(Foo3()), 0)
942 self.assertEqual(long(Foo4()), 42)
943 self.assertRaises(TypeError, long, Foo5())
944
Walter Dörwald919497e2003-01-19 16:23:59 +0000945 def test_map(self):
946 self.assertEqual(
947 map(None, 'hello world'),
948 ['h','e','l','l','o',' ','w','o','r','l','d']
949 )
950 self.assertEqual(
951 map(None, 'abcd', 'efg'),
952 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
953 )
954 self.assertEqual(
955 map(None, range(10)),
956 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
957 )
958 self.assertEqual(
959 map(lambda x: x*x, range(1,4)),
960 [1, 4, 9]
961 )
962 try:
963 from math import sqrt
964 except ImportError:
965 def sqrt(x):
966 return pow(x, 0.5)
967 self.assertEqual(
968 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
969 [[4.0, 2.0], [9.0, 3.0]]
970 )
971 self.assertEqual(
972 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
973 [10, 4, 6]
974 )
975
976 def plus(*v):
977 accu = 0
978 for i in v: accu = accu + i
979 return accu
980 self.assertEqual(
981 map(plus, [1, 3, 7]),
982 [1, 3, 7]
983 )
984 self.assertEqual(
985 map(plus, [1, 3, 7], [4, 9, 2]),
986 [1+4, 3+9, 7+2]
987 )
988 self.assertEqual(
989 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
990 [1+4+1, 3+9+1, 7+2+0]
991 )
992 self.assertEqual(
993 map(None, Squares(10)),
994 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
995 )
996 self.assertEqual(
997 map(int, Squares(10)),
998 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
999 )
1000 self.assertEqual(
1001 map(None, Squares(3), Squares(2)),
1002 [(0,0), (1,1), (4,None)]
1003 )
1004 self.assertEqual(
1005 map(max, Squares(3), Squares(2)),
1006 [0, 1, 4]
1007 )
1008 self.assertRaises(TypeError, map)
1009 self.assertRaises(TypeError, map, lambda x: x, 42)
1010 self.assertEqual(map(None, [42]), [42])
1011 class BadSeq:
1012 def __getitem__(self, index):
1013 raise ValueError
1014 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001015 def badfunc(x):
1016 raise RuntimeError
1017 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001018
1019 def test_max(self):
1020 self.assertEqual(max('123123'), '3')
1021 self.assertEqual(max(1, 2, 3), 3)
1022 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1023 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1024
1025 self.assertEqual(max(1, 2L, 3.0), 3.0)
1026 self.assertEqual(max(1L, 2.0, 3), 3)
1027 self.assertEqual(max(1.0, 2, 3L), 3L)
1028
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001029 for stmt in (
1030 "max(key=int)", # no args
1031 "max(1, key=int)", # single arg not iterable
1032 "max(1, 2, keystone=int)", # wrong keyword
1033 "max(1, 2, key=int, abc=int)", # two many keywords
1034 "max(1, 2, key=1)", # keyfunc is not callable
1035 ):
Tim Peters7f061872004-12-07 21:17:46 +00001036 try:
1037 exec(stmt) in globals()
1038 except TypeError:
1039 pass
1040 else:
1041 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001042
1043 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1044 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1045 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1046
1047 data = [random.randrange(200) for i in range(100)]
1048 keys = dict((elem, random.randrange(50)) for elem in data)
1049 f = keys.__getitem__
1050 self.assertEqual(max(data, key=f),
1051 sorted(reversed(data), key=f)[-1])
1052
Walter Dörwald919497e2003-01-19 16:23:59 +00001053 def test_min(self):
1054 self.assertEqual(min('123123'), '1')
1055 self.assertEqual(min(1, 2, 3), 1)
1056 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1057 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1058
1059 self.assertEqual(min(1, 2L, 3.0), 1)
1060 self.assertEqual(min(1L, 2.0, 3), 1L)
1061 self.assertEqual(min(1.0, 2, 3L), 1.0)
1062
1063 self.assertRaises(TypeError, min)
1064 self.assertRaises(TypeError, min, 42)
1065 self.assertRaises(ValueError, min, ())
1066 class BadSeq:
1067 def __getitem__(self, index):
1068 raise ValueError
1069 self.assertRaises(ValueError, min, BadSeq())
1070 class BadNumber:
1071 def __cmp__(self, other):
1072 raise ValueError
1073 self.assertRaises(ValueError, min, (42, BadNumber()))
1074
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001075 for stmt in (
1076 "min(key=int)", # no args
1077 "min(1, key=int)", # single arg not iterable
1078 "min(1, 2, keystone=int)", # wrong keyword
1079 "min(1, 2, key=int, abc=int)", # two many keywords
1080 "min(1, 2, key=1)", # keyfunc is not callable
1081 ):
Tim Peters7f061872004-12-07 21:17:46 +00001082 try:
1083 exec(stmt) in globals()
1084 except TypeError:
1085 pass
1086 else:
1087 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001088
1089 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1090 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1091 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1092
1093 data = [random.randrange(200) for i in range(100)]
1094 keys = dict((elem, random.randrange(50)) for elem in data)
1095 f = keys.__getitem__
1096 self.assertEqual(min(data, key=f),
1097 sorted(data, key=f)[0])
1098
Walter Dörwald919497e2003-01-19 16:23:59 +00001099 def test_oct(self):
1100 self.assertEqual(oct(100), '0144')
1101 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001102 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001103 self.assertEqual(oct(-100L), '-0144L')
1104 self.assertRaises(TypeError, oct, ())
1105
1106 def write_testfile(self):
1107 # NB the first 4 lines are also used to test input and raw_input, below
1108 fp = open(TESTFN, 'w')
1109 try:
1110 fp.write('1+1\n')
1111 fp.write('1+1\n')
1112 fp.write('The quick brown fox jumps over the lazy dog')
1113 fp.write('.\n')
1114 fp.write('Dear John\n')
1115 fp.write('XXX'*100)
1116 fp.write('YYY'*100)
1117 finally:
1118 fp.close()
1119
1120 def test_open(self):
1121 self.write_testfile()
1122 fp = open(TESTFN, 'r')
1123 try:
1124 self.assertEqual(fp.readline(4), '1+1\n')
1125 self.assertEqual(fp.readline(4), '1+1\n')
1126 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1127 self.assertEqual(fp.readline(4), 'Dear')
1128 self.assertEqual(fp.readline(100), ' John\n')
1129 self.assertEqual(fp.read(300), 'XXX'*100)
1130 self.assertEqual(fp.read(1000), 'YYY'*100)
1131 finally:
1132 fp.close()
1133 unlink(TESTFN)
1134
1135 def test_ord(self):
1136 self.assertEqual(ord(' '), 32)
1137 self.assertEqual(ord('A'), 65)
1138 self.assertEqual(ord('a'), 97)
1139 if have_unicode:
1140 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1141 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001142 if have_unicode:
1143 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001144
1145 def test_pow(self):
1146 self.assertEqual(pow(0,0), 1)
1147 self.assertEqual(pow(0,1), 0)
1148 self.assertEqual(pow(1,0), 1)
1149 self.assertEqual(pow(1,1), 1)
1150
1151 self.assertEqual(pow(2,0), 1)
1152 self.assertEqual(pow(2,10), 1024)
1153 self.assertEqual(pow(2,20), 1024*1024)
1154 self.assertEqual(pow(2,30), 1024*1024*1024)
1155
1156 self.assertEqual(pow(-2,0), 1)
1157 self.assertEqual(pow(-2,1), -2)
1158 self.assertEqual(pow(-2,2), 4)
1159 self.assertEqual(pow(-2,3), -8)
1160
1161 self.assertEqual(pow(0L,0), 1)
1162 self.assertEqual(pow(0L,1), 0)
1163 self.assertEqual(pow(1L,0), 1)
1164 self.assertEqual(pow(1L,1), 1)
1165
1166 self.assertEqual(pow(2L,0), 1)
1167 self.assertEqual(pow(2L,10), 1024)
1168 self.assertEqual(pow(2L,20), 1024*1024)
1169 self.assertEqual(pow(2L,30), 1024*1024*1024)
1170
1171 self.assertEqual(pow(-2L,0), 1)
1172 self.assertEqual(pow(-2L,1), -2)
1173 self.assertEqual(pow(-2L,2), 4)
1174 self.assertEqual(pow(-2L,3), -8)
1175
1176 self.assertAlmostEqual(pow(0.,0), 1.)
1177 self.assertAlmostEqual(pow(0.,1), 0.)
1178 self.assertAlmostEqual(pow(1.,0), 1.)
1179 self.assertAlmostEqual(pow(1.,1), 1.)
1180
1181 self.assertAlmostEqual(pow(2.,0), 1.)
1182 self.assertAlmostEqual(pow(2.,10), 1024.)
1183 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1184 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1185
1186 self.assertAlmostEqual(pow(-2.,0), 1.)
1187 self.assertAlmostEqual(pow(-2.,1), -2.)
1188 self.assertAlmostEqual(pow(-2.,2), 4.)
1189 self.assertAlmostEqual(pow(-2.,3), -8.)
1190
1191 for x in 2, 2L, 2.0:
1192 for y in 10, 10L, 10.0:
1193 for z in 1000, 1000L, 1000.0:
1194 if isinstance(x, float) or \
1195 isinstance(y, float) or \
1196 isinstance(z, float):
1197 self.assertRaises(TypeError, pow, x, y, z)
1198 else:
1199 self.assertAlmostEqual(pow(x, y, z), 24.0)
1200
1201 self.assertRaises(TypeError, pow, -1, -2, 3)
1202 self.assertRaises(ValueError, pow, 1, 2, 0)
1203 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1204 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1205 self.assertRaises(ValueError, pow, -342.43, 0.234)
1206
1207 self.assertRaises(TypeError, pow)
1208
1209 def test_range(self):
1210 self.assertEqual(range(3), [0, 1, 2])
1211 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1212 self.assertEqual(range(0), [])
1213 self.assertEqual(range(-3), [])
1214 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1215 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1216
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001217 # Now test range() with longs
1218 self.assertEqual(range(-2**100), [])
1219 self.assertEqual(range(0, -2**100), [])
1220 self.assertEqual(range(0, 2**100, -1), [])
1221 self.assertEqual(range(0, 2**100, -1), [])
1222
1223 a = long(10 * sys.maxint)
1224 b = long(100 * sys.maxint)
1225 c = long(50 * sys.maxint)
1226
1227 self.assertEqual(range(a, a+2), [a, a+1])
1228 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1229 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1230
1231 seq = range(a, b, c)
1232 self.assert_(a in seq)
1233 self.assert_(b not in seq)
1234 self.assertEqual(len(seq), 2)
1235
1236 seq = range(b, a, -c)
1237 self.assert_(b in seq)
1238 self.assert_(a not in seq)
1239 self.assertEqual(len(seq), 2)
1240
1241 seq = range(-a, -b, -c)
1242 self.assert_(-a in seq)
1243 self.assert_(-b not in seq)
1244 self.assertEqual(len(seq), 2)
1245
Walter Dörwald919497e2003-01-19 16:23:59 +00001246 self.assertRaises(TypeError, range)
1247 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1248 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001249 self.assertRaises(ValueError, range, a, a + 1, long(0))
1250
1251 class badzero(int):
1252 def __cmp__(self, other):
1253 raise RuntimeError
1254 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001255
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001256 # Reject floats when it would require PyLongs to represent.
1257 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001258 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001259
Walter Dörwald357981e2003-04-15 18:59:28 +00001260 self.assertRaises(TypeError, range, 0, "spam")
1261 self.assertRaises(TypeError, range, 0, 42, "spam")
1262
1263 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1264 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1265
Walter Dörwald919497e2003-01-19 16:23:59 +00001266 def test_input_and_raw_input(self):
1267 self.write_testfile()
1268 fp = open(TESTFN, 'r')
1269 savestdin = sys.stdin
1270 savestdout = sys.stdout # Eats the echo
1271 try:
1272 sys.stdin = fp
1273 sys.stdout = BitBucket()
1274 self.assertEqual(input(), 2)
1275 self.assertEqual(input('testing\n'), 2)
1276 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1277 self.assertEqual(raw_input('testing\n'), 'Dear John')
1278 sys.stdin = cStringIO.StringIO("NULL\0")
1279 self.assertRaises(TypeError, input, 42, 42)
1280 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1281 self.assertEqual(input(), 'whitespace')
1282 sys.stdin = cStringIO.StringIO()
1283 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001284
1285 # SF 876178: make sure input() respect future options.
1286 sys.stdin = cStringIO.StringIO('1/2')
1287 sys.stdout = cStringIO.StringIO()
1288 exec compile('print input()', 'test_builtin_tmp', 'exec')
1289 sys.stdin.seek(0, 0)
1290 exec compile('from __future__ import division;print input()',
1291 'test_builtin_tmp', 'exec')
1292 sys.stdin.seek(0, 0)
1293 exec compile('print input()', 'test_builtin_tmp', 'exec')
1294 self.assertEqual(sys.stdout.getvalue().splitlines(),
1295 ['0', '0.5', '0'])
1296
Walter Dörwald919497e2003-01-19 16:23:59 +00001297 del sys.stdout
1298 self.assertRaises(RuntimeError, input, 'prompt')
1299 del sys.stdin
1300 self.assertRaises(RuntimeError, input, 'prompt')
1301 finally:
1302 sys.stdin = savestdin
1303 sys.stdout = savestdout
1304 fp.close()
1305 unlink(TESTFN)
1306
1307 def test_reduce(self):
1308 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1309 self.assertEqual(
1310 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1311 ['a','c','d','w']
1312 )
1313 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1314 self.assertEqual(
1315 reduce(lambda x, y: x*y, range(2,21), 1L),
1316 2432902008176640000L
1317 )
1318 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1319 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1320 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1321 self.assertRaises(TypeError, reduce)
1322 self.assertRaises(TypeError, reduce, 42, 42)
1323 self.assertRaises(TypeError, reduce, 42, 42, 42)
1324 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1325 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1326 self.assertRaises(TypeError, reduce, 42, (42, 42))
1327
1328 class BadSeq:
1329 def __getitem__(self, index):
1330 raise ValueError
1331 self.assertRaises(ValueError, reduce, 42, BadSeq())
1332
1333 def test_reload(self):
1334 import marshal
1335 reload(marshal)
1336 import string
1337 reload(string)
1338 ## import sys
1339 ## self.assertRaises(ImportError, reload, sys)
1340
1341 def test_repr(self):
1342 self.assertEqual(repr(''), '\'\'')
1343 self.assertEqual(repr(0), '0')
1344 self.assertEqual(repr(0L), '0L')
1345 self.assertEqual(repr(()), '()')
1346 self.assertEqual(repr([]), '[]')
1347 self.assertEqual(repr({}), '{}')
1348 a = []
1349 a.append(a)
1350 self.assertEqual(repr(a), '[[...]]')
1351 a = {}
1352 a[0] = a
1353 self.assertEqual(repr(a), '{0: {...}}')
1354
1355 def test_round(self):
1356 self.assertEqual(round(0.0), 0.0)
1357 self.assertEqual(round(1.0), 1.0)
1358 self.assertEqual(round(10.0), 10.0)
1359 self.assertEqual(round(1000000000.0), 1000000000.0)
1360 self.assertEqual(round(1e20), 1e20)
1361
1362 self.assertEqual(round(-1.0), -1.0)
1363 self.assertEqual(round(-10.0), -10.0)
1364 self.assertEqual(round(-1000000000.0), -1000000000.0)
1365 self.assertEqual(round(-1e20), -1e20)
1366
1367 self.assertEqual(round(0.1), 0.0)
1368 self.assertEqual(round(1.1), 1.0)
1369 self.assertEqual(round(10.1), 10.0)
1370 self.assertEqual(round(1000000000.1), 1000000000.0)
1371
1372 self.assertEqual(round(-1.1), -1.0)
1373 self.assertEqual(round(-10.1), -10.0)
1374 self.assertEqual(round(-1000000000.1), -1000000000.0)
1375
1376 self.assertEqual(round(0.9), 1.0)
1377 self.assertEqual(round(9.9), 10.0)
1378 self.assertEqual(round(999999999.9), 1000000000.0)
1379
1380 self.assertEqual(round(-0.9), -1.0)
1381 self.assertEqual(round(-9.9), -10.0)
1382 self.assertEqual(round(-999999999.9), -1000000000.0)
1383
1384 self.assertEqual(round(-8.0, -1), -10.0)
1385
1386 self.assertRaises(TypeError, round)
1387
1388 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001389 setattr(sys, 'spam', 1)
1390 self.assertEqual(sys.spam, 1)
1391 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1392 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001393
1394 def test_str(self):
1395 self.assertEqual(str(''), '')
1396 self.assertEqual(str(0), '0')
1397 self.assertEqual(str(0L), '0')
1398 self.assertEqual(str(()), '()')
1399 self.assertEqual(str([]), '[]')
1400 self.assertEqual(str({}), '{}')
1401 a = []
1402 a.append(a)
1403 self.assertEqual(str(a), '[[...]]')
1404 a = {}
1405 a[0] = a
1406 self.assertEqual(str(a), '{0: {...}}')
1407
Alex Martellia70b1912003-04-22 08:12:33 +00001408 def test_sum(self):
1409 self.assertEqual(sum([]), 0)
1410 self.assertEqual(sum(range(2,8)), 27)
1411 self.assertEqual(sum(iter(range(2,8))), 27)
1412 self.assertEqual(sum(Squares(10)), 285)
1413 self.assertEqual(sum(iter(Squares(10))), 285)
1414 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1415
1416 self.assertRaises(TypeError, sum)
1417 self.assertRaises(TypeError, sum, 42)
1418 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1419 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1420 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1421 self.assertRaises(TypeError, sum, [{2:3}])
1422 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1423
1424 class BadSeq:
1425 def __getitem__(self, index):
1426 raise ValueError
1427 self.assertRaises(ValueError, sum, BadSeq())
1428
Walter Dörwald919497e2003-01-19 16:23:59 +00001429 def test_tuple(self):
1430 self.assertEqual(tuple(()), ())
1431 t0_3 = (0, 1, 2, 3)
1432 t0_3_bis = tuple(t0_3)
1433 self.assert_(t0_3 is t0_3_bis)
1434 self.assertEqual(tuple([]), ())
1435 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1436 self.assertEqual(tuple(''), ())
1437 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1438
1439 def test_type(self):
1440 self.assertEqual(type(''), type('123'))
1441 self.assertNotEqual(type(''), type(()))
1442
1443 def test_unichr(self):
1444 if have_unicode:
1445 self.assertEqual(unichr(32), unicode(' '))
1446 self.assertEqual(unichr(65), unicode('A'))
1447 self.assertEqual(unichr(97), unicode('a'))
1448 self.assertEqual(
1449 unichr(sys.maxunicode),
1450 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1451 )
1452 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1453 self.assertRaises(TypeError, unichr)
1454
Guido van Rossumfee7b932005-01-16 00:21:28 +00001455 # We don't want self in vars(), so these are static methods
1456
1457 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001458 def get_vars_f0():
1459 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001460
Guido van Rossumfee7b932005-01-16 00:21:28 +00001461 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001462 def get_vars_f2():
1463 BuiltinTest.get_vars_f0()
1464 a = 1
1465 b = 2
1466 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001467
1468 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001469 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001470 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001471 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001472 self.assertEqual(self.get_vars_f0(), {})
1473 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1474 self.assertRaises(TypeError, vars, 42, 42)
1475 self.assertRaises(TypeError, vars, 42)
1476
1477 def test_zip(self):
1478 a = (1, 2, 3)
1479 b = (4, 5, 6)
1480 t = [(1, 4), (2, 5), (3, 6)]
1481 self.assertEqual(zip(a, b), t)
1482 b = [4, 5, 6]
1483 self.assertEqual(zip(a, b), t)
1484 b = (4, 5, 6, 7)
1485 self.assertEqual(zip(a, b), t)
1486 class I:
1487 def __getitem__(self, i):
1488 if i < 0 or i > 2: raise IndexError
1489 return i + 4
1490 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001491 self.assertEqual(zip(), [])
1492 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001493 self.assertRaises(TypeError, zip, None)
1494 class G:
1495 pass
1496 self.assertRaises(TypeError, zip, a, G())
1497
1498 # Make sure zip doesn't try to allocate a billion elements for the
1499 # result list when one of its arguments doesn't say how long it is.
1500 # A MemoryError is the most likely failure mode.
1501 class SequenceWithoutALength:
1502 def __getitem__(self, i):
1503 if i == 5:
1504 raise IndexError
1505 else:
1506 return i
1507 self.assertEqual(
1508 zip(SequenceWithoutALength(), xrange(2**30)),
1509 list(enumerate(range(5)))
1510 )
1511
1512 class BadSeq:
1513 def __getitem__(self, i):
1514 if i == 5:
1515 raise ValueError
1516 else:
1517 return i
1518 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1519
Raymond Hettinger64958a12003-12-17 20:43:33 +00001520class TestSorted(unittest.TestCase):
1521
1522 def test_basic(self):
1523 data = range(100)
1524 copy = data[:]
1525 random.shuffle(copy)
1526 self.assertEqual(data, sorted(copy))
1527 self.assertNotEqual(data, copy)
1528
1529 data.reverse()
1530 random.shuffle(copy)
1531 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1532 self.assertNotEqual(data, copy)
1533 random.shuffle(copy)
1534 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1535 self.assertNotEqual(data, copy)
1536 random.shuffle(copy)
1537 self.assertEqual(data, sorted(copy, reverse=1))
1538 self.assertNotEqual(data, copy)
1539
1540 def test_inputtypes(self):
1541 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001542 types = [list, tuple]
1543 if have_unicode:
1544 types.insert(0, unicode)
1545 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001546 self.assertEqual(sorted(s), sorted(T(s)))
1547
1548 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001549 types = [set, frozenset, list, tuple, dict.fromkeys]
1550 if have_unicode:
1551 types.insert(0, unicode)
1552 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001553 self.assertEqual(sorted(s), sorted(T(s)))
1554
1555 def test_baddecorator(self):
1556 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1557 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1558
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001559def test_main(verbose=None):
1560 test_classes = (BuiltinTest, TestSorted)
1561
1562 run_unittest(*test_classes)
1563
1564 # verify reference counting
1565 if verbose and hasattr(sys, "gettotalrefcount"):
1566 import gc
1567 counts = [None] * 5
1568 for i in xrange(len(counts)):
1569 run_unittest(*test_classes)
1570 gc.collect()
1571 counts[i] = sys.gettotalrefcount()
1572 print counts
1573
Walter Dörwald919497e2003-01-19 16:23:59 +00001574
1575if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001576 test_main(verbose=True)